|
这几天都忙帮同学写课程设计的程序了,反倒我自己的单片机课程设计还没开始做,晕死。这汇编搞得我头都大了,指令都忘记得差不多了。 这是刚刚完成的简洁版数字钟,分享汇编源程序,带有详细的注释:
/**********************************************
程序名称:51单片机数码管电子钟汇编程序
简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒
显示格式:23-59-59(小时十位如果为0则不显示)
P0口输出段选信号,P2口输出位选信号
P1.0为调时按钮,P1.1为调分按钮;晶振12M
编 写:JiangX.net
**********************************************/
ORG 0000H ;程序入口地址
LJMP START
ORG 000BH ;定时器0中断入口地址
LJMP TIMER_0
K1 BIT P1.0 ;定义调时按键
K2 BIT P1.1 ;定义调分按键
START:
MOV TMOD,#01H ;定时器0,工作模式1
MOV TH0,#03CH
MOV TL0,#0B0H ;赋初值,定时50ms
SETB EA ;开中断总开关
SETB TR0 ;开启定时器0
SETB ET0 ;定时器0中断允许位
MOV R6,#0 ;用于控制走时的基准时钟源,计中断次数
MOV R5,#0 ;R5用于控制扫描按键的时间间隔
MOV 20H,#0 ;秒个位寄存器清零
MOV 21H,#0 ;秒十位寄存器清零
MOV 22H,#0 ;分个位寄存器清零
MOV 23H,#0 ;分十位寄存器清零
MOV 24H,#0 ;时个位寄存器清零
MOV 25H,#0 ;时十位寄存器清零
LJMP DISPLAY
TIMER_0:
CLR EA
INC R6
INC R5
MOV TH0,#03CH
MOV TL0,#0B0H ;重新赋初值,定时50ms
SETB EA
RETI
ADD_TIME:
CJNE R6,#20,EXIT ;定时器中断20次,1秒到
MOV R6,#0
INC 20H
MOV A,20H
CJNE A,#10,EXIT ;如果秒个位等于10,清零
MOV 20H,#00H
INC 21H
MOV A,21H
CJNE A,#6,EXIT ;如果秒十位等于6,清零
MOV 21H,#00H
INC 22H
MIN:
MOV A,22H
CJNE A,#10,EXIT ;如果分个位等于10,清零
MOV 22H,#00H
INC 23H
MOV A,23H
CJNE A,#6,EXIT ;如果分十位等于6,清零
MOV 23H,#00H
INC 24H
HOUR:
MOV A,25H
CJNE A,#2,LOOP ;如果时十位等于2,检查时个位
MOV A,24H
CJNE A,#4,EXIT ;如果时个位等于4,清零
MOV 24H,#00H ;清零时个位
MOV 25H,#00H ;清零时十位
LJMP EXIT
LOOP:
MOV A,24H
CJNE A,#10,EXIT ;如果时个位等于10,清零
MOV 24H,#00H
INC 25H
LJMP EXIT
EXIT:
LJMP DISPLAY ;刷新完毕,跳转到显示
DISPLAY:
MOV DPTR,#TABLE
MOV A,20H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
LCALL DELAY
SETB P2.7 ;显示秒个位
MOV A,21H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
LCALL DELAY
SETB P2.6 ;显示秒十位
MOV A,#0BFH
MOV P0,A
CLR P2.5
LCALL DELAY
SETB P2.5 ;显示“-”
MOV A,22H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
LCALL DELAY
SETB P2.4 ;显示分个位
MOV A,23H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY
SETB P2.3 ;显示分十位
MOV A,#0BFH
MOV P0,A
CLR P2.2
LCALL DELAY
SETB P2.2 ;显示“-”
MOV A,24H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
LCALL DELAY
SETB P2.1 ;显示时个位
MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0
MOV A,25H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
LCALL DELAY
SETB P2.0 ;显示时十位
CJNE R5,#4,EXIT0 ;当R5到4时,扫描按键
MOV R5,#0
KEY_SCAN:
JNB K1,ADD_HOUR
JNB K2,ADD_MIN
LJMP ADD_TIME ;无键按下,跳至走时
ADD_HOUR:
INC 24H ;小时加1
LJMP HOUR ;更新
ADD_MIN:
INC 22H ;分钟加1
LJMP MIN ;更新
EXIT0:
LJMP ADD_TIME
DELAY:
MOV R7,#150 ;扫描延时
DJNZ R7,$
RET
TABLE: ;数码管字形显示编码表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;字形显示编码
TABLE1:
DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;小时位的十位数编码,该位如果为0则不显示
END ;程序结束
|
|