51单片机控制ps2键盘设计

上传人:飞****9 文档编号:132050438 上传时间:2020-05-12 格式:DOC 页数:8 大小:223.51KB
返回 下载 相关 举报
51单片机控制ps2键盘设计_第1页
第1页 / 共8页
51单片机控制ps2键盘设计_第2页
第2页 / 共8页
51单片机控制ps2键盘设计_第3页
第3页 / 共8页
51单片机控制ps2键盘设计_第4页
第4页 / 共8页
51单片机控制ps2键盘设计_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《51单片机控制ps2键盘设计》由会员分享,可在线阅读,更多相关《51单片机控制ps2键盘设计(8页珍藏版)》请在金锄头文库上搜索。

1、51接PS2键盘2008-09-20 16:02在这个周末,终于有时间做做试验了。昨晚用AVR和MC9S12DG128驱动1602成功,今天突然想到PS2键盘的驱动,当时觉得PS2键盘与MCU接口很神秘,做了之后才觉得其实不然哈。再传张键盘的扫描码的波形。(协议规定:数据低位在前,采用奇校验 数据格式(PS-MCU):1起始位为0,8数据位,1奇校验位,1停止位为1)A键(0x1C)的make code:代码:PS_2_KB.H/*write by zhouyong*/*qq:510559254*/*2008-9-20*#ifndef _PS_2_KB_H#define _PS_2_KB_H#

2、include #define KB_CLK P3_3#define KB_DATA P3_4uchar Get_Key(void);uchar Key_Scan(void);uchar Key_Scan(void)uchar i,key_temp;KB_CLK=1; /输入KB_DATA=1;key_temp=0;while(KB_CLK); /第一次为0for(i=0;i=1; while(!KB_CLK); /下沿,第一位 while(KB_CLK); _nop_(); if(KB_DATA) key_temp|=0x80; /低位在前 while(!KB_CLK); /校验位while

3、(KB_CLK);while(!KB_CLK); /停止位while(KB_CLK);while(!KB_CLK);return key_temp;/由于make_code和第二个break_code一样,就取break_code第二个作为键码uchar Get_Key(void)uchar Key_Code;Key_Code=Key_Scan(); /make_code Key_Code=Key_Scan(); /break_code 1Key_Code=Key_Scan(); /break_code 2switch(Key_Code) case 0x1c: return A;break;

4、case 0x32: return B;break; case 0x21: return C;break; case 0x23: return D;break; case 0x24: return E;break; case 0x2b: return F;break; case 0x34: return G;break; case 0x33: return H;break; case 0x43: return I;break; case 0x3b: return J;break; case 0x42: return K;break; case 0x4b: return L;break; cas

5、e 0x3a: return M;break; case 0x31: return N;break; case 0x44: return O;break; case 0x4d: return P;break; case 0x15: return Q;break; case 0x2d: return R;break; case 0x1b: return S;break; case 0x2c: return T;break; case 0x3c: return U;break; case 0x2a: return V;break; case 0x1d: return W;break; case 0

6、x22: return X;break; case 0x35: return Y;break; case 0x1a: return Z;break; case 0x45: return 0;break; case 0x16: return 1;break; case 0x1e: return 2;break; case 0x26: return 3;break; case 0x25: return 4;break; case 0x2e: return 5;break; case 0x36: return 6;break; case 0x3d: return 7;break; case 0x3e

7、: return 8;break; case 0x46: return 9;break; default: return 0xff; break;#endifLCD1602.H:/*write by zhouyong*/*qq:510559254*/*2008-9-14*#ifndef _LCD1602_#define _LCD1602_#include #include #include /-#define E_1602 P3_7 /on falling edge enable data or command#define RW_1602 P3_6 /read or write contro

8、l#define RS_1602 P3_5 /cmd or data register select#define DATA_1602 P2 /data port#define DATA 1 /select DATA register#define CMD 0 /select CMD register#define READ 1#define WRITE 0/-void Delay_us(uchar t);void Delay_ms(uchar t);void Init_1602(void);void Write_Char_1602(uchar Data,bit CMD_DATA,bit Ch

9、eck);void Check_Busy_1602(void);void Write_String_1602(uchar *P);void Set_R_C(uchar R,uchar C);/void Clear_LCD_1602(void);/-/*void Clear_LCD_1602(void)Write_Char_1602(0x01,CMD,1);/clear screen*/void Delay_us_1602(uchar t)while(-t);void Delay_ms_1602(uchar t) while(t-) Delay_us_1602(225); Delay_us_16

10、02(227);void Init_1602(void)Delay_ms_1602(15);Write_Char_1602(0x38,CMD,0); /dont check busyDelay_ms_1602(5);Write_Char_1602(0x38,CMD,0);Delay_ms_1602(5);Write_Char_1602(0x38,CMD,0);Write_Char_1602(0x38,CMD,1);/8 wire,2 line display,5x10 charWrite_Char_1602(0x08,CMD,1);/close display,no cursor,dont b

11、linkWrite_Char_1602(0x01,CMD,1);/clear screenWrite_Char_1602(0x06,CMD,1);/the cursor move from left to right,the text dont moveWrite_Char_1602(0x0c,CMD,1);/open displayvoid Write_Char_1602(uchar Data,bit CMD_DATA,bit Check)if(Check) Check_Busy_1602();RS_1602=CMD_DATA;RW_1602=WRITE;DATA_1602=Data;E_1

12、602=1;_nop_();E_1602=0;void Write_String_1602(uchar *P) /only can write from start to enduchar i,len;len=strlen(P);Set_R_C(0,0);if(len16) for(i=0;i16;i+) Write_Char_1602(Pi,DATA,1); Set_R_C(1,0); for(i=16;ilen;i+) Write_Char_1602(Pi,DATA,1); else for(i=0;ilen;i+) Write_Char_1602(Pi,DATA,1); void Set_R_C(uchar R,uchar C) /set row and column R=0/1;C=0FR&=0x01;C&=0x0f;if(R) Write_Char_1602(0x80+0x40+C,CMD,1);else Write_Char_1602(0x80+C,CMD,1);void Check_Busy_1602(void)DATA_1602=0xff; /set as input portRS_1602=CMD;RW_1602=READ;E_1602=1;while(DATA_1602 &

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号