正文

大学时代接口实验:时钟的实现2006-10-10 14:09:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sonicling/19182.html

分享到:

该程序需要与8253、8255、8259、LED、小键盘对应的asm编译结果进行连接才可以通过。 (将8255和8253、8259以及LED和小键盘的程序分别编译为obj,然后所有obj一起link。) 8255的代码:http://blog.programfan.com/article.asp?id=19179 8253+8259的代码:http://blog.programfan.com/article.asp?id=19180 LED的代码:http://blog.programfan.com/article.asp?id=19181 小键盘的代码:http://blog.programfan.com/article.asp?id=19183 .286extrn _getchar:near,_setledbuf:near,_printled:near,_setmask:near ;displayextrn _setint:near,_clrint:near ;interruptionextrn _i8255:near,_i8253:near,_i8259:near ;initializationpublic chgflg,minute,seconddseg segment para public 'DATA'MAXCT equ 20shutfg db 0hchgflg db 0hchgfg2 db 0hsetmod db 0htmask db 0hcount db MAXCTminute db 0hsecond db 0hdseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov es,ax init: call _i8253  ;初始化8253 call _i8255  ;初始化8255 call _i8259  ;初始化8259 call _inittime ;初始化初始时间 call _setint  ;设置中断向量;主循环main: call _setbuffer ;根据时间变量填写LED显示缓冲区 call _settimemask ;根据用户状态设置LED掩码 call _printled ;LED显示 call _getchar ;获取小键盘按键,返回值在AL中,AL=0ffh表示无输入 call _execchar ;根据输入的按键执行相应的操作 cmp byte ptr shutfg,0 ;shutfg=0? je main  ;如果shutfg==0就退出,否则继续循环exit: call _clrint  ;恢复原来的中断向量及8259设置 mov ax,4c00h ;退出 int 21h;初始化时间_inittime proc pusha mov byte ptr minute,0h;分=00 mov byte ptr second,0h;秒=00 popa ret_inittime endp;填写LED缓冲区_setbuffer proc pusha mov al,minute and al,0f0h  ;取分的高4位 shr al,4 mov bx,0  ;填写在缓冲区第一字节 call _setledbuf ;调用setledbuf(char code,int index) mov al,minute ;取分的低4位 and al,0fh inc bx  ;填写在缓冲区的第二字节 call _setledbuf ;调用setledbuf(char code,int index) mov al,10h  ;翻译表的第17个项为'-'符号 inc bx  ;填写在缓冲区的第三字节 call _setledbuf ;调用setledbuf(char code,int index) inc bx  ;填写缓冲区的第四字节 call _setledbuf ;调用setledbuf(char code,int index) mov al,second and al,0f0h  ;取秒的高4位 shr al,4 inc bx  ;第5字节 call _setledbuf ;调用setledbuf(char code,int index) mov al,second and al,0fh  ;取秒的低4位 inc bx  ;第6字节 call _setledbuf ;调用setledbuf(char code,int index) popa ret_setbuffer endp;根据输入执行操作_execchar proc pusha cmp al,'E' je ec_exit  ;如果输入的字符为'E'就退出 cmp al,'G' je ec_beg  ;如果输入的字符为'G'就开始计时 cmp al,'D' je ec_stop  ;如果输入的字符为'D'就停止计时 cmp al,'C' je ec_init  ;如果输入的字符为'C'就初始化时间 cmp al,'P' je ec_set  ;如果输入的字符为'P'就开始设置时间 call _inputtime ;否则的话输入的字符就被当作用来设置时间 jmp ec_ret  ;退出ec_set: call _startset ;[分支]开始设置时间 jmp ec_retec_init:call _inittime ;[分支]初始化时间 jmp ec_retec_stop:mov byte ptr chgfg2,0h ;[分支]停止计时 jmp ec_retec_beg: mov byte ptr chgfg2,1 ;[分支]设置开始计时标志 jmp ec_retec_exit:mov byte ptr shutfg,1 ;[分支]设置退出标志ec_ret: popa ret_execchar endp;设置时间_inputtime proc pusha cmp al,'0'  ;如果小于0,退出 jc it_ret cmp al,'9'+1 ;大于9也退出 jnc it_ret and al,0fh  ;ASCII -> BINARY cmp setmod,01h je set_min_1 ;如果setmod标志为1,设置分的高4位 cmp setmod,02h je set_min_2 ;如果setmod标志为2,设置分的低4位 cmp setmod,03h je set_sec_1 ;如果setmod标志为3,设置秒的高4位 cmp setmod,04h je set_sec_2 ;如果setmod标志为4,设置秒的低4位 jmp it_ret  ;否则退出set_min_1:   ;[分支]如果setmod标志为1,设置分的高4位 shl al,4 and minute,0fh or minute,al inc byte ptr setmod ;标志增长,下一次设置下一位 jmp it_retset_min_2:   ;[分支]如果setmod标志为2,设置分的低4位 and minute,0f0h or minute,al inc byte ptr setmod jmp it_retset_sec_1:   ;[分支]如果setmod标志为3,设置秒的高4位 shl al,4 and second,0fh or second,al inc byte ptr setmod jmp it_retset_sec_2:   ;[分支]如果setmod标志为4,设置秒的低4位 and second,0f0h or second,al inc byte ptr setmod jmp it_retit_ret: popa ret_inputtime endp;开始时间的设置_startset proc pusha mov setmod,1h ;setmod标志通常为0,否则将处于时间的设置状态] mov al,chgflg  mov chgfg2,al ;保存当前是否在计时 mov chgflg,0 ;无条件停止计时 mov tmask,0ffh popa ret_startset endp;设置掩码,制造闪烁效果_settimemask proc pusha cmp setmod,0h ;如果setmod==0表示没有进行设置,结束时间设置. je stm_ret3 cmp setmod,05h ;如果setmod>=5表示设置已经过时,结束时间设置. jnc stm_ret3 cmp setmod,01h ;如果setmod==1分的高位闪烁 je stm_m_1 cmp setmod,02h ;如果setmod==2分的低位闪烁 je stm_m_2 cmp setmod,03h ;如果setmod==3秒的高位闪烁 je stm_s_1 cmp setmod,04h ;如果setmod==4秒的低位闪烁 je stm_s_2 jmp stm_retstm_m_1:mov al,tmask mov bx,0 jmp stm_ret call _setmaskstm_m_2:mov al,0ffh mov bx,0 call _setmask ;恢复分的高位的掩码 mov al,tmask mov bx,1 call _setmask jmp stm_retstm_s_1:mov al,0ffh mov bx,1 call _setmask ;恢复分的低位的掩码 mov al,tmask mov bx,4 call _setmaskstm_s_2:mov al,0ffh mov bx,4 call _setmask ;恢复秒的高位的掩码 mov al,tmask mov bx,5 call _setmaskstm_ret: dec count  ;计数 jnz stm_ret2 xor tmask,0ffh ;计数值减到0就翻转掩码标志 mov count,MAXCT ;重新装入计数值stm_ret2:  popa retstm_ret3: call _endsettime ;结束时间设置 popa ret_settimemask endp;结束时间设置_endsettime proc pusha mov ax,0ffh mov cx,6est_lp: mov bx,cx  ;---- dec bx  ;将LED掩码缓冲区初始化为0ffh call _setmask loop est_lp  ;---- mov count,MAXCT mov setmod,0 ;结束时间的设置 mov al,chgfg2 mov chgflg,al ;恢复计数允许标志 popa ret_endsettime endpcseg ends end start

阅读(4543) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册