码,存放百位数字,低位字节为压缩的BCD码,存放数据的十位和个位。为了实现上述格式的显示,查手册可知,对于74LS48,若需要使得LED数码管熄灭,只要输入段码0FFH即可。所以设计流程为:首先将键号乘2,再加66H,得到各个数据的存放单元的首地址,将该首地址暂存在R1。然后见7BH单元的内容送到累加器A,用SWAP A指令处理后变为10H,再与0FH相减,则又变为1FH,送到78H单元。然后,又将F0H和该号首地址的内容相加,得到F*H,送79H单元,。最后,将该号数据的低位字节内容送到7AH单元,后再执行DIS2以后的各条指令,即可按预定的要求实现显示。显示子程序增加了第一部分的内容后,也为数据的动态刷新创造了条件,当每次执行显示子程序时,均能将数据转换结果及时予以显示。
程序如下: MOV A ,7BH CJNE A , #06, MCD :CLR A MOV 78H ,A MOV 79H ,A MOV 7AH ,A MOV R0 ,#16 LOOP : CLR C MOV A ,70H RLC A MOV 70H ,A
40
MOV A ,71H RLC A MOV 71H ,A MOV A ,7AH ADDC A , 7AH DA A MOV 7AH , A MOV A ,79H ADDC A ,79H DA A MOV 79H, A MOV A ,78H ADDC A ,78H DA A MOV 78H, A DJNZ R0 ,LOOP RET
41
4.1.5键扫描子程序KEY和键分析子程序KAYA
主程序的第三部分是通过判断是否有键按下实现相应的人机对话功能。主要是由两个关键的子程序构成:键扫描子程序KEY和键分析子程序KAYA。
KEY 子程序的功能是判断是否有键按下。设计思想是:先通过与键盘相连的74LS244芯片,并使矩阵式键盘4根行线均为低电平,后读入列线信号,如有键按下,则4根列线中至少与一根信号为低电平;如果无键按下,则4根列线读入的信号全为1,后再与F0H相或,A累加器的内容则为FFH,再将A累加器的内容求反,变为00H,即可通过判断A 内容是否为0,来确定是否有键按下。
KAYA 键分析子程序的功能是确定所按的键号。设计思想是:通过逐行扫描依次使矩阵式键盘的各条行线为低电平,后逐次读入个列线信号,判断该行是否有键按下。具体方法是:将该列线信号依次右移至C标志,如果C标志内容为0,则表示有键按下。在程序中每右移一次,键号加1,由此可得到按键的键号。
在进行键扫描的分析后,在主程序的末尾安排了一个查表程序。该设计中有7个功能键,根据分析所得的键号,通过查表,找到该功能键所对应的程序编制不同的显示程序,但是在上述显示子程序中已经作了处理,不管是显示时钟还是要显示各种数据,都能达到预期的效果,故在相应的跳转地址上均要加一条LJMP LOP1指令即可实现预定的显示。对于5#、6#功能键,该设计要求具有报警以及撤销报警功能,程序设计思想为:设置一个标志单元,当该标志单元的内容为00H时,撤销报警,该标志单元的内容为FFH时投入报警。所以在该程序中,只要报标志单元的内容设置好,而且在中断服务程序中执行报警子程序前先判断标志单
42
元的内容,如果是FFH,则执行报警子程序;如果是00H,则跳过报警子程序即可。
程序如下: A
KEY:MOV P2,7FH ;第一行行线送0
JB P2.3,NEXT1 ;判断第一列列线是否为0,若不是0表示按键未按下NEXT1继续下一按键扫描
LCALL DELAY ;按键延时消抖
MOV A,#1 ;表示\键按下,存键值 AJMP SAOMIAOEND ;结束本周期扫描 NEXT1:MOV P2,7FH ;第一行行线送0
JB P2.2,NEXT2 ;判断第二列列线是否为0,若不是0表示按键未按下,继续下一按键扫描
LCALL DELAY ;按键延时消抖 MOV A,#2 ;存键值
AJMP SAOMIAOEND ;结束本周期扫描 NEXT2: MOV P2,7FH ;第一行行线送0
JB P2.1,NEXT3 ;判断列线是否为0,若不是0表示按键未按下,继续下一按键扫描
LCALL DELAY ;按键延时消抖 MOV A,#3 ;存键值 AJMP SAOMIAOEND ;结束本周期扫描 NEXT3:MOV P2,7FH ;第一行行线送0
43