我的位置: 首頁 > 學習專區 > .NET技術 > 關于PS2鍵盤的C程序

關于PS2鍵盤的C程序

2013-06-01 08:51:11
來源:
[導讀] 用51操作和檢測PS2鍵盤,接收數據已經搞定了,可是發送數據卻出錯,不知道怎么回事。給它的命令和它所執行的完全不同,請高手指教下,到底

用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

#include

#include

#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++]);

}

}

深圳北大青鳥

評論
熱點專題
>>
相關文章推薦
>>
好吊妞免费视频在线观看,久久亚洲国产人成综合网,久久精品国产2020,欧美精品综合在线
日韩电影免费在线观看视频 | 日本免费一级高清婬日本片 | 日本欧洲亚洲精品在线观看 | 日本女v片一区二区 | 久久精品99久久香蕉国产 | 亚洲成在人线在线精品 |