標(biāo)題: 單片機(jī)匯編寫的時(shí)鐘,三個(gè)按鍵分別控制時(shí)秒分加一,為什么有時(shí)按下按鍵后數(shù)碼管顯示... [打印本頁]

作者: weilaiweilai    時(shí)間: 2023-5-26 15:23
標(biāo)題: 單片機(jī)匯編寫的時(shí)鐘,三個(gè)按鍵分別控制時(shí)秒分加一,為什么有時(shí)按下按鍵后數(shù)碼管顯示...

shi1        equ                41h//儲(chǔ)存時(shí)1號(hào)位
shi2        equ         42h//時(shí)2號(hào)位
fen1         equ                43h//分1
fen2        equ                44h//分2
miao1        equ         45h//秒1
miao2        equ                46h//秒2

pp                equ                48h//定時(shí)器        
mm                equ                49h//秒
ff                equ                4ah//分
ss                equ                4bh//時(shí)
dula        equ         p2.6//段選
wela        equ         p2.7//位選
        
org 0000h
        jmp main
org 000bh
        jmp time0interrupt1//定時(shí)器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,故所記次數(shù)應(yīng)為46080,計(jì)時(shí)器每隔50000微秒發(fā)起一次中斷。
        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//數(shù)碼管驅(qū)動(dòng)
                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//時(shí)給a
                        mov b,#0ah//10給b
                        div ab//除
                        mov shi1,a//商給shi1
                        mov shi2,b//余數(shù)給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
                                
//延時(shí)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://數(shù)碼管顯示若顯示的數(shù)字缺胳膊少腿或三頭六臂:我都有
                //這種現(xiàn)象只存在于動(dòng)態(tài)掃描情況下,稱為鬼影。
                //原因是掃描過快導(dǎo)致上一個(gè)字符(視覺暫留結(jié)果)顯示在當(dāng)前字符上產(chǎn)生重
                //疊
                //解決辦法:增長延時(shí),減慢掃描
                //還有一種情況:
                //若采用同時(shí)送段碼和位碼,則注意送段碼前數(shù)據(jù)口要清零
        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;                        //時(shí)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的二進(jìn)制
        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,故所記次數(shù)應(yīng)為46080,計(jì)時(shí)器每隔50000微秒發(fā)起一次中斷。
        mov TL0,#00h;//46080的來歷,為50000*11.0592/12
        inc pp

        reti
end
        

作者: lyonkon    時(shí)間: 2023-5-26 15:23
當(dāng)按鍵按下時(shí)程序死循環(huán),影響到其他時(shí)序了。每個(gè)按鍵設(shè)立一個(gè)內(nèi)存,當(dāng)程序確認(rèn)按鍵按下時(shí),該內(nèi)存為0 則時(shí)間加1,然后該內(nèi)存設(shè)置為1 。當(dāng)按鍵松開時(shí)內(nèi)存設(shè)置為0。就是說只有按鍵按下,該內(nèi)存為0的情況下時(shí)間加1。也可以用位尋址區(qū)
作者: yzwzfyz    時(shí)間: 2023-5-26 17:06
顯示器是掃描顯示的吧。
這應(yīng)要求每間隔一個(gè)時(shí)間T(如5ms),就要刷新一次,否則顯示就不正常了,是吧。
當(dāng)你按鍵時(shí),是不是掃描就顧不到了,程序【停留】鍵處理上了,顯示自然就不正常了。
仔細(xì)想想是不是這樣的呢?當(dāng)你DELAY的時(shí)間內(nèi),掃描是不是顧不到了。

作者: weilaiweilai    時(shí)間: 2023-5-26 17:35
有一個(gè)思路,把按鍵判斷放到定時(shí)到1秒pp清零之后,這樣不會(huì)卡
作者: weilaiweilai    時(shí)間: 2023-5-27 20:49
找到問題了,當(dāng)按鍵按下時(shí),定時(shí)器還在計(jì)時(shí),如果延時(shí)使pp計(jì)數(shù)值超過20,cjne a,#20,rel無效,需要等到pp溢出才能繼續(xù)計(jì)數(shù)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1