?
;*********************************************************************
;R0 單片機(jī)讀寫地址
;R1 DS1302讀寫地址
;
;
;R5/R6 延時(shí)程序的循環(huán)次數(shù)A
;R7 存儲(chǔ)單元的循環(huán)次數(shù)
;0CH及第1組寄存器的R4 讀寫數(shù)據(jù)位的循環(huán)次數(shù)
SCLK Bit P2.5 ;實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
IO Bit P2.6 ;實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
RST Bit P2.7 ;實(shí)時(shí)時(shí)鐘復(fù)位線引腳
RS BIT P2.4
RW BIT P2.3
E BIT P2.2
LCD_FLAG BIT 20H.0
Pdate EQU P0
ZZ BIT P1.0
ZF BIT P1.1
YZ BIT P1.2
YF BIT P1.3
MUSIC BIT P1.4
REDNO1 EQU 40H
REDNO2 EQU 41H
DER EQU 43H ;方向變量
MKG EQU 42H ;音樂開關(guān)變量
Second EQU 44H ;秒
Minute EQU 45H ;分
Hour EQU 46H ;時(shí)
Day EQU 47H ;日
Month EQU 48H ;月
Week EQU 49H ;星期
Year EQU 4AH ;年
ORG 0000H
SJMP MAIN
ORG 0003H
LJMP INPUT0
ORG 0030H
MAIN: MOV SP,#50H
MOV MKG,#' '
MOV DER,#' '
SETB P3.2
CLR MUSIC
SETB EX0
SETB IT0 ;下降沿申請(qǐng)中斷有效
SETB EA ;允許外部INT0申請(qǐng)中斷
MOV REDNO1,#00H
MOV REDNO2,#00H
LCALL LCD_INIT ;LCD初始化
LCALL LCD_WORD ;把自創(chuàng)字符寫入CGRAM?
;LCALL SET1302 ;第一次初始賦值之后,有備用電源就不用再初始
MAIN_1: LCALL GET1302
LCALL DISPLAY
LJMP MAIN_1
;========================================================================================================
;========================================================================================================
;========================================================================================================
;========================================================================================================
;***********************中斷服務(wù)子程序INPUT0***********************
;程序功能:接收遙控碼、解碼、控制小車運(yùn)行狀態(tài)
;入口條件:P3.2
;出口參數(shù):P1.4~P1.7
INPUT0: CLR EA ;關(guān)閉外部中斷
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
SETB RS0 ;中斷期間都是用第1組工作寄存器?
MOV REDNO1,#00H
MOV REDNO2,#00H
LCALL IRIN ;調(diào)用解碼子程序
MOV A,REDNO1
CJNE A,#0E2H,BACK ;1110 0010判斷用戶碼是否正確,不正確則退出
MOV A,REDNO2
CJNE A,#10H,KEY4
LCALL GO ;前進(jìn)
SJMP BACK
KEY4: CJNE A,#18H,KEY5
LCALL LZ ;左轉(zhuǎn)
SJMP BACK
KEY5: CJNE A,#04H,KEY6
LCALL STOP ;停止
SJMP BACK
KEY6: CJNE A,#14H,KEY9
LCALL RZ ;右轉(zhuǎn)
SJMP BACK
KEY9: CJNE A,#1CH,KEYDG
LCALL HT ;后退
SJMP BACK
KEYDG: CJNE A,#0CCH,KEYTC
LCALL DG ;點(diǎn)歌
SJMP BACK
KEYTC: CJNE A,#054H,BACK
LCALL TC ;停唱
BACK: MOV R0,#10
I5: JNB P3.2,BACK ;10MS之內(nèi)P3.2都為1再退出
LCALL DELAY882
DJNZ R0,I5
POP PSW
POP DPL
POP DPH
POP B
POP ACC
SETB EA ;開中斷
RETI ;中斷返回
;*****************************紅外遙控解碼子程序IRIN********************************
;程序功能:對(duì)接收編碼進(jìn)行解碼,獲取鍵號(hào)
;入口條件:P3.2
;出口參數(shù):REDNO1和REDNO2
;紅外線前導(dǎo)碼
IRIN: ;開始讀取操作數(shù)據(jù)
MOV R1,#REDNO1 ;讀取數(shù)據(jù)存放的初始地址
MOV R2,#2 ;REDNO1和REDNO2共2個(gè)存放數(shù)據(jù)單元
IR_8B: MOV R3,#8
IR_4B: JNB P3.2,$ ;等待高電平出現(xiàn)
LCALL DELAY882 ;間隔882us判斷P3.2的高低電平
MOV C,P3.2
JNC IR_0_1 ;C=0跳轉(zhuǎn)
LCALL DELAY1120 ;延時(shí)1120us跳過查詢下一波形
IR_0_1: MOV A,@R1
RLC A
MOV @R1,A
DJNZ R3,IR_4B ;8位用戶碼接收完了嗎?
INC R1
DJNZ R2,IR_8B ;完成識(shí)別碼、數(shù)據(jù)碼解碼
RET
;*********************判斷按鍵號(hào)后的具體操作****************
GO: SETB ZZ
CLR ZF
SETB YZ
CLR YF
MOV DER,#3H
RET
STOP: CLR ZZ
CLR ZF
CLR YZ
CLR YF
MOV DER,#' '
RET
RZ: SETB ZZ
CLR ZF
CLR YZ
CLR YF
MOV DER,#7EH;向右箭號(hào)代碼
RET
LZ: CLR ZZ
CLR ZF
SETB YZ
CLR YF
MOV DER,#7FH;向左箭號(hào)代碼
RET
HT: CLR ZZ
SETB ZF
CLR YZ
SETB YF
MOV DER,#4H
RET
DG: SETB MUSIC
MOV MKG,#'$'
RET
TC: CLR MUSIC;停唱
MOV MKG,#' '
RET
;**************300us延時(shí)子程序******************
DELAY300:
MOV R7,#130
TIM0:
NOP
NOP
DJNZ R7,TIM0
RET
;**************882us延時(shí)子程序******************
DELAY882:
MOV R7,#202
TIM1: NOP
NOP
DJNZ R7,TIM1
RET
;**************1120US延時(shí)子程序******************
DELAY1120:
MOV R7,#224
TIM2: NOP
NOP
NOP
DJNZ R7,TIM2
RET
;========================================================================================================
;========================================================================================================
;========================================================================================================
;========================================================================================================
;==========LCM初始化程序===========
LCD_INIT: ;熱啟動(dòng)
CALL DL10MS
MOV A,#38H
CLR LCD_FLAG
CALL LCD_WRC
CALL DL5MS
CALL LCD_WRC
CALL DL120US
CALL LCD_WRC
CALL DL120US
SETB LCD_FLAG;設(shè)忙
MOV A,#38H ;功能設(shè)置為2行顯示,8位數(shù)據(jù)?
ACALL LCD_WRC
MOV A,#01H
ACALL LCD_WRC
MOV A,#06H
ACALL LCD_WRC
MOV A,#0CH
ACALL LCD_WRC
RET
;==============顯示子程序============
;功 能:時(shí)鐘顯示
;入口條件:50H~ 56H ,存放秒~年
DISPLAY:MOV DPTR,#TAB
MOV A,#80H ;在第一行中間位置
CALL LCD_WRC ;寫命令
MOV A,Year
CALL CHAIZI
MOV A,#0 ;顯示年
CALL LCD_WRTD
MOV A,Month
CALL CHAIZI
MOV A,#1 ;顯示月
CALL LCD_WRTD
MOV A,Day
CALL CHAIZI
MOV A,#2 ;顯示日
CALL LCD_WRTD
MOV A,#' ' ;顯示' '
CALL LCD_WRTD
MOV A,#' '
CALL LCD_WRTD
MOV A,Week ;顯示星期
CALL CHAIZI
MOV A,#0C3H ;在第二行中間位置
CALL LCD_WRC
MOV A,Hour
CALL CHAIZI
MOV A,#':' ;顯示時(shí)間分隔符
CALL LCD_WRTD
MOV A,Minute
CALL CHAIZI
MOV A,#':' ;顯示時(shí)間分隔符
CALL LCD_WRTD
MOV A,Second
CALL CHAIZI
MOV A,#0CEH ;在第二行后面位置顯示小車行走方向
CALL LCD_WRC
MOV A,DER
CALL LCD_WRTD
MOV A,MKG ;音樂開與關(guān)
CALL LCD_WRTD
RET
;============拆字顯示==============
CHAIZI: MOV B,A ;先保存原始數(shù)據(jù)
ANL A,#0F0H;相與 ;先顯示十位
SWAP A
MOVC A,@A+DPTR
CALL LCD_WRTD
MOV A,B ;后顯示個(gè)位
ANL A,#0FH
MOVC A,@A+DPTR
CALL LCD_WRTD
RET
;=============寫命令===========
;入口地址:A
LCD_WRC:
JNB LCD_FLAG,L1 ;不忙時(shí)直接跳轉(zhuǎn)
CALL DL5MS ;等待到不忙
L1: CLR RS
CLR RW
SETB E
MOV Pdate,A
CLR E
RET
;============寫數(shù)據(jù)=============
;入口地址:A
LCD_WRTD:
CALL DL5MS ;延時(shí)代查忙
SETB RS
CLR RW
SETB E
MOV Pdate,A
CLR E
RET
;==============延時(shí)子程序===============
DL10MS: CALL DL5MS
CALL DL5MS
RET
DL5MS: MOV R6,#5
D0: MOV R5,#250
D1: NOP
NOP
DJNZ R5,D1
DJNZ R6,D0
RET
DL120US:MOV R5,#30
D2: NOP
NOP
DJNZ R5,D1
RET
;===========把自創(chuàng)字符寫入CGRAM程序==============
;=====
LCD_WORD:
MOV A,#40H ;設(shè)置CGRAM的首地址為00H
LCALL LCD_WRC ;寫命令
MOV R3,#56 ;寫入24個(gè)字符碼
MOV DPTR,#TAB1
MOV R4,#00H ;偏移量初始值
NEXT: MOV A,R4
MOVC A,@A+DPTR
LCALL LCD_WRTD
INC R4
DJNZ R3,NEXT
RET
TAB: DB '0','1','2','3','4','5','6','7','8','9'
TAB1: DB 08H,0FH,12H,0FH,0AH,1FH,02H,00H ;年
DB 0FH,09H,0FH,09H,0FH,09H,13H,00H ;月
DB 0FH,09H,09H,0FH,09H,09H,0FH,00H ;日
;向上
;-- 寬度x高度=8x8 --
DB 00H,04H,0EH,15H,04H,04H,04H,00H
;向下
;-- 寬度x高度=8x8 --
DB 04H,04H,04H,15H,0EH,04H,00H,00H
;========================================================================================================
;========================================================================================================
;========================================================================================================
;========================================================================================================
;DS1302時(shí)鐘芯片
;**********************************************************
;功 能:設(shè)置DS1302 初始時(shí)間,并啟動(dòng)計(jì)時(shí)。
;**********************************************************
SET1302:MOV Second,#38H ;給初始值
MOV Minute,#39H
MOV Hour,#18H
MOV Day,#20H
MOV Month,#12H
MOV WEEK,#01H
MOV Year,#10H
MOV A,#8EH ;寫操作寄存器
MOV B,#00H ;允許寫,將WP =0
LCALL CLOCK_WR ;調(diào)用寫子程序
MOV R0,#Second ;單片機(jī)年地址
MOV R7,#7 ;循環(huán)7次
MOV R1,#80H ;DS1302秒寫地址
S13021: MOV A,R1 ;秒 分 時(shí) 日 月 星期 年 的地址
MOV B,@R0 ;單片機(jī)地址R0所對(duì)應(yīng)的值
LCALL CLOCK_WR ;調(diào)用寫子程序
INC R0
INC R1
INC R1
DJNZ R7,S13021
MOV A,#8EH ;寫操作寄存器
MOV B,#80H ;WP=1,寫保護(hù)
LCALL CLOCK_WR
RET
Get1302:MOV A,#8DH ;年
LCALL CLOCK_RD
MOV YEAR,A
MOV A,#8BH ;星期
LCALL CLOCK_RD
MOV WEEK,A
MOV A,#89H ;月
LCALL CLOCK_RD
MOV Month,A
MOV A,#87H ;日
LCALL CLOCK_RD
MOV Day,A
MOV A,#85H ;時(shí)
LCALL CLOCK_RD
MOV Hour,A
MOV A,#83H ;分
LCALL CLOCK_RD
MOV Minute,A
MOV A,#81H ;秒
LCALL CLOCK_RD
MOV Second,A
RET
;**********************************************************
;**********************************************************
;功 能:從DS1302 讀數(shù)據(jù)子程序
;**********************************************************
;功 能:讀數(shù)據(jù)子程序 八位
;入口參數(shù):A存放要讀的數(shù)據(jù) 地址
;出口參數(shù):A存放讀取的數(shù)據(jù)
;**********************************************************
CLOCK_RD:
CLR RST
CLR SCLK
SETB RST ;選通DS1302
MOV R4,#8
Outbit1:RRC A
MOV IO,C ;通過IO口輸出一位寄存器寫地址
CLR SCLK
SETB SCLK ;發(fā)個(gè)輸出脈沖
DJNZ R4,Outbit1
CLR SCLK
NOP ;延時(shí),防止后面串行讀數(shù)據(jù)丟失
SETB IO ;將單片機(jī)對(duì)應(yīng)的IO口設(shè)為輸入端口
MOV R4,#8
Outbit2:MOV C,IO ;經(jīng)IO口讀入一位數(shù)據(jù)
RRC A ;通過IO口輸出一位寄存器寫地址
SETB SCLK
CLR SCLK
DJNZ R4,Outbit2
RET
;**********************************************************
;功 能:寫數(shù)據(jù)子程序 八位
;入口參數(shù):A/B分別存放要寫入的地址和數(shù)據(jù)
;**********************************************************
CLOCK_WR:
CLR RST
CLR SCLK
SETB RST ;選通DS1302
MOV R4,#8
Inbit1: RRC A
MOV IO,C ;通過IO口輸出一位寄存器寫地址
CLR SCLK
SETB SCLK
DJNZ R4,Inbit1
NOP
MOV A,B ;將待寫入數(shù)據(jù)送到A
MOV R4,#8
Inbit2: RRC A
MOV IO,C ;通過IO口輸出一位寄存器寫地址
CLR SCLK
SETB SCLK
DJNZ R4,Inbit2
RET
END
評(píng)論