招生热线
0755-86191118 0755-86191118
我的位置: 首页 > 学习专区 > .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++]);

}

}

深圳北大青鸟

评论