昌吉编程网

昌吉编程网

hga020新版-汇编电子钟的设计

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

本文引用地址:http://www.eepw.com.cn/article/.htm

mini_secondequ30h;设置0.05秒、秒、分、时的地址­

secondequ31h­

minuteequ32h­

clockequ33h­

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

k2equp3.3­

­

org0000h­

ljmpstart­

org000bh­

ljmpt0_x;使用中断计时­

org0050h­

start:movmini_second,#00h;清零­

movsecond,#00h­

movminute,#00h­

movclock,#00h­

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

movth0,#3ch­

movtl0,#0b0h­

setbea­

setbet0­

setbtr0­

start1:lcallshow_led;主程序跳转程序显示­

lcallkey_d;置数程序­

ljmpstart1;一直循环显示­

t0_x:­

pushacc;保护现场­

pushpsw­

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

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

incmini_second­

mova,mini_second­

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

movmini_second,#00h­

mova,second­

adda,#01h­

daa­

movsecond,a­

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

movsecond,#00h­

mova,minute­

adda,#01h;分同秒­

daa­

movminute,a­

cjnea,#60h,ret0­

movminute,#00h­

mova,clock­

adda,#01h­

daa­

movclock,a­

cjnea,#24h,ret0­

movclock,#00h­

ret0:poppsw;结束保护,跳出­

popacc­

reti­

nop­

nop­

nop­

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

show_led:­

mova,second;个位秒显示­

anla,#0fh­

mov40h,a­

clrp1.5;片选数码管­

clrp1.6­

setbp1.7­

mova,40h­

lcallled_x­

lcalldelay­

mova,second;十位秒显示­

anla,#0f0h­

swapa­

mov41h,a­

setbp1.5­

clrp1.6­

setbp1.7­

mova,41h­

lcallled_x­

lcalldelay­

­

mova,minute;个位分显示­

anla,#0fh­

mov42h,a­

setbp1.5­

setbp1.6­

setbp1.7­

mova,42h­

lcallled_x­

lcalldelay­

mova,minute;十位分显示­

anla,#0f0h­

swapa­

mov43h,a­

clrp1.5­

clrp1.6­

clrp1.7­

mova,43h­

lcallled_x­

lcalldelay­

­

mova,clock;个位时显示­

anla,#0fh­

mov44h,a­

clrp1.5­

setbp1.6­

clrp1.7­

mova,44h­

lcallled_x­

lcalldelay­

mova,clock;十位时显示­

anla,#0f0h­

swapa­

mov45h,a­

setbp1.5­

setbp1.6­

clrp1.7­

mova,45h­

lcallled_x­

lcalldelay­

ret­

­

led_x:movdptr,#led_data­

movca,@a+dptr­

movp0,a­

ret­

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

delay:movr7,#10­

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

djnzr6,$­

djnzr7,de1­

ret­

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

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

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

key_d:jnbk1,key1­

jnbk2,key2­

ret­

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

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

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

daa;十进制处理­

cjnea,#60h,k_01;判断是否为60,为60清零,跳出­

mova,#00h­

k_01:movminute,a­

jnbk1,$­

ret­

­

key2:mova,clock;时位置数同上­

clrc­

inca­

daa­

cjnea,#24h,k_11­

mova,#00h­

k_11:movclock,a­

jnbk2,$­

ret­

我的不够成熟或称之为幼稚的汇编编程,郑文老师的独特学习板子(显示数码管是p0口,片选竟然是用p1口3个I/O口接138,——!这个独特焊接方式让我程序写得这么长),郑子含老师对我置数程序的修改,才出来的程序,虽然不是什么成功,至少是一个开始,我会继续疯下去的。这个时钟的弊端挺多的,比如置数的时候,会有闪屏现象,程序我会再改进的。?

后记:对于院系电子设计竞赛我的失败我得向我的组员道歉,虽然我知道那些所谓成功的几组也比我们好不到哪里去(看过答辩了),但是我会继续我们的课题,加油吧?

编译工具:wave6000?

烧制工具:stc-isp(话说国产的stc公司要统一全球51市场,呵呵)、RS232串口

分享