51单片机控制ps2键盘设计.doc_第1页
51单片机控制ps2键盘设计.doc_第2页
51单片机控制ps2键盘设计.doc_第3页
51单片机控制ps2键盘设计.doc_第4页
51单片机控制ps2键盘设计.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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#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(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; 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; case 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 0x22: 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: 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 control#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 Check);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_1602(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 blinkWrite_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_1602=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 & 0x80) E_1602=0; /这两句protues仿真必须加 E_1602=1; /E_1602=0;#endifmain.c:#include #include #define uchar unsigned char #define uint unsigned int#include PS_2_KB.h#include LCD1602.hvoid main(void)uchar Buffer= ;uchar Key_Code,Key_Count,i;Init_1602();Set_R_C(0,0);for(;) Key_Code

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论