前言:
现在朋友们对“c语言电子时钟程序设计编程”大约比较重视,兄弟们都需要学习一些“c语言电子时钟程序设计编程”的相关知识。那么小编同时在网上汇集了一些对于“c语言电子时钟程序设计编程””的相关文章,希望朋友们能喜欢,小伙伴们一起来学习一下吧!程序开始
ORG 0000H
AJMP MAIN (绝对转移)
ORG 000BH
AJMP CLOCK
ORG 0100H
主程序开始:
MAIN: MOV SP,#70H
MOV 6EH,#00H ;显示缓存器初始值设定
MOV 6DH,#00H
MOV 6CH,#00H
MOV 6BH,#00H
MOV 6AH,#00H
MOV 69H,#00H
MOV 50H,#00H ;秒,分,小时初始值设定
MOV 51H,#00H
MOV 52H,#00H
MOV DPTR,#0F003H ;8255端口定义,PA,PB为输出
MOV A,#80H
MOVX @DPTR,A
MOV 4FH,#00H
MOV TMOD,#01H ;定时器T0及TL0,TH0初始值设定
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA ;开总中断
SETB ET0 ;开定时器中断
SETB TR0
循环程序开始,并显示时间:
START: MOV A,50H A=50H
LCALL BCD 先把程序计数器pc加3获得下条指令的地址(也就是断点地址),并把它压入堆栈(先低四位后高四位),同时把堆栈指针加2.接着把指令的第二个和第三个字节(A15-A8,A7-A0)分别装入pc的高位和低位中,然后从pc中指出的地址开始执行程序。
本指令执行后不影响任何标志
MOV 6AH,A ;显示秒十位
MOV 69H,B ;显示秒个位
MOV A,51H
LCALL BCD
MOV 6CH,A ;显示分十位
MOV 6BH,B ;显示分个位
MOV A,52H
LCALL BCD ;调用十六进制至BCD码转换子程序
MOV 6EH,A
MOV 6DH,B
LCALL DIS ;调用显示子程序
LCALL KEY ;调用键盘子程序
AJMP START
;主程序结束
BCD: MOV B,#0AH ;BCD码转换子程序
DIV AB
RET
CLOCK: PUSH ACC ;保护现场
PUSH PSW
CLR TR0
MOV TH0,#3CH ;定时参数重新设置
MOV TL0,#0B0H
SETB TR0
INC 4FH ;100ms单元加1
MOV A,4FH
CJNE A,#0AH,D0 ;100ms单元=10,就秒单元加1
MOV 4FH,#00H ;100ms单元内容清0
MOV A,50H
ADD A,#01H ;秒单元加1
MOV 50H,A
CJNE A,#3CH,D0 ;秒单元内容=60,则秒单元清0
MOV 50H,#00H
MOV A,51H ;分,时单元代码
ADD A,#01H
MOV 51H,A
CJNE A,#3CH,D0
MOV 51H,#00H
MOV A,52H
ADD A,#01H
LCALL DIANJI ;输出电机控制信号
MOV 52H,A
CJNE A,#18H,D0
MOV 52H,#00H
D0: POP PSW ;出栈,退出中断子程序
POP ACC
RETI
DIANJI: MOV R3,A
CLR P1.0
LCALL DELL50
SETB P1.0
LCALL DELL50
DJNZ R3,RING
RET
键盘子程序:
KEY: JB P1.7,MSET ;秒设定子程序
LCALL DELL ;防抖动延时
JB P1.7,MSET
INC 50H
MOV A,50H
CJNE A,#3CH,SDIS
MOV 50H,#00H
SDIS: MOV A,50H
LCALL BCD
MOV 69H,B
MOV 6AH,A
SREP: LCALL DIS
JNB P1.7,SREP
MSET: JB P1.6,HSET ;分设定子程序
LCALL DELL
JB P1.6,HSET
INC 51H
MOV A,51H
CJNE A,#3CH,MDIS
MOV 51H,#00H
MDIS: MOV A,51H
LCALL BCD
MOV 6BH,B
MOV 6CH,A
MREP: CALL DIS
JNB P1.6,MREP
HSET: JB P1.5,SETEND ;小时设定子程序
LCALL DELL
JB P1.5,SETEND
INC 52H
MOV A,52H
CJNE A,#18H,HDIS
MOV 52H,#00H
HDIS: MOV A,52H
LCALL BCD
MOV 6DH,B
MOV 6EH,A
HREP: LCALL DIS
JNB P1.5,HREP
SETEND: RET ;键盘设定子程序结束
显示子程序:
DIS: MOV R0,#69H ;建立显示首地址
MOV R3,#01H ;从右边开始显示
MOV A,R3 ;位控码初值
YB: MOV DPTR,#0F001H ;位控口地址,PB口
MOVX @DPTR,A
MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0F000H
MOVX @DPTR,A ;输出段控码
LCALL DELL ;延时
INC R0 ;转向下一单元
MOV A,R3
JB ACC.5,EEND ;判断是否到最高位,到则返回
RL A
MOV R3,A
SJMP YB ;继续扫描
EEND: RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH ;字形代码表
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,73H,3EH
DB 31H,6EH,1CH,23H,40H,03H
DELL: MOV R5,#0AH 延时10ms
LP1: MOV R6,#32H
DJNZ R6,$
DJNZ R5,LP1
RET
DELL50: MOV R7,#0AH 延时50 MS
LCALL DELL
DJNZ R7,DELL50
RET
END
标签: #c语言电子时钟程序设计编程 #单片机c语言时钟程序