基于51单片机秒表的程序设计
2行无键按下,转查第3行
MOV A,#10H ;第2行有键按下,行首键号送A
AJMP LK ;转求键号
L3: JB ACC.3,NEXT ;第3行无键按下,转查下一列
MOV A,#18H ;第3行有键按下,行首键号送A
AJMP LK
LK: ADD A,R4 ;形成键码送A
PUSH ACC ;键码入栈保护
K4: ACALL DISP
ACALL KS ;等待键释放
JNZ K4 ;未释放,等待
POP ACC ;键释放,弹栈送A
AJMP PR ;转键盘处理程序
NEXT: INC R4 ;修改列号
MOV A,R3
JNB ACC.3,KEY ;4列扫描完返回按键查询状态
RL A ;未扫描完,改为下列扫描字
MOV R3,A , nbsp; ;扫描字暂存R3
AJMP K3 ;转列扫描程序
;―――――――――――键盘处理程序―――――――――――――――
PR: CJNE A,#00H,PR01 ;不是KE0键码,转KE1键
AJMP KE0 ;转KE0键处理程序
PR01: CJNE A,#01H,PR02 ;不是KE1键码,转KE2键
AJMP KE1 ;转KE1键处理程序
PR02: CJNE A,#02H,PR03 ;不是KE2键码,返回按键查询
AJMP KE2 ;转KE2键处理程序
PR03: AJMP KEY
KE0: SETB TR0 ;启动定时器T0
SETB TR1 ;启动定时器T1
SETB ET0 ;允许定时器T0中断
SETB EA ;开中断
AJMP KEY ;返回键盘查询状态
KE1: CLR EA ;关中断
CLR ET0 ;禁止定时器T0中断
CLR TR1 ;关定时器T1
CLR TR0 ;关定时器T0
AJMP KEY
KE2: CLR EA ;关中断
AJMP MAIN ;返回主程序进行初始化
;――――――――――按键查询子程序――――――――――――――
KS: MOV DPTR,#4401H ;置8155PA口地址
MOV A,#00H
MOVX @DPTR,A ;全扫描字#00H送PA口
INC DPTR ;指向PC口
INC DPTR
MOVX A,@DPTR ;读入PC口状态
CPL A ;变正逻辑,高电平表示有键按下
ANL A,#0FH ;屏蔽高4位
RET ;返回,A≠0表示有键按下
;―――――――――LED动态显示子程序―――――――――――――
DISP: PUSH ACC ;A入栈保护
SETB RS0 ;保护第0组工作寄存器,启用第1组工作寄存器
MOV R2,#08H ;LED待显示位数送R2
MOV R1,#00H ;设定显示时间
MOV R3,#7FH ;选中最右端LED
MOV R0,#30H ;显示缓冲区首址送R0
MOV A,@R0 ;秒显示个位送A
DISP1: MOV DPTR,#TAB ;指向字形表首址
MOVC A,@A+DPTR ;查表取得字形码
MOV DPTR,#4402H ;指向8155PB口(段码口)
MOVX @DPTR,A ;字形码送PB口
MOV A,R3 ;取位选字
MOV DPTR,#4401H ;指向8155PA口(位选口) , /O:P>
MOVX @DPTR,A ;位码送PA口
DJNZ R1,$ ;延时0.5ms
DJNZ R1,$ ;延时0.5ms
RR A ;位选字移位
MOV R3,A ;移位后的位选字送R3
INC R0 ;指向下一位缓冲区地址
MOV A,@R0 ;缓冲区数据送A
DJNZ R2,DISP1 ;未扫描完,继续循环
CLR RS0 ;恢复第0组工作寄存器
POP ACC ;A弹栈,恢复现场
RET
TAB: DB 3FH,06H,5BH,4FH,66H ;共阴极LED字形表
DB 6DH,7DH,07H,7FH,6FH
;――――――――――定时器中断服务程序―――――――――――――
CONT: PUSH ACC ;保护现场
MOV TH0,#3CH ;定时器T1重置初值
MOV TL0,#0B0H
MOV A,20H ;秒计数器送A
AJMP CONT1
REN: AJMP REN1
CONT1: DJNZ 21H,REN ;1秒定时未到,中断返回
MOV 21H,#14H ;重置50ms计数初值
CLR P3.5 ;软件产生定时器T1计数脉冲
NOP
NOP
SETB P3.5
INC A ;1秒计数值加1
DA A ;换算为10进制计数
JBC TF1,CONT2 ;60秒到,转清零
CONT3: MOV 20H,A ;计数值送60秒计数单元20H
ANL A,#0FH ;屏蔽高4位
MOV 30H,A ;秒表个位待显示数据送显示缓冲区
MOV A,20H
SWAP A ;60秒计数单元高、低4位数据互换
ANL A,#0FH ;屏蔽高4位
MOV 31H,A ;秒表十位待显示数据送显示缓冲区
AJMP REN1
CONT2: MOV A,#00H
AJMP CONT3
REN1: POP ACC ;恢复现场
RET ;中断返回
END
3. 总结与分析
(1)实验采用七段码LED设计(数码管),显示直观;采用定时器中断,计时更准确;功能齐全,可随时启动、停止、清零,后者智能化程度更高。
(2)设计、调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。本例子将整个程序划分为键盘程序,动态
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)