我想做一個(gè)電子時(shí)鐘的程序,匯編的 自己想了很久,可以做一個(gè)從零到60秒的,但是要顯示分,時(shí),就想不出了
程序如下 a_bit equ 20h ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置 b_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置 temp equ 22h ;計(jì)數(shù)器數(shù)值存放內(nèi)存位置 org 0 ajmp star star: mov temp,#0 ;初始化計(jì)數(shù)器,從0開(kāi)始 stlop: acall display;調(diào)用顯示子程序 inc temp;對(duì)計(jì)數(shù)器加1 mov a,temp cjne a,#100,next ;判斷計(jì)數(shù)器是否滿(mǎn)100? mov temp,#0;滿(mǎn)100就清零重新開(kāi)始 next: ljmp stlop;不滿(mǎn)就循環(huán)執(zhí)行
;顯示子程序 display: mov a,temp ;將temp中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制 mov b,#10 ;10進(jìn)制/10=10進(jìn)制 div ab mov b_bit,a ;十位在a mov a_bit,b ;個(gè)位在b
mov dptr,#numtab ;指定查表啟始地址 mov r0,#4 dpl1: mov r1,#250 ; dplop: mov a,a_bit ;取個(gè)位數(shù) MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼 mov p2,a ;送出個(gè)位的7段代碼 mov p1,#02 ;開(kāi)個(gè)位顯示 acall d1ms ;顯示162微秒 mov p1,#0;關(guān)閉個(gè)位顯示,防止鬼影 mov a,b_bit ;取十位數(shù) MOVC A,@A+DPTR ;查十位數(shù)的7段代碼 mov p2,a ;送出十位的7段代碼 mov p1,#01 ;開(kāi)十位顯示 acall d1ms ;顯示162微秒 mov p1,#0;關(guān)閉十位顯示,防止鬼影 djnz r1,dplop ;循環(huán)執(zhí)行250次 djnz r0,dpl1 ;循環(huán)執(zhí)行250X4=1000次 ret
;2+2X80=162微秒,延時(shí)按12MHZ計(jì)算 D1MS: MOV R7,#80 DJNZ R7,$ ret numtab: DB 0BFH ;0 DB 086H ;1 DB 0DBH ;3 DB 0CFH ;3 DB 0E6H ;4 DB 0EDH ;5 DB 0FDH ;6 DB 087H ;7 DB 0FFH ;8 DB 0EFH ;9 DB 080H ;off
end
誰(shuí)能指點(diǎn)我能后寫(xiě)出分時(shí)的程序? 倒是我在網(wǎng)上搜索到了一個(gè),但是看不明白 :
CODE_SEG SEGMENT CODE DATA_SEG SEGMENT DATA STACK_SEG SEGMENT IDATA
K1 BIT P1.4 K2 BIT P1.5
RSEG DATA_SEG KEY_S: DS 1 KEY_V: DS 1 DIS_DIGIT: DS 1 SEC: DS 1 DIS_INDEX: DS 1 HOUR: DS 1 MIN: DS 1 SEC100: DS 1 DIS_BUF: DS 8 BUF_HOUR_H EQU DIS_BUF ; 小時(shí)十位 BUF_HOUR_L EQU DIS_BUF+1 ; 小時(shí)個(gè)位 BUF_MIN_H EQU DIS_BUF+3 ; 分十位 BUF_MIN_L EQU DIS_BUF+4 ; 分個(gè)位 BUF_SEC_H EQU DIS_BUF+6 ; 秒十位 BUF_SEC_L EQU DIS_BUF+7 ; 秒個(gè)位
RSEG STACK_SEG STACK: DS 20
;===============================================================================
CSEG AT 0000H JMP MAIN CSEG AT 0000BH LJMP TIMER0
CSEG AT 0001BH LJMP TIMER1
;===============================================================================
RSEG CODE_SEG MAIN: USING 0 MOV SP, #(STACK-1) ; MOV P0,#0FFH MOV P2,#0FFH MOV TMOD,#011H ; 定時(shí)器0, 1工作模式1, 16位定時(shí)方式 MOV TH0,#0FCH MOV TL0,#017H MOV TH1,#0DCH CLR A MOV TL1,A MOV HOUR,#12 ; CLR A ; MOV MIN,A MOV SEC,A MOV SEC100,A MOV A,HOUR MOV B,#10 DIV AB MOV DPTR,#DIS_CODE MOVC A,@A+DPTR MOV BUF_HOUR_H,A ; 時(shí)十位 MOV A,HOUR MOV B,#10 DIV AB MOV A,B MOVC A,@A+DPTR MOV BUF_HOUR_L,A ; 時(shí)個(gè)位 MOV A,MIN MOV B,#10 DIV AB MOVC A,@A+DPTR MOV BUF_MIN_H,A ; 分十位 MOV A,MIN MOV B,#10 DIV AB MOV A,B MOVC A,@A+DPTR MOV BUF_MIN_L,A ; 分個(gè)位 MOV A,SEC MOV B,#10 DIV AB MOVC A,@A+DPTR MOV BUF_SEC_H,A ; 秒十位 MOV A,SEC MOV B,#10 DIV AB MOV A,B MOVC A,@A+DPTR MOV BUF_SEC_L,A ; 秒個(gè)位 MOV BUF_HOUR_H+02H,#0BFH MOV BUF_HOUR_H+05H,#0BFH MOV DIS_DIGIT,#0FEH CLR A MOV DIS_INDEX,A MOV IE,#08AH ; 使能timer0,1 中斷 SETB TR0 SETB TR1 MOV KEY_V,#03H
::::: ::::: 寫(xiě)不下了, 就是前幾行
CODE_SEG SEGMENT CODE DATA_SEG SEGMENT DATA STACK_SEG SEGMENT IDATA
K1 BIT P1.4 K2 BIT P1.5
RSEG DATA_SEG KEY_S: DS 1 KEY_V: DS 1 DIS_DIGIT: DS 1 SEC: DS 1 DIS_INDEX: DS 1 HOUR: DS 1 MIN: DS 1 SEC100: DS 1 DIS_BUF: DS 8 BUF_HOUR_H EQU DIS_BUF ; 小時(shí)十位 BUF_HOUR_L EQU DIS_BUF+1 ; 小時(shí)個(gè)位 BUF_MIN_H EQU DIS_BUF+3 ; 分十位 BUF_MIN_L EQU DIS_BUF+4 ; 分個(gè)位 BUF_SEC_H EQU DIS_BUF+6 ; 秒十位 BUF_SEC_L EQU DIS_BUF+7 ; 秒個(gè)位
RSEG STACK_SEG STACK: DS 20
;===============================================================================
CSEG AT 0000H JMP MAIN CSEG AT 0000BH LJMP TIMER0
CSEG AT 0001BH LJMP TIMER1
;===============================================================================
RSEG CODE_SEG MAIN: USING 0
這些看不明白,以前匯編的書(shū)里面出來(lái)沒(méi)有過(guò) 忘哪位大俠詳細(xì)的解釋下
[此貼子已經(jīng)被admin于2009-7-22 22:27:47編輯過(guò)]
|