在驱动程序中应声明numlock、capslock、scrolllock、SHIFT、ALT、CTRL(L/R)、GUI(L/R)键的标志变量为全局变量,还要建立一个数组SCAN_data用于存放扫描码序列,还要建立EO_FLAG、E1_FLAG、FO_FLAG三个标志变量用于数据处理程序模块内部做分支选择,以及一个keypress_fl标志变量用于标示键的状态。该部分功能由AT89S52完成。
从上图可以看出,数据分为回应命令、PAUSE键、PRINTSCREEN键、第二类扫描码、第一类扫描码五个分支块来处理,而后面的三个分支块都内含一个相同的程序流程结构,如下图所示。该流程结构用于将扫描码细化到通码和断码分开处理。
该设计方法保证了第二类扫描码和PRJNTSCREEN键的断码有独立的处理过程,在开发驱动程序时忽略这个步骤。
(4)键盘扫描码转换程序设计
将扫描码转换成ASCII码需要建立一张完备的对照表。该部分的设计需要考虑键接下与放开的状态,以及shift键和CapsLock键在不同状态下的逻辑上下面给出扫描码转换时大小写处理的关键程序。
If((shift_flag==Falandcapslock-flag==False)or(sflag==Trueandcapslock_flag==True))and(tempASCll>Ox40)and(temPASCii<Ox5Aand(keypress-flag==True)) {temPASCu..=temPASCii+321}
(5)LCD显示程序设计
RTl602C是基于HD44780芯片构建的2行16列字符型的液晶显示模块,其接口只需要8条数据线和3条控制线即可。下面给出该部分驱动程序的部分代码。
voidwriteIColu.struction(charinstru)//向LCD写命令
{
inti;
for(i=DELAY;i>0;i-.};//延时
LCD_CTL=Ox4;//清零RS位(命令),清零R/W位(写入)
LCD-DATA-DIR=LCD-DATAOUTI檄据传输方向
LCD_DATA=instru;//发送命令
for(i=DELAY;i>0;i一一);//延时
LCD-CTL=0;
}
voidwritelcddata{charlcddata)//向LCD写数据
{lnt1;
for(i=DELAY;i>0;i一一);//延时
LCD_CTL=Ox6;//置位RS位(数据),清零R/W位(写入)
LCD-DATA-DIR=LCD-DATA-OUT;/,,IAII方向LCD_DATA=kddata;//发送数据
for(i=DELAY;i>0;i-→;//延时
LCD-CTL=0;}
上一篇:伺服电机红外线遥控接口电路的开发