微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 汇编电子钟的设计

汇编电子钟的设计

时间:09-17 来源:互联网 点击:

写在前面: ­
前天晚上断网之后闲来无事忽然心血来潮想起和谁说过以我现在的水平做个时钟没有什么问题,就准备将它实现了。借用老师的学习板子,一直搞到凌晨2点做出了一个24小时的计数器显示,因为没有学过按键的使用方法,昨天实验课下课后问了老师,她给出了查询方式。昨晚搞了下,可以置数,但是不能实现0~60范围加,只能0~99加。今天上午在老师的指导下,终于可以了,总算没有食言啊。呵呵,下面贴出程序了。
先来个效果图:

mini_second equ 30h ;设置0.05秒、秒、分、时的地址 ­

second equ 31h ­

minute equ 32h ­

clock equ 33h ­

k1 equ p3.2 ;设置按键地址,为外部中断口int0和int1 ­

k2 equ p3.3 ­

­

org 0000h ­

ljmp start ­

org 000bh ­

ljmp t0_x ;使用中断计时 ­

org 0050h ­

start: mov mini_second,#00h ;清零 ­

mov second,#00h ­

mov minute,#00h ­

mov clock,#00h ­

mov tmod,#01h ;置工作方式1,开定时器 ­

mov th0,#3ch ­

mov tl0,#0b0h ­

setb ea ­

setb et0 ­

setb tr0 ­

start1: lcall show_led ;主程序跳转程序显示 ­

lcall key_d ;置数程序 ­

ljmp start1 ;一直循环显示 ­

t0_x: ­

push acc ;保护现场 ­

push psw ­

mov th0,#3ch ;置初值,这个不是很准确, ­

mov tl0,#0b4h ;估计一分钟慢个2~3秒 ­

inc mini_second ­

mov a,mini_second ­

cjne a,#20,ret0 ;20次为1秒,没有20次均跳出中断重新跳 ­

mov mini_second, #00h ­

mov a,second ­

add a,#01h ­

da a ­

mov second,a ­

cjne a,#60h,ret0 ;1秒后出循环,每秒后秒清零,跳到分计时加1 ­

mov second,#00h ­

mov a,minute ­

add a,#01h ;分同秒 ­

da a ­

mov minute,a ­

cjne a,#60h,ret0 ­

mov minute,#00h ­

mov a,clock ­

add a,#01h ­

da a ­

mov clock,a ­

cjne a,#24h,ret0 ­

mov clock,#00h ­

ret0: pop psw ;结束保护,跳出 ­

pop acc ­

reti ­

nop ­

nop ­

nop ­

;======================================显示子程序 ­

show_led: ­

mov a,second ;个位秒显示 ­

anl a,#0fh ­

mov 40h,a ­

clr p1.5 ;片选数码管 ­

clr p1.6 ­

setb p1.7 ­

mov a,40h ­

lcall led_x ­

lcall delay ­

mov a,second ;十位秒显示 ­

anl a,#0f0h ­

swap a ­

mov 41h,a ­

setb p1.5 ­

clr p1.6 ­

setb p1.7 ­

mov a,41h ­

lcall led_x ­

lcall delay ­

­

mov a,minute ;个位分显示 ­

anl a,#0fh ­

mov 42h,a ­

setb p1.5 ­

setb p1.6 ­

setb p1.7 ­

mov a,42h ­

lcall led_x ­

lcall delay ­

mov a,minute ;十位分显示 ­

anl a,#0f0h ­

swap a ­

mov 43h,a ­

clr p1.5 ­

clr p1.6 ­

clr p1.7 ­

mov a,43h ­

lcall led_x ­

lcall delay ­

­

mov a,clock ;个位时显示 ­

anl a,#0fh ­

mov 44h,a ­

clr p1.5 ­

setb p1.6 ­

clr p1.7 ­

mov a,44h ­

lcall led_x ­

lcall delay ­

mov a,clock ;十位时显示 ­

anl a,#0f0h ­

swap a ­

mov 45h,a ­

setb p1.5 ­

setb p1.6 ­

clr p1.7 ­

mov a,45h ­

lcall led_x ­

lcall delay ­

ret ­

­

led_x: mov dptr,#led_data ­

movc a,@a+dptr ­

mov p0,a ­

ret ­

;====================================延迟子程序 ­

delay: mov r7,#10 ­

de1: mov r6,#100 ;延时1ms多一点,因为晶振为11.0592MHZ ­

djnz r6,$ ­

djnz r7,de1 ­

ret ­

;===================================数码管的段选码 ­

led_data: db 0c0h,0f9h,0a4h,0b0h,099h,92h,82h,0f8h,80h,90h ­

;=====================================置数子程序 ­

key_d: jnb k1,key1 ­

jnb k2,key2 ­

ret ­

key1: mov a,minute ;查询方式 ————> 分位置数 ­

clr c ;清零进位,防止干扰da和cjne指令的操作 ­

inc a ;累加器自加一 ,此为加法置数 ­

da a ;十进制处理 ­

cjne a, #60h, k_01 ;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top