|
此程序是本人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
|
評(píng)分
-
查看全部評(píng)分
|