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