找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

VFD熒光屏顯示時(shí)鐘制作 單片機(jī)匯編語(yǔ)言程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
    此程序是本人2006年正月初一在家中閑來(lái)無(wú)事,想起有好幾臺(tái)廢舊的VCD,因解碼板壞了,用不上,但上面的顯示板與外觀都很新,按鍵也是好的,當(dāng)廢品賣又不值錢(qián)。查看顯示芯片為日本的NEC的upd16312,于是就上網(wǎng)查出此芯片的資料,用AT89C2051做了一個(gè)時(shí)鐘,采用MCS51 ASM匯編程序,可使用顯示屏電路板上自帶的按鍵來(lái)設(shè)置時(shí)間,電路很簡(jiǎn)單,只要從顯示板上引出STB,CLK ,DOUT三根線到單片機(jī)的引腳即可。     程序注釋很詳細(xì),是學(xué)習(xí)匯編的好例子,下面附ASM程序:
;vfd電子鐘,cpu采用89c2051
;顯示驅(qū)動(dòng)芯片采upd16312
;晶振頻率為11.0592Mhz
        VFD_STB  BIT  P1.4         ;P1.4為upd16312 STB信號(hào)
        VFD_CLK  BIT  P1.5         ;P1.5為upd16312 CLK信號(hào)
        VFD_DOUT BIT  P1.6      ;P1.6為upd16312 DOUT信號(hào)
        KEY_BUF1 EQU  50H      ;upd16312按鍵1數(shù)據(jù)暫儲(chǔ)
        KEY_BUF2 EQU  51H       ;upd16312按鍵2數(shù)據(jù)暫儲(chǔ)
        KEY_BUF3 EQU  52H       ;upd16312按鍵3數(shù)據(jù)暫儲(chǔ)
         ORG    0000H
         AJMP   RESET                ;轉(zhuǎn)到復(fù)位
         ORG    000BH                ;定時(shí)器0中斷入口
         LJMP   CTCO                 ;定時(shí)器0中斷服務(wù)子程序
         ORG    0030H                  ;復(fù)位程序入口
RESET:   MOV    58H,#80H      ;顯示冒號(hào)
             MOV    55H,#00H      ;定時(shí)器中斷次數(shù),0F次中斷為1秒種
             MOV    5FH,#00H      ;秒十位
             MOV    5EH,#00H      ;秒個(gè)位
             MOV    5BH,#00H      ;分十位
             MOV    5AH,#00H      ;分個(gè)位
             MOV    5DH,#01H      ;時(shí)十位
             MOV    5CH,#02H      ;時(shí)個(gè)位
             MOV    SP,#1F           ;堆棧指針設(shè)為1FH
             MOV    R0,#20H
             MOV    R1,#60H
             MOV    A,#00H
RES1:    MOV    @R1,A            ;清空upd16312顯示緩沖區(qū)
            INC    R1
            DJNZ   R0,RES1
            LCALL  INI_VFD           ;調(diào)用upd16312VFD初始程序
            LCALL  UPDATA
            LCALL  WR_VFD
            MOV    TMOD,#01H     ;設(shè)定時(shí)器模式為16位定時(shí)模式
            MOV    TH0,#10H         ;設(shè)定時(shí)器0高位初值
            MOV    TL0,#10H         ;設(shè)定時(shí)器0低位初值
            MOV    IE,#82H           ;設(shè)置定時(shí)器0中斷
            SETB   TR0                   ;啟動(dòng)定時(shí)器0中斷
            AJMP   START
START:   MOV    A,55H             ;主程序開(kāi)始
             CJNE   A,#0FH,KEY      ;55H的值不是0F時(shí)轉(zhuǎn)到KEY鍵處理程序
             MOV    55H,#00H       ;定時(shí)器0中斷了0F次時(shí)為1秒,
               INC    5EH                  ;秒個(gè)位加1
               LCALL  TIME              ;調(diào)用時(shí)間計(jì)算程序
KEY:        LCALL  RD_KEY            ;調(diào)用讀取鍵值程序
               MOV    A,50H             ;鍵值1送A
               JNZ    XSK                   ;不為0有鍵按下轉(zhuǎn)到XSK
               MOV    A,51H             ;鍵值2送A
               JNZ    XSK                  ;不為0有鍵按下轉(zhuǎn)到XSK
               MOV    A,52H            ;鍵值2送A
               JZ     START     ;為0無(wú)鍵按下轉(zhuǎn)到START
XSK:        LCALL  KEYBD             ;調(diào)用按鍵處理程序
              AJMP   START      
              ORG    0100H              ;定時(shí)器0中斷處理程序入口
CTCO:    CLR    TR0                    ;暫停定時(shí)器0
             MOV    TH0,#10H      ;重置定時(shí)器0高位初值
             MOV    TL0,#10H      ;重置定時(shí)器0低位初值
             INC    55H                     ;中斷次數(shù)加1
             SETB   TR0                      ;重啟定時(shí)器0
             RETI                      ;定時(shí)器0中斷返回
             ORG    110H
INI_VFD: CLR    VFD_STB            ;初始化顯示
              MOV    A,#39H            ;upd16312
              LCALL  OUTDATA
              SETB   VFD_STB           ;顯示模式設(shè)
              NOP                           ;置命令字:
              RET                            ;5位,16 段
         ORG    120H
WR_VFD:  CLR    VFD_STB        ;寫(xiě)顯示數(shù)據(jù)
                MOV    A,#70H        ;至upd16312   
                LCALL  OUTDATA    ;數(shù)據(jù)設(shè)置
                SETB   VFD_STB       ;命令字:
                NOP                        ;正常工作、
               CLR    VFD_STB         ;地址加1方式、
               MOV    A,#0C4H       ;寫(xiě)顯示數(shù)據(jù)
               LCALL  OUTDATA      ;地址設(shè)置命
               MOV    R2,#06H        ;令字:從地
               MOV    R1,#7AH       ;址0開(kāi)始顯示
WR_VFD1: MOV    A,@R1           ;數(shù)據(jù)放在單
                 LCALL  OUTDATA      ;片機(jī)的RAM
                 INC    R1                  ;5FH~7FH
                 DJNZ   R2,WR_VFD1
                 SETB   VFD_STB
                 NOP
                CLR    VFD_STB
                MOV    A,#0BFH
                LCALL  OUTDATA     ;顯示控制
                SETB   VFD_STB        ;命令字:顯
                 RET                         ;示開(kāi)、脈沖
                ORG    150H                    ;寬度14/16
RD_KEY:  CLR    VFD_STB          ;讀upd16312 鍵值
               MOV    A,#76H            ;鍵盤(pán)數(shù)
               LCALL  OUTDATA         ;據(jù)(17鍵)
               LCALL  INDATA            ;鍵值數(shù)據(jù)存
               MOV    KEY_BUF1,A      ;儲(chǔ)器的第
               LCALL  INDATA             ;一字節(jié)給
               MOV    KEY_BUF2,A       ;KEY_BUF1
               LCALL  INDATA             ;鍵值數(shù)據(jù)
               MOV    KEY_BUF3,A       ;存儲(chǔ)器的
               SETB   VFD_STB             ;第二字節(jié)
               CLR    VFD_STB              ;給KEY_BUF2
               RET                              ;鍵值數(shù)據(jù)存
                  ORG    170H             ;儲(chǔ)器的第三
OUTDATA: MOV    R0,#08             ;字節(jié)給
                 SETB   VFD_DOUT           ;KEY_BUF3
OUTDT1:   CLR    VFD_CLK             ;傳送一
                 RRC    A                        ;個(gè)字節(jié)
                 MOV    VFD_DOUT,C
                 SETB   VFD_CLK
                 DJNZ   R0,OUTDT1
                 RET
                ORG    180H
INDATA:   MOV    R0,#08             ;讀入一
                SETB   VFD_DOUT        ;個(gè)字節(jié)
INDATA1: SETB   VFD_CLK
                CLR    VFD_CLK
                MOV    C,VFD_DOUT
                RRC    A
                DJNZ   R0,INDATA1
                RET
               ORG    190H                ;時(shí)間計(jì)算程序
TIME:      MOV    A,5EH
               CJNE   A,#0AH,EX
               MOV    5EH,#00H
               INC    5FH                    ;秒十位加1
               MOV    A,5FH
               CJNE   A,#06H,EX
               MOV    5FH,#00H
STM:       INC    5AH                   ;分個(gè)位加1
              MOV    A,5AH
              CJNE   A,#0AH,EX
              MOV    5AH,#00H
              INC    5BH                     ;分十位加1
              MOV    A,5BH
              CJNE   A,#06H,EX
              MOV    5BH,#00H
              INC    5CH                     ;時(shí)個(gè)位加1
              MOV    A,5DH
              CJNE   A,#02H,HH
              MOV    A,5CH
              CJNE   A,#04H,EX
              MOV    5CH,#00H
              MOV    5DH,#10H
              AJMP   EX
HH:        MOV    A,5CH
           CJNE   A,#0AH,EX
           MOV    5CH,#00H
           MOV    A,5DH
           CJNE   A,#10H,DE
           MOV    5DH,#01H
           LJMP   EX
DE:      INC    5DH                    ;時(shí)十位加1
EX:      XRL    58H,#80H
           LCALL  UPDATA
           MOV    A,58H
           XRL    7AH,A  
           LCALL  WR_VFD
           RET
           ORG    220H                 ;按鍵處理程序入口
KEYBD:   CLR    TR0                  ;暫停定時(shí)器0
              MOV    A,51H            ;鍵2內(nèi)容送A
              CJNE   A,#40H,DD     ;鍵2不等于40H轉(zhuǎn)到DD減鍵子程序
              LCALL  STM               ;鍵2等于40H調(diào)用加鍵子程序
              MOV    66H,#30H
WAIT1:   MOV    67H,#30H
WAIT2:   LCALL  RD_KEY
              MOV    A,51H
              CJNE    A,#40H,EXI
              DJNZ   67H, WAIT2
              DJNZ   66H,WAIT1
SADD:    LCALL  RD_KEY
              MOV    A,51H
              CJNE   A,#40H,EXI
              LCALL  STM
              LCALL  DELAY
              AJMP   SADD
DD:        MOV    A,50H              ;鍵1內(nèi)容送A
              CJNE   A,#40H,EXI        ;鍵1不等于40H轉(zhuǎn)到EXI退出子程序
              LCALL  DEE                  ;鍵1等于40H調(diào)用減鍵子程序
              LCALL  UPDATA
              LCALL  WR_VFD
              MOV    66H,#30H
WAIT4:   MOV    67H,#30H
WAIT3:   LCALL  RD_KEY
             MOV    A,50H
             CJNE   A,#40H,EXI
             DJNZ   67H,WAIT3
             DJNZ   66H,WAIT4
SDD:      LCALL  DEE
             LCALL  UPDATA
             LCALL  WR_VFD
             LCALL  RD_KEY
             LCALL  DELAY
             MOV    A,50H
             CJNE   A,#40H,EXI
             AJMP   SDD
EXI:       MOV    TH0,#10H
             MOV    TL0,#10H
             MOV    5FH,#00H
             MOV    5EH,#00H
             LCALL  UPDATA
             LCALL  WR_VFD
             SETB   TR0
              RET
             ORG    2A0H             ;減鍵程序
DEE:      MOV    A,5AH          ;檢查分個(gè)位是否為0
             JNZ    DEE3              ;不為0轉(zhuǎn)到DEE3
             MOV    5AH,#09H    ;為0則分個(gè)位寫(xiě)入9
              AJMP   DEH2          ;轉(zhuǎn)到DEH2
DEE3:    DEC    5AH              ;分個(gè)位減1
             AJMP   EXTT            ;子程序返回
DEH2:    MOV    A,5BH
             JNZ    DE1
             MOV    5BH,#05H
             MOV    A,5CH
             JNZ    DE2
             MOV    5CH,#09H
             MOV    A,5DH
             JNZ    DE3
             MOV    5DH,#02H
             MOV    5CH,#03H
DE1:     DEC    5BH                    ;分十位減1
            AJMP   EXTT
DE2:     DEC    5CH                 ;時(shí)個(gè)位減1
            AJMP   EXTT
DE3:     CJNE   A,#10H,DE4
            MOV    5DH,#02H
            MOV    5CH,#03H
            AJMP   EXTT
DE4:     DEC    5DH                  ;時(shí)十位減1
EXTT:    RET
            ORG    0600H              ;更新顯示數(shù)據(jù)
UPDATA:  MOV    R0,#5AH
                MOV    R1,#7AH
                MOV    R4,#00AH
UPDLOP:  MOV    A,@R0
                ADD     A,#06H
                MOVC   A,@A+PC
                MOV    @R1,A
                INC    R0
                INC    R1
                DJNZ   R4,UPDLOP
                RET
         ORG    610H
VFDCODE: DB     77H,24H,6BH,6DH    ;VFD顯示代碼
                 DB     3CH,5DH,5FH,64H
                 DB     7FH,7DH,7EH,1FH
                 DB     53H,2FH,5BH,5AH
                 DB     00H
         ORG    750H
DELAY:   MOV    R7,#090H       ;延時(shí)程序
LOOP1:   MOV    R6,#0A0H
LOOP2:   NOP
              DJNZ   R6,LOOP2
              DJNZ   R7,LOOP1
              RET                           ;子程序返回
             END

Snipaste_2021-05-15_09-05-26.png (41.9 KB, 下載次數(shù): 95)

電路圖

電路圖

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:126422 發(fā)表于 2021-5-23 20:15 來(lái)自觸屏版 | 只看該作者
不錯(cuò)學(xué)習(xí),現(xiàn)在vfd屏價(jià)格高,但顯示就是漂亮。
回復(fù)

使用道具 舉報(bào)

板凳
ID:477512 發(fā)表于 2021-9-14 18:39 | 只看該作者
編譯不成功,不知道怎樣改?
回復(fù)

使用道具 舉報(bào)

地板
ID:72088 發(fā)表于 2021-9-15 21:43 | 只看該作者
沒(méi)有專用時(shí)鐘芯片,斷電就要重新調(diào)整時(shí)間,沒(méi)實(shí)際用途,學(xué)習(xí)學(xué)習(xí)還是可以的
回復(fù)

使用道具 舉報(bào)

5#
ID:920755 發(fā)表于 2021-10-7 17:28 | 只看該作者

RE: VFD熒光屏顯示時(shí)鐘制作 單片機(jī)匯編語(yǔ)言程序

wbwcf13e 發(fā)表于 2021-9-14 18:39
編譯不成功,不知道怎樣改?

不知道你是用哪個(gè)編譯器的,我用Keil uVision3沒(méi)問(wèn)題

vfd.png (97.92 KB, 下載次數(shù): 77)

vfd.png
回復(fù)

使用道具 舉報(bào)

6#
ID:452662 發(fā)表于 2021-10-21 11:26 | 只看該作者
軟件是哪個(gè)呀?
回復(fù)

使用道具 舉報(bào)

7#
ID:920755 發(fā)表于 2021-10-24 05:22 | 只看該作者

Keil 各版本都可以
回復(fù)

使用道具 舉報(bào)

8#
ID:972853 發(fā)表于 2021-10-24 19:16 | 只看該作者
程序看起來(lái)有點(diǎn)暈,這也是匯編名聲不好的原因,變量就不能定義個(gè)有意義的名字嗎?除了中斷向量地址用ORG指定之外其他程序讓Keil來(lái)分配地址它不香嗎?這樣寫(xiě)程序幾K的程序已經(jīng)很考驗(yàn)?zāi)X力了,大型程序是不用想的,別說(shuō)他人看不懂自己就能把自己寫(xiě)糊涂了。建議樓主多學(xué)習(xí)一些匯編和C的偽指令,建立自己的程序框架,這樣可以像C一樣寫(xiě)匯編,我也不算高手也不是故意找樓主毛病,只是良心建議。
    比如用data關(guān)鍵字命名字節(jié)變量程序里就可以用變量名而不是5XH這樣的絕對(duì)地址了,即容易理解又便于修改,比如將來(lái)變量位置要調(diào)整時(shí)只要更改定義即可,而現(xiàn)在這樣寫(xiě)你要找出程序里所有用到該變量的地方一一修改。
    又比如你查表的方式,完全可以用DPTR裝入表地址(用標(biāo)號(hào)而不是絕對(duì)地址),A裝入偏移量,然后用MOVC  A,@A+DPTR來(lái)查表,好處就是查表指令和表地址都可以在任意位置。
    還有很多東西樓主自己慢慢去研究吧?芍囟ㄎ坏腃ODE段,多個(gè)程序文件的使用和相互間的調(diào)用等等
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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