欢迎来到Java学习网!
设为首页 | 加入收藏
当前位置: 首页 > 编程开发 > C语言 >

  用51操作和检测PS2键盘,接收数据已经搞定了,可是发送数据却出错,不知道怎么回事。给它的命令和它所执行的完全不同,请高手指教下,到底是哪里错了,还是没错,电路接得不对??接收函数是这样的。
  void send(uchar Data)
  {
  uchar i,high=0;
  EA=0;
  EX0=0;//关闭中断
  CLK=0;
  delay10us(11);
  DATA=0;
  delay10us(2);
  CLK=1;
  while(CLK==1);
  //开始发送八位数据
  for(i=0;i<=7;i++)
  {
  if(Data & 0x01)
  {
  DATA=1;
  high++;
  }
  DATA=(Data>>1);
  while(CLK==0);
  while(CLK==1);
  }
  if(high%2==0) DATA=1; //设置奇校验位
  else DATA=0;
  while(CLK==0);
  while(CLK==1);
  DATA=1;
  while(DATA==1);
  while(CLK==1);
  while(DATA==0);
  while(CLK==0);
  EA=1;
  EX0=1;//写数据程序结束后开中断
  }

  全部程序是这样的:
  #include <reg52.H>
  #include <intrins.H>
  #include <head.h>
  #define uchar unsigned char
  #define uint unsigned int
  #define LCD_DATA P2 //数据口
  sbit RS = P1^5; //并行的指令/数据选择信号, H数据, L命令
  sbit RW = P1^7; //并行读写选择信号, H读, L写
  sbit E = P1^6; //并行使能端, H有效, L无效
  sbit PSB = P1^1; //并/串接口选择, H并,L串
  sbit RET = P1^4; //复位, L有效
  sbit DATA=P0^2;
  sbit CLK=P3^2;
  uchar count,ASCII=65,Data;
  void trains(uchar Code);
  void send (uchar Data);
  //检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
  bit checkBusy()
  {
  bit busy;
  RS = 0;
  RW = 1;
  E = 1;
  delayUs();
  busy = (bit)(LCD_DATA&0x80);
  E = 0;
  return busy;
  }
  //等待LCD到空闲
  void wait()
  {
  while(checkBusy());
  }
  //写命令
  void writeCmd(uchar cmd)
  {
  wait();
  RS = 0;
  RW = 0;
  E = 0;
  delayUs();
  LCD_DATA = cmd;
  delayUs();
  E = 1;
  delayUs();
  E = 0;
  }

  //写数据
  void writeData(uchar dat)
  {
  wait();
  RS = 1;
  RW = 0;
  E = 0;
  delayUs();
  LCD_DATA = dat;
  delayUs();
  E = 1;
  delayUs();
  E = 0;
  }
  //初始化LCD
  void init()
  {
  PSB = 1; //并口方式
  writeCmd(0x30); //基本指令, 扩充指令为34H
  delayMs(10);
  writeCmd(0x0c); //显示开, 关光标
  writeCmd(0x01); //清屏
  delayMs(10);
  }
  void init2()
  {
  PSB = 1; //并口方式
  RET=0; //复位
  delayUs(); //延时
  RET=1; //复位置高
  writeCmd(0x36);
  delayMs(10);
  writeCmd(0x3E);
  delayMs(10);
  writeCmd(0x01); //清屏
  delayMs(10);
  }
  void setPosition(uchar x, uchar y)
  {
  uchar p;
  switch(x%4)
  {
  case 0: p = 0x80; break; //第一行开始地址

  case 1: p = 0x90; break; //第二行
  case 2: p = 0x88; break; //第三行
  case 3: p = 0x98; break; //第四行
  }
  p += y;
  writeCmd(p);
  }
  void writeString(uchar * str)
  {
  uchar i = 0;
  while(str[i] != '\0')
  {
  writeData(str[i++]);
  }
  }


  void DisplayGraphic(unsigned char code *adder)
  {
  int i,j;
  //*******显示上半屏内容设置
  for(i=0;i<32;i++) //
  {
  writeCmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
  writeCmd(0x80); //SET 水平地址 HORIZONTAL ADD
  for(j=0;j<16;j++)
  {
  writeData(*adder);
  adder++;
  }
  }
  //*******显示下半屏内容设置
  for(i=0;i<32;i++) //
  {
  writeCmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
  writeCmd(0x88); //SET 水平地址 HORIZONTAL ADD
  for(j=0;j<16;j++)
  {
  writeData(0xff);
  adder++;
  }
  }
  }
  void initkb() //键盘初始化函数
  {
  EA=1;//?
  EX0=1;
  IT0=1;
  count=0;
  }
  void exter0() interrupt 0
  {
  count++;
  if(count>=2 && count<=9)
  {

  Data=(Data>>1);
  if(DATA==1)
  Data|=0x80;
  }
  }
  void trains(uchar scancode)
  {
  static uchar up=0,shift=0; //up为通、断码标志,shift为shift键按下标志
  uchar i;
  if (!up) //已接收的11位数据是通码(up为0)
  {
  switch (scancode)//开始翻译扫描码
  {
  case 0xF0: //键盘释放标志(随后的一个字节是断码)
  up=1; //设置up为断码标志
  break;
  case 0x12: //左shift键按下
  shift=1; //设置shift为按下标志
  break;
  case 0x59: //右shift键按下
  shift=1; //设置shift为按下标志
  break;
  default:
  if(!shift) //如果shift键没有按下
  { //查找unshifted表,表中左列是扫描码,右列是对应的ASCII码
  for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);
  if(unshifted[i][0]==scancode)
  {
  ASCII=unshifted[i][1];
  }
  }
  else //如果shift键按下
  { //查找shifted表

    相关教程
    推荐内容