硬件描述:PS2 键盘的时钟线(clk)接 89S51 的 INT0(P3.2),数据线 data 接(P3.3)
LCD 的控制端口分别为: RS = P2^7,RW = P2^6,EP = P2^5,数据端口为 P0,液晶显示
偏压 VL 必须接。
/****************************************************************************
*程序功能:本程序主要通过外部中断 INT0 及 3.3 端口读取 PS2 键盘值并通过 LCD1602 显
*示,键扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常
*用标点符号
*创建者: 曹兴
*创建日期:2008-10-11
*版本号: 2008101101
*****************************************************************************/
#include"reg51.h"
#include"stdio.h"
/*****************************端口定义***************************************/
#define DATA P0 //LCD 数据传输端口
sbit RS = P2^7; //LCD 控制端口定义
sbit RW = P2^6;
sbit EP = P2^5;
sbit k_data = P3^3; //PS/2 数据线端口
sbit k_clk = P3^2; //PS/2 时钟线端口
unsigned char bitcount = 11; //PC 键盘数据长度计数
unsigned char input = 0; //缓冲区读指针
unsigned char k_buf[32]; //键盘缓冲区
//没有按下 shift 键的 PC 键盘扫描码
unsigned char code unshifted[][2]=
{28,'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 shifted[][2]=
{28,'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,')',22,'!',30,'@',38,'#',
37,'$',46,'%',54,'^',61,'&',62,'*',70,'(',14,'~',78,'_',85,'+',93,'|',
84,'{',91,'}',76,':',82,'"',65,'<',73,'>',74,'?'};
/*****************************************************************************
*函数名称:put_k_buf
*函数功能:将解码后的字符放入键盘缓冲区内
*入口参数:k_char
*出口参数:无
*****************************************************************************/
void put_k_buf(unsigned char k_char)
评论2