找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3659|回复: 7
收起左侧

VFD荧光屏显示时钟制作 单片机汇编语言程序

[复制链接]
ID:920755 发表于 2021-5-15 07:39 | 显示全部楼层 |阅读模式
    此程序是本人2006年正月初一在家中闲来无事,想起有好几台废旧的VCD,因解码板坏了,用不上,但上面的显示板与外观都很新,按键也是好的,当废品卖又不值钱。查看显示芯片为日本的NEC的upd16312,于是就上网查出此芯片的资料,用AT89C2051做了一个时钟,采用MCS51 ASM汇编程序,可使用显示屏电路板上自带的按键来设置时间,电路很简单,只要从显示板上引出STB,CLK ,DOUT三根线到单片机的引脚即可。     程序注释很详细,是学习汇编的好例子,下面附ASM程序:
;vfd电子钟,cpu采用89c2051
;显示驱动芯片采upd16312
;晶振频率为11.0592Mhz
        VFD_STB  BIT  P1.4         ;P1.4为upd16312 STB信号
        VFD_CLK  BIT  P1.5         ;P1.5为upd16312 CLK信号
        VFD_DOUT BIT  P1.6      ;P1.6为upd16312 DOUT信号
        KEY_BUF1 EQU  50H      ;upd16312按键1数据暂储
        KEY_BUF2 EQU  51H       ;upd16312按键2数据暂储
        KEY_BUF3 EQU  52H       ;upd16312按键3数据暂储
         ORG    0000H
         AJMP   RESET                ;转到复位
         ORG    000BH                ;定时器0中断入口
         LJMP   CTCO                 ;定时器0中断服务子程序
         ORG    0030H                  ;复位程序入口
RESET:   MOV    58H,#80H      ;显示冒号
             MOV    55H,#00H      ;定时器中断次数,0F次中断为1秒种
             MOV    5FH,#00H      ;秒十位
             MOV    5EH,#00H      ;秒个位
             MOV    5BH,#00H      ;分十位
             MOV    5AH,#00H      ;分个位
             MOV    5DH,#01H      ;时十位
             MOV    5CH,#02H      ;时个位
             MOV    SP,#1F           ;堆栈指针设为1FH
             MOV    R0,#20H
             MOV    R1,#60H
             MOV    A,#00H
RES1:    MOV    @R1,A            ;清空upd16312显示缓冲区
            INC    R1
            DJNZ   R0,RES1
            LCALL  INI_VFD           ;调用upd16312VFD初始程序
            LCALL  UPDATA
            LCALL  WR_VFD
            MOV    TMOD,#01H     ;设定时器模式为16位定时模式
            MOV    TH0,#10H         ;设定时器0高位初值
            MOV    TL0,#10H         ;设定时器0低位初值
            MOV    IE,#82H           ;设置定时器0中断
            SETB   TR0                   ;启动定时器0中断
            AJMP   START
START:   MOV    A,55H             ;主程序开始
             CJNE   A,#0FH,KEY      ;55H的值不是0F时转到KEY键处理程序
             MOV    55H,#00H       ;定时器0中断了0F次时为1秒,
               INC    5EH                  ;秒个位加1
               LCALL  TIME              ;调用时间计算程序
KEY:        LCALL  RD_KEY            ;调用读取键值程序
               MOV    A,50H             ;键值1送A
               JNZ    XSK                   ;不为0有键按下转到XSK
               MOV    A,51H             ;键值2送A
               JNZ    XSK                  ;不为0有键按下转到XSK
               MOV    A,52H            ;键值2送A
               JZ     START     ;为0无键按下转到START
XSK:        LCALL  KEYBD             ;调用按键处理程序
              AJMP   START      
              ORG    0100H              ;定时器0中断处理程序入口
CTCO:    CLR    TR0                    ;暂停定时器0
             MOV    TH0,#10H      ;重置定时器0高位初值
             MOV    TL0,#10H      ;重置定时器0低位初值
             INC    55H                     ;中断次数加1
             SETB   TR0                      ;重启定时器0
             RETI                      ;定时器0中断返回
             ORG    110H
INI_VFD: CLR    VFD_STB            ;初始化显示
              MOV    A,#39H            ;upd16312
              LCALL  OUTDATA
              SETB   VFD_STB           ;显示模式设
              NOP                           ;置命令字:
              RET                            ;5位,16 段
         ORG    120H
WR_VFD:  CLR    VFD_STB        ;写显示数据
                MOV    A,#70H        ;至upd16312   
                LCALL  OUTDATA    ;数据设置
                SETB   VFD_STB       ;命令字:
                NOP                        ;正常工作、
               CLR    VFD_STB         ;地址加1方式、
               MOV    A,#0C4H       ;写显示数据
               LCALL  OUTDATA      ;地址设置命
               MOV    R2,#06H        ;令字:从地
               MOV    R1,#7AH       ;址0开始显示
WR_VFD1: MOV    A,@R1           ;数据放在单
                 LCALL  OUTDATA      ;片机的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                         ;示开、脉冲
                ORG    150H                    ;宽度14/16
RD_KEY:  CLR    VFD_STB          ;读upd16312 键值
               MOV    A,#76H            ;键盘数
               LCALL  OUTDATA         ;据(17键)
               LCALL  INDATA            ;键值数据存
               MOV    KEY_BUF1,A      ;储器的第
               LCALL  INDATA             ;一字节给
               MOV    KEY_BUF2,A       ;KEY_BUF1
               LCALL  INDATA             ;键值数据
               MOV    KEY_BUF3,A       ;存储器的
               SETB   VFD_STB             ;第二字节
               CLR    VFD_STB              ;给KEY_BUF2
               RET                              ;键值数据存
                  ORG    170H             ;储器的第三
OUTDATA: MOV    R0,#08             ;字节给
                 SETB   VFD_DOUT           ;KEY_BUF3
OUTDT1:   CLR    VFD_CLK             ;传送一
                 RRC    A                        ;个字节
                 MOV    VFD_DOUT,C
                 SETB   VFD_CLK
                 DJNZ   R0,OUTDT1
                 RET
                ORG    180H
INDATA:   MOV    R0,#08             ;读入一
                SETB   VFD_DOUT        ;个字节
INDATA1: SETB   VFD_CLK
                CLR    VFD_CLK
                MOV    C,VFD_DOUT
                RRC    A
                DJNZ   R0,INDATA1
                RET
               ORG    190H                ;时间计算程序
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                   ;分个位加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                     ;时个位加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                    ;时十位加1
EX:      XRL    58H,#80H
           LCALL  UPDATA
           MOV    A,58H
           XRL    7AH,A  
           LCALL  WR_VFD
           RET
           ORG    220H                 ;按键处理程序入口
KEYBD:   CLR    TR0                  ;暂停定时器0
              MOV    A,51H            ;键2内容送A
              CJNE   A,#40H,DD     ;键2不等于40H转到DD减键子程序
              LCALL  STM               ;键2等于40H调用加键子程序
              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内容送A
              CJNE   A,#40H,EXI        ;键1不等于40H转到EXI退出子程序
              LCALL  DEE                  ;键1等于40H调用减键子程序
              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          ;检查分个位是否为0
             JNZ    DEE3              ;不为0转到DEE3
             MOV    5AH,#09H    ;为0则分个位写入9
              AJMP   DEH2          ;转到DEH2
DEE3:    DEC    5AH              ;分个位减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                 ;时个位减1
            AJMP   EXTT
DE3:     CJNE   A,#10H,DE4
            MOV    5DH,#02H
            MOV    5CH,#03H
            AJMP   EXTT
DE4:     DEC    5DH                  ;时十位减1
EXTT:    RET
            ORG    0600H              ;更新显示数据
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       ;延时程序
LOOP1:   MOV    R6,#0A0H
LOOP2:   NOP
              DJNZ   R6,LOOP2
              DJNZ   R7,LOOP1
              RET                           ;子程序返回
             END

电路图

电路图

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:126422 发表于 2021-5-23 20:15 来自手机 | 显示全部楼层
不错学习,现在vfd屏价格高,但显示就是漂亮。
回复

使用道具 举报

ID:477512 发表于 2021-9-14 18:39 | 显示全部楼层
编译不成功,不知道怎样改?
回复

使用道具 举报

ID:72088 发表于 2021-9-15 21:43 | 显示全部楼层
没有专用时钟芯片,断电就要重新调整时间,没实际用途,学习学习还是可以的
回复

使用道具 举报

ID:920755 发表于 2021-10-7 17:28 | 显示全部楼层

RE: VFD荧光屏显示时钟制作 单片机汇编语言程序

wbwcf13e 发表于 2021-9-14 18:39
编译不成功,不知道怎样改?

不知道你是用哪个编译器的,我用Keil uVision3没问题
vfd.png
回复

使用道具 举报

ID:452662 发表于 2021-10-21 11:26 | 显示全部楼层
软件是哪个呀?
回复

使用道具 举报

ID:920755 发表于 2021-10-24 05:22 | 显示全部楼层

Keil 各版本都可以
回复

使用道具 举报

ID:972853 发表于 2021-10-24 19:16 | 显示全部楼层
程序看起来有点晕,这也是汇编名声不好的原因,变量就不能定义个有意义的名字吗?除了中断向量地址用ORG指定之外其他程序让Keil来分配地址它不香吗?这样写程序几K的程序已经很考验脑力了,大型程序是不用想的,别说他人看不懂自己就能把自己写糊涂了。建议楼主多学习一些汇编和C的伪指令,建立自己的程序框架,这样可以像C一样写汇编,我也不算高手也不是故意找楼主毛病,只是良心建议。
    比如用data关键字命名字节变量程序里就可以用变量名而不是5XH这样的绝对地址了,即容易理解又便于修改,比如将来变量位置要调整时只要更改定义即可,而现在这样写你要找出程序里所有用到该变量的地方一一修改。
    又比如你查表的方式,完全可以用DPTR装入表地址(用标号而不是绝对地址),A装入偏移量,然后用MOVC  A,@A+DPTR来查表,好处就是查表指令和表地址都可以在任意位置。
    还有很多东西楼主自己慢慢去研究吧。可重定位的CODE段,多个程序文件的使用和相互间的调用等等
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表