此程序是本人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
|