《基于89S51的PC键盘读取(PS2)》由会员分享,可在线阅读,更多相关《基于89S51的PC键盘读取(PS2)(7页珍藏版)》请在金锄头文库上搜索。
1、硬件描述:PS2 键盘的时钟线(clk)接 89S51 的 INT0(P3.2),数据线 data 接(P3.3)LCD 的控制端口分别为: RS = P27,RW = P26,EP = P25,数据端口为 P0,液晶显示偏压 VL 必须接。/*函数功能:本程序主要通过外部中断 INT0 及 3.3 端口读取 PS2 键盘值并通过 LCD1602 显*示,键扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常*用标点符号 *创建者: 曹兴*创建日期:2008-10-11*版本号: 2008101101*/#includereg51.h#includestdio.h/*端口定
2、义*/#define DATA P0 /LCD 数据传输端口sbit RS = P27; /LCD 控制端口定义sbit RW = P26;sbit EP = P25;sbit k_data = P33; /PS/2 数据线端口sbit k_clk = P32; /PS/2 时钟线端口unsigned char bitcount = 11; /PC 键盘数据长度计数unsigned char input = 0; /缓冲区读指针unsigned char k_buf32; /键盘缓冲区/没有按下 shift 键的 PC 键盘扫描码unsigned char code unshifted2=28
3、,a,50,b,33,c,35,d,36,e,43,f,52,g,51,h,67,i,59,j,66,k,75,l,58,m,49,n,68,o,77,p,21,q,45,r,27,s,44,t,60,u,42,v,29,w,34,x,53,y,26,z,69,0,22,1,30,2,38,3,37,4,46,5,54,6,61,7,62,8,70,9,14,78,-,85,=,84,91,76,;,65,73,.,74,/;/按下 shift 键的 PC 键盘扫描码unsigned char code shifted2=28,A,50,B,33,C,35,D,36,E,43,F,52,G,5
4、1,H,67,I,59,J,66,K,75,L,58,M,49,N,68,O,77,P,21,Q,45,R,27,S,44,T,60,U,42,V,29,W,34,X,53,Y,26,Z,69,),22,!,30,38,#,37,$,46,%,54,61,&,62,*,70,(,14,78,_,85,+,93,|,84,91,76,:,82,65,74,?;/*函数名称:put_k_buf*函数功能:将解码后的字符放入键盘缓冲区内*入口参数:k_char*出口参数:无*/void put_k_buf(unsigned char k_char)k_bufinput = k_char; /送键盘值
5、 ASCII 码到键盘缓冲区if(input1);if(k_data )dat|=0x80;bitcount-;/*函数名称:delayns*函数功能:LCD 延时子程序*入口参数:time*出口参数:无*/void delayns(unsigned char time)unsigned char i;for(;time0;time-)for(i = 0; i 250; i+) ;/*函数名称:lcd_buzy*函数功能:测试 LCD 忙碌状态*入口参数:无*出口参数:result*/bit lcd_buzy()bit result;RS = 0; RW = 1;EP = 1;delayns(
6、1); /此处延时特别重要 (必不可少)result = (bit)(DATA delayns(1);EP = 0;return result;/*函数名称:lcd_w_order*函数功能:写指令数据到 LCD 子程序*入口参数:cmd*出口参数:无*/void lcd_w_order(unsigned char cmd)while(lcd_buzy(); /判断 LCD 是否忙碌RS = 0;RW = 0;EP = 1;DATA = cmd;delayns(1);EP = 0;/*函数名称:lcd_w_data*函数功能:写入显示数据到 LCD 子程序*入口参数:dat*出口参数:五*/v
7、oid lcd_w_data(unsigned char dat)while(lcd_buzy(); /判断 LCD 是否忙碌RS = 1;RW = 0;EP = 1;DATA = dat;delayns(1);EP = 0;/*函数名称:lcd_post*函数功能:设定显示位置子程序*入口参数:pos*出口参数:无 */void lcd_post(unsigned char pos)lcd_w_order(pos | 0x80);/*函数名称:lcd_init*函数功能:LCD 初始化子程序*入口参数:无*出口参数:无*/void lcd_init()lcd_w_order(0x38); /
8、显示模式设置delayns(1);lcd_w_order(0x0c); /显示光标设置,开显示delayns(1);lcd_w_order(0x06); /显示光标移动(右移) delayns(1);lcd_w_order(0x01); /清屏delayns(1);/*函数名称:main*函数功能:本程序主要通过外部中断 INT0 及 3.3 端口读取 PS2 键盘值并通过 LCD1602 显示,键*扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常用标点*符号*入口参数:无*出口参数:无 */void main()unsigned char j,i=0;EA = 1;IT0 = 1;EX0 = 1;while(1)i=0;lcd_init(); / 初始化 LCD delayns(10);lcd_post(0x00); /设置显示位置while(iinput) lcd_w_data(k_bufi); /显示字符i+;if(i=16)lcd_post(0x40); / 设置显示位置 for (j=0;j20;j+)delayns(200);