我想做一個(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開始
stlop: acall display;調(diào)用顯示子程序
inc temp;對(duì)計(jì)數(shù)器加1
mov a,temp
cjne a,#100,next ;判斷計(jì)數(shù)器是否滿100?
mov temp,#0;滿100就清零重新開始
next: ljmp stlop;不滿就循環(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 ;開個(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 ;開十位顯示
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)我能后寫出分時(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
:::::
:::::
寫不下了,
就是前幾行
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
謝謝!
我最近也做了個(gè)電子鐘匯編的。一個(gè)小小的功能還真遇到不少問(wèn)題。
首先,延時(shí)一秒不能只是延時(shí),因?yàn)閱纹瑱C(jī)是單進(jìn)程的,延時(shí)要和數(shù)碼管動(dòng)態(tài)掃描結(jié)合在一起進(jìn)行。
顯示前的十進(jìn)制轉(zhuǎn)換 DA A 也有好多要注意,主要在CJNE的使用上會(huì)出問(wèn)題。
我在考慮用定時(shí)中斷做,應(yīng)該會(huì)輕松些。
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |