用51操作和檢測PS2鍵盤,接收數(shù)據(jù)已經(jīng)搞定了,可是發(fā)送數(shù)據(jù)卻出錯,不知道怎么回事。給它的命令和它所執(zhí)行的完全不同,請高手指教下,到底是哪里錯了,還是沒錯,電路接得不對??接收函數(shù)是這樣的。
void send(uchar Data)
{
uchar i,high=0;
EA=0;
EX0=0;//關(guān)閉中斷
CLK=0;
delay10us(11);
DATA=0;
delay10us(2);
CLK=1;
while(CLK==1);
//開始發(fā)送八位數(shù)據(jù)
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; //設(shè)置奇校驗(yàn)位
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;//寫數(shù)據(jù)程序結(jié)束后開中斷
}
全部程序是這樣的:
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //數(shù)據(jù)口
sbit RS = P1^5; //并行的指令/數(shù)據(jù)選擇信號, H數(shù)據(jù), L命令
sbit RW = P1^7; //并行讀寫選擇信號, H讀, L寫
sbit E = P1^6; //并行使能端, H有效, L無效
sbit PSB = P1^1; //并/串接口選擇, H并,L串
sbit RET = P1^4; //復(fù)位, L有效
sbit DATA=P0^2;
sbit CLK=P3^2;
uchar count,ASCII=65,Data;
void trains(uchar Code);
void send (uchar Data);
//檢測LCD是否處于忙狀態(tài), 若忙返回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;
}
//寫數(shù)據(jù)
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); //基本指令, 擴(kuò)充指令為34H
delayMs(10);
writeCmd(0x0c); //顯示開, 關(guān)光標(biāo)
writeCmd(0x01); //清屏
delayMs(10);
}
void init2()
{
PSB = 1; //并口方式
RET=0; //復(fù)位
delayUs(); //延時
RET=1; //復(fù)位置高
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++]);
}
}
深圳北大青鳥