1. 求單片機程序:匯編語言數字鍾
用DS1302+單片機比較簡單 ;DS1302程序(51匯編)
;推薦
;1.每次上電,必須把秒寄存器高位(第7位)設置為0,時鍾才能走時。
;2.如果需要寫入數據和時鍾日歷信息,必須把「防寫」寄存器設置成為0
;內存數據定義
BitCnt data 3Ch ; 數據位計數器
ByteCnt data 3Dh ; 數據位元組計數器
Command data 3Eh ; 命令位元組地址
RcvDat DATA 40H ; 接收數據緩沖區
XmtDat DATA 50H ; 發送數據緩沖區
;埠位定義
IO_DATA bit P1.6 ; 數據傳送匯流排
SCLK bit P1.5; 時鍾控制匯流排
RST bit P1.7 ; 復位匯流排
RS BIT P3.5
RW BIT P3.6
EN BIT P3.7
ORG 0000H
ORG 0013H
LCALL JKS
AJMP KS
;**************************** ;main program
ORG 0030H
KS: CLR RST
MOV SP,#2AH
;----LCD初始化----
CLR EN ;使能端為0,液晶執行命令
INIT_LCD:
MOV A,#38H ;雙列顯示,字形5*7點陣
ACALL WCOM
ACALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點陣
ACALL WCOM
ACALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點陣
ACALL WCOM
ACALL DELAY1
MOV A,#0CH ;開顯示,關游標
ACALL WCOM
ACALL DELAY1
MOV A,#01H ;清除 LCD 顯示屏
ACALL WCOM
ACALL DELAY1
MOV A,#06H ;地址加1
ACALL WCOM
ACALL DELAY1
;------------------------------------初始化1302-------------------------
SET1302:
LCALL Write_Enable;寫允許
LCALL Osc_Disable
LCALL Write_Multiplebyte;初始化1302,將我們要設定的數據寫入
LCALL Read_Multiplebyte;將我們設定的數據讀出來
LCALL Osc_Enable
START:
ACALL LCD
LCALL Read_Multiplebyte
AJMP START
;---------------------LCD顯示-------------------------
LCD:
MOV A,#11001000B
LCALL WCOM
MOV A,#0;顯示時間
MOV A,42H
LCALL SSH2
MOV A,#00111010B
LCALL WDATA
MOV A,41H
LCALL SSH2
MOV A,#00111010B
LCALL WDATA
MOV A,40H
LCALL SSH2
MOV A,#11000000B
LCALL WCOM
MOV A,#0;顯示日期字元
MOV A,46H
LCALL SSH2
MOV A,#00101101B
LCALL WDATA
MOV A,44H
LCALL SSH2
MOV A,#00101101B
LCALL WDATA
MOV A,43H
LCALL SSH2
RET
SSH2:
MOV B,#16
DIV AB
MOV 58H,B
MOV 59H,A
MOV A,59H
MOV DPTR,#TAB
MOVC A,@A+DPTR
ACALL WDATA
MOV A,58H
MOV DPTR,#TAB
MOVC A,@A+DPTR
ACALL WDATA
RET
;-----------------------------------------------------
; 寫指令、數據使能子程序
;-----------------------------------------------------
WCOM: ;寫指令使能
ACALL DELAY0
MOV P0,A
CLR RS
CLR RW
CLR EN
CLR EN
CLR EN
SETB EN
RET
WDATA: ;寫數據使能
ACALL DELAY0
MOV P0,A
SETB RS ;RS=H,RW=L,D0-D7=數據,E=高脈沖
CLR RW
CLR EN
CLR EN
CLR EN
SETB EN
RET
;****判忙音****
DELAY0:
MOV P0,#0FFH
CLR RS
SETB RW
CLR EN
NOP
SETB EN
JB P0.7,DELAY0
RET
TAB:DB 00110000B,00110001B,00110010B,00110011B
DB 00110100B,00110101B,00110110B,00110111B
DB 00111000B,00111001B
;********************************************************************************************
;發送數據程序
;名稱:Send_Byte
;描述:發送ByteCnt 個位元組給被控器DS1302
;命令位元組地址在Command 中
;所發送數據的位元組數在ByteCnt 中發送的數據在XmtDat 緩沖區中
;********************************************************************************************
Send_Byte:
CLR RST ;復位引腳為低電平所有數據傳送終止
NOP
CLR SCLK; 清時鍾匯流排
NOP
SETB RST ;復位引腳為高電平邏輯控制有效
NOP
MOV A,Command; 准備發送命令位元組
MOV BitCnt,#08h ;傳送位數為8
S_Byte0:
RRC A ;將最低位傳送給進位位C
MOV IO_DATA,C ;位傳送至數據匯流排
NOP
SETB SCLK ;時鍾上升沿發送數據有效
NOP
CLR SCLK ;清時鍾匯流排
DJNZ BitCnt,S_Byte0 ;位傳送未完畢則繼續
NOP
S_Byte1: ;准備發送數據
MOV A,@R0 ;傳送數據過程與傳送命令相同
MOV BitCnt,#08h
S_Byte2:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte2
INC R0 ;發送數據的內存地址加1
DJNZ ByteCnt,S_Byte1 ;位元組傳送未完畢則繼續
NOP
CLR RST ;邏輯操作完畢清RST
RET
;***************************************************************************************
;接收數據程序;
;名稱:Receive_Byte
;描述:從被控器DS1302 接收ByteCnt 個位元組數據
;命令位元組地址在Command 中
;所接收數據的位元組數在ByteCnt 中接收的數據在RcvDat 緩沖區中
;***********************************************************************************
Receive_Byte:
CLR RST ;復位引腳為低電平所有數據傳送終止
NOP
CLR SCLK ;清時鍾匯流排
NOP
SETB RST ;復位引腳為高電平邏輯控制有效
MOV A,Command ;准備發送命令位元組
MOV BitCnt,#08h ;傳送位數為8
R_Byte0:
RRC A ;將最低位傳送給進位位C
MOV IO_DATA,C ;位傳送至數據匯流排
NOP
SETB SCLK ;時鍾上升沿發送數據有效
NOP
CLR SCLK ;清時鍾匯流排
DJNZ BitCnt,R_Byte0 ;位傳送未完畢則繼續
NOP
R_Byte1: ;准備接收數據
CLR A ;清類加器
CLR C ;清進位位C
MOV BitCnt,#08h ;接收位數為8
R_Byte2:
NOP
MOV C,IO_DATA ;數據匯流排上的數據傳送給C
RRC A ;從最低位接收數據
SETB SCLK ;時鍾匯流排置高
NOP
CLR SCLK ;時鍾下降沿接收數據有效
DJNZ BitCnt,R_Byte2 ;位接收未完畢則繼續
MOV @R1,A ;接收到的完整數據位元組放入接收內存緩沖區
INC R1 ;接收數據的內存地址加1
DJNZ ByteCnt,R_Byte1 ;位元組接收未完畢則繼續
NOP
CLR RST ;邏輯操作完畢清RST
RET
;--防寫寄存器操作------------------------------------------
Write_Enable:
MOV Command,#8Eh ;命令位元組為8E
MOV ByteCnt,#1 ;單位元組傳送模式
MOV R0,#XmtDat ;數據地址覆給R0
MOV XmtDat,#00h ;數據內容為0 寫入允許
ACALL Send_Byte ;調用寫入數據子程序
RET
;當防寫寄存器的最高位為1 時禁止數據寫入寄存器---------------
Write_Disable:
MOV Command,#8Eh ;命令位元組為8E
MOV ByteCnt,#1 ;單位元組傳送模式
MOV R0,#XmtDat ;數據地址覆給R0
MOV XmtDat,#80h ;數據內容為80h 禁止寫入
ACALL Send_Byte ;調用寫入數據子程序
RET ;返回調用本子程序處
;當把秒寄存器的第7 位時鍾停止位設置為0 時起動時鍾開始---------
Osc_Enable:
MOV Command,#80h ; 命令位元組為80
MOV ByteCnt,#1 ; 單位元組傳送模式
MOV R0,#XmtDat ;數據地址覆給R0
MOV XmtDat,#00h ;數據內容為0 振盪器工作允許
ACALL Send_Byte ;調用寫入數據子程序
RET ;返回調用本子程序處
;當把秒寄存器的第7 位時鍾停止位設置為1 時時鍾振盪器停止HT1380 進入低功耗方式---------------
Osc_Disable:
MOV Command,#80h ;命令位元組為80
MOV ByteCnt,#1 ;單位元組傳送模式
MOV R0,#XmtDat ;數據地址覆給R0
MOV XmtDat,#80h ;數據內容為80h 振盪器停止
ACALL Send_Byte ;調用寫入數據子程序
RET ;返回調用本子程序處
;寫入00 年6 月21 日星期三13 時59 分59---------------------
Write_Multiplebyte:
MOV Command,#0BEh ;命令位元組為BEh
MOV ByteCnt,#8 ;多位元組寫入模式此模塊為8 個
MOV R0,#XmtDat ;數據地址覆給R0
MOV XmtDat,#59h ;秒單元內容為59h
MOV XmtDat+1,#59h ;分單元內容為59h
MOV XmtDat+2,#13h ;時單元內容為13h
MOV XmtDat+3,#21h ;日期單元內容為21h
MOV XmtDat+4,#06h ;月單元內容為06h
MOV XmtDat+5,#03h ;星期單元內容為03h
MOV XmtDat+6,#0 ;年單元內容為00h
MOV XmtDat+7,#0 ;防寫單元內容為00h
ACALL Send_Byte ;調用寫入數據子程序
RET ;返回調用本子程序處
;讀出寄存器0-7 的內容程序設置如下
Read_Multiplebyte:
MOV Command,#0BFh ;命令位元組為BFh
MOV ByteCnt,#8 ;多位元組讀出模式此模塊為8 個
MOV R1,#RcvDat ;數據地址覆給R1
ACALL Receive_Byte; 調用讀出數據子程序
RET; 返回調用本子程序處
DELAY1: ;延時10MS
MOV 21H,#75
D2: MOV 22H,#100
DJNZ 22H,$
DJNZ 21H,D2
RET
;=============================================================================================
END