5212N3`A]X75~V)5W_}V]%F.png (81.36 KB, 下載次數: 51)
下載附件
2023-5-26 15:29 上傳
shi1 equ 41h//儲存時1號位
shi2 equ 42h//時2號位
fen1 equ 43h//分1
fen2 equ 44h//分2
miao1 equ 45h//秒1
miao2 equ 46h//秒2
pp equ 48h//定時器
mm equ 49h//秒
ff equ 4ah//分
ss equ 4bh//時
dula equ p2.6//段選
wela equ p2.7//位選
org 0000h
jmp main
org 000bh
jmp time0interrupt1//定時器0,
org 0030h
main:
mov shi1,#01h//初始化
mov shi2,#02h
mov fen1,#00h
mov fen2,#00h
mov miao1,#00h
mov miao2,#00h
mov pp,#00h
mov ss,#0ch
mov ff,#00h
mov mm,#00h
mov TMOD,#01h;//模式1
mov TH0,#4ch;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
mov TL0,#00h;//46080的來歷,為50000*11.0592/12
setb ET0;
setb EA;
setb TR0
disp:
shijia:jnb p2.0,xiaodou1
jmp fenjia
xiaodou1:lcall DELAY5MS
anxia1:jnb p2.0,anxia1
inc ss
fenjia:jnb p2.1,xiaodou2
jmp miaojia
xiaodou2:lcall DELAY5MS
anxia2:jnb p2.1,anxia2
inc ff
miaojia:jnb p2.2,xiaodou3
jmp disp2
xiaodou3:lcall DELAY5MS
anxia3:jnb p2.2,anxia3
inc mm
disp2:
lcall display//數碼管驅動
mov a,pp
cjne a,#14h,disp//判斷pp是否加了20次,即1s
mov pp,#00h//加到了,清零
miao: inc mm//秒+1
mov a,mm
cjne a,#3ch,go1//判斷秒是否到60
mov mm,#00h//到了,秒清零,
jmp fen//且分加一
go1: jmp disp1//沒到,直接顯示
fen: inc ff//分加一
mov a,ff
cjne a,#3ch,go2
mov ff,#00h
jmp shi
go2: jmp disp1
shi: inc ss
mov a,ss
cjne a,#18h,go3//是否到24
mov ss,#00h
go3: jmp disp1
disp1: mov a,ss//時給a
mov b,#0ah//10給b
div ab//除
mov shi1,a//商給shi1
mov shi2,b//余數給shi2
mov a,ff
mov b,#0ah
div ab
mov fen1,a
mov fen2,b
mov a,mm
mov b,#0ah
div ab
mov miao1,a
mov miao2,b
jmp disp
//延時1ms
delay5: ;@11.0592MHz
DELAY1MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#9
MOV 31H,#150
NEXT1MS:
DJNZ 31H,NEXT1MS
DJNZ 30H,NEXT1MS
POP 31H
POP 30H
RET
DELAY5MS: ;@11.0592MHz
NOP
NOP
PUSH 30H
PUSH 31H
MOV 30H,#44
MOV 31H,#2
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
display://數碼管顯示若顯示的數字缺胳膊少腿或三頭六臂:我都有
//這種現象只存在于動態掃描情況下,稱為鬼影。
//原因是掃描過快導致上一個字符(視覺暫留結果)顯示在當前字符上產生重
//疊
//解決辦法:增長延時,減慢掃描
//還有一種情況:
//若采用同時送段碼和位碼,則注意送段碼前數據口要清零
MOV dptr,#smg //shi1,段選
mov a,shi1
MOVC A,@A+dptr
clr dula
mov P0,#00h;
setb dula;
mov P0,a;
clr dula;
clr wela; //時1位選
mov P0,#0feh;
setb wela;
clr wela;
lcall delay5;
mov a,shi2 //shi2
MOVC A,@A+dptr
mov P0,#00h;
setb dula;
mov P0,a;
clr dula;
mov P0,#0fdh;
setb wela;
clr wela;
lcall delay5;
mov P0,#00h; //-
setb dula;
mov P0,#01000000b;
clr dula;
mov P0,#0fbh;
;mov P0,#0ffh;
setb wela;
clr wela;
lcall delay5;
mov a,fen1 //fen1
MOVC A,@A+dptr
mov P0,#00h;
setb dula;
mov P0,a;
clr dula;
mov P0,#0f7h;
setb wela;
clr wela;
lcall delay5;
mov a,fen2 //fen2
MOVC A,@A+dptr
mov P0,#00h;
setb dula;
mov P0,a;
clr dula;
mov P0,#0efh;
setb wela;
clr wela;
lcall delay5;
mov P0,#00h;; //-
setb dula;
mov P0,#01000000b
clr dula;
mov P0,#0dfh;
;mov P0,#0ffh;
setb wela;
clr wela;
lcall delay5;
mov a,miao1 //miao1
MOVC A,@A+dptr
mov P0,#00h;
setb dula;
mov P0,a;
clr dula;
mov P0,#0bfh;
setb wela;
clr wela;
lcall delay5;
mov a,miao2 //miao2
MOVC A,@A+dptr
mov P0,#00h;
setb dula;
mov P0,a;
clr dula;
mov P0,#7fh;
setb wela;
clr wela;
lcall delay5;
RET
smg://從0到f的二進制
db 00111111b//0
db 00000110b//1
db 01011011b//2
db 01001111b//3
db 01100110b//4
db 01101101b//5
db 01111101b//6
db 00000111b//7
db 01111111b//8
db 01101111b//9
db 01110111b//a//+
db 01111100b//b//-
db 00111001b//c//*
db 01011110b//d//÷
db 01111001b//e//=
db 01110001b//f//清空
ret
time0interrupt1:
mov TH0,#4ch;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
mov TL0,#00h;//46080的來歷,為50000*11.0592/12
inc pp
reti
end
|