找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2193|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機匯編寫的時鐘,三個按鍵分別控制時秒分加一,為什么有時按下按鍵后數(shù)碼管顯示...

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1078925 發(fā)表于 2023-5-26 15:23 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣

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,故所記次數(shù)應(yīng)為46080,計時器每隔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ū)動
                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//余數(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
                                
//延時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)象只存在于動態(tài)掃描情況下,稱為鬼影。
                //原因是掃描過快導(dǎo)致上一個字符(視覺暫留結(jié)果)顯示在當前字符上產(chǎn)生重
                //疊
                //解決辦法:增長延時,減慢掃描
                //還有一種情況:
                //若采用同時送段碼和位碼,則注意送段碼前數(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;                        //時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,故所記次數(shù)應(yīng)為46080,計時器每隔50000微秒發(fā)起一次中斷。
        mov TL0,#00h;//46080的來歷,為50000*11.0592/12
        inc pp

        reti
end
        

最佳答案

查看完整內(nèi)容

當按鍵按下時程序死循環(huán),影響到其他時序了。每個按鍵設(shè)立一個內(nèi)存,當程序確認按鍵按下時,該內(nèi)存為0 則時間加1,然后該內(nèi)存設(shè)置為1 。當按鍵松開時內(nèi)存設(shè)置為0。就是說只有按鍵按下,該內(nèi)存為0的情況下時間加1。也可以用位尋址區(qū)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:73992 發(fā)表于 2023-5-26 15:23 來自手機 | 只看該作者
當按鍵按下時程序死循環(huán),影響到其他時序了。每個按鍵設(shè)立一個內(nèi)存,當程序確認按鍵按下時,該內(nèi)存為0 則時間加1,然后該內(nèi)存設(shè)置為1 。當按鍵松開時內(nèi)存設(shè)置為0。就是說只有按鍵按下,該內(nèi)存為0的情況下時間加1。也可以用位尋址區(qū)
回復(fù)

使用道具 舉報

板凳
ID:123289 發(fā)表于 2023-5-26 17:06 | 只看該作者
顯示器是掃描顯示的吧。
這應(yīng)要求每間隔一個時間T(如5ms),就要刷新一次,否則顯示就不正常了,是吧。
當你按鍵時,是不是掃描就顧不到了,程序【停留】鍵處理上了,顯示自然就不正常了。
仔細想想是不是這樣的呢?當你DELAY的時間內(nèi),掃描是不是顧不到了。
回復(fù)

使用道具 舉報

地板
ID:1078925 發(fā)表于 2023-5-26 17:35 | 只看該作者
有一個思路,把按鍵判斷放到定時到1秒pp清零之后,這樣不會卡
回復(fù)

使用道具 舉報

5#
ID:1078925 發(fā)表于 2023-5-27 20:49 | 只看該作者
找到問題了,當按鍵按下時,定時器還在計時,如果延時使pp計數(shù)值超過20,cjne a,#20,rel無效,需要等到pp溢出才能繼續(xù)計數(shù)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表