?? ckock1.asm
字號:
;第七部分:DS12C887時鐘實驗
;文件名稱:DS12887_1.ASM 時間讀,寫實驗
NAME DS12887_1
$NOLIST
$INCLUDE(LJD_2008.INC)
$INCLUDE(LCD.INC)
$LIST
;-------------------------------------------------------
SECOND_BUFFER EQU 51H ;秒緩沖區
MINUTE_BUFFER EQU 52H ;分緩沖區
HOUR_BUFFER EQU 53H ;時秒緩沖區
WEEK_BUFFER EQU 50H ;星期緩沖區
DATE_BUFFER EQU 54H ;日緩沖區
MONTH_BUFFER EQU 55H ;月緩沖區
YEAR_BUFFER EQU 56H ;年緩沖區
CENTURY_BUFFER EQU 57H ;世紀緩沖區
;=======================================================
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#60H
MOV R0,#57H
CALL INITIAL_GLCD ;調用LCD初始化
CALL WRITETIME
LOOP: CALL READTIME
CALL RTC_LCD
CALL DELAY500
AJMP LOOP
;========================================================
WRITETIME: PUSH DPH ;
PUSH DPL
PUSH ACC
MOV DPTR,#REG_A ;開啟振蕩器和允許計時
MOV A,#00100000B
MOVX @DPTR,A
MOV DPTR,#REG_B ;設定SET=1,禁止更新數據
MOV A,#10000000B
MOVX @DPTR,A
MOV DPTR,#SECOND ;設定秒
MOV A,SECOND_BUFFER
MOVX @DPTR,A
MOV DPTR,#MINUTE ;設定分
MOV A,MINUTE_BUFFER
MOVX @DPTR,A
MOV DPTR,#HOUR ;設定時
MOV A,HOUR_BUFFER
MOVX @DPTR,A
MOV DPTR,#WEEK ;設定星期
MOV A,WEEK_BUFFER
MOVX @DPTR,A
MOV DPTR,#DATE ;設定日
MOV A,DATE_BUFFER
MOVX @DPTR,A
MOV DPTR,#MONTH ;設定月
MOV A,MONTH_BUFFER
MOVX @DPTR,A
MOV DPTR,#YEAR ;設定年
MOV A,YEAR_BUFFER
MOVX @DPTR,A
MOV DPTR,#CENTURY ;設定世紀
MOV A,CENTURY_BUFFER
MOVX @DPTR,A
MOV DPTR,#REG_B ;設定SET=0,BCD模式,24小時制
MOV A,#00000010B
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
READTIME: PUSH DPL
PUSH DPH
PUSH ACC
MOV DPTR,#REG_A ;讀取寄存器 A
RTCBUSY: MOVX A,@DPTR
JB ACC.7,RTCBUSY ;測試UIP位,如果UIP=0;則執行以下程序
MOV DPTR,#SECOND ;讀取秒數據
MOVX A,@DPTR
MOV SECOND_BUFFER,A
MOV DPTR,#MINUTE ;讀取分數據
MOVX A,@DPTR
MOV MINUTE_BUFFER,A
MOV DPTR,#HOUR ;讀取時數據
MOVX A,@DPTR
MOV HOUR_BUFFER,A
MOV DPTR,#WEEK ;讀取星期數據
MOVX A,@DPTR
MOV WEEK_BUFFER,A
MOV DPTR,#DATE ;讀取日數據
MOVX A,@DPTR
MOV DATE_BUFFER,A
MOV DPTR,#MONTH ;讀取月數據
MOVX A,@DPTR
MOV MONTH_BUFFER,A
MOV DPTR,#YEAR ;讀取年數據
MOVX A,@DPTR
MOV YEAR_BUFFER,A
MOV DPTR,#CENTURY ;讀取世紀數據
MOVX A,@DPTR
MOV CENTURY_BUFFER,A
POP ACC
POP DPH
POP DPL
RET
;
;
;
RTC_LCD:
MOV ADDR1,#00H ;第一行顯示
MOV N1,#08H
MOV DPTR,#DHZTAB0
CALL DHZ
MOV ADDR1,#10H ;第二行顯示
MOV N1,#08H
MOV DPTR,#DHZTAB1
CALL DHZ
MOV DPTR,#DHZTAB2 ;第三行顯示
MOV ADDR1,#08H
MOV N1,#08
CALL DHZ
MOV DPTR,#DHZTAB3 ;第四行顯示
MOV ADDR1,#18H
MOV N1,#08
CALL DHZ
LP2: MOV R4,#07H
MOV DPTR,#TAB
PUSH DPL
PUSH DPH
LP1: POP DPH
POP DPL
MOV A,#00H
MOVC A,@A+DPTR
INC DPTR
PUSH DPL
PUSH DPH
MOV ADDR1,A
MOV N1,#02H
MOV A,@R0
MOV 3DH,A
CALL LDHZ
DEC R0
DJNZ R4,LP1
POP DPH
POP DPL
MOV R0,#57H
RET
TAB: DB 10H,11H,13H,15H,09H,0BH,0DH,1EH
DHZTAB0: DB " 現 在 時 間"
DHZTAB1: DB " 年 月 日 "
DHZTAB2: DB " 時 分 秒 "
DHZTAB3: DB " 星 期 五 "
;--------------------------------------------------------------------
;顯示漢字16X16點陣
DHZ: MOV ADDR,ADDR1 ; 開始行位置
MOV B,N1 ; 顯示數量
DHZ1: MOV A,ADDR;
ORL A,#80H ; 送顯示地址
LCALL COMMAND_GLCD ;調寫命令子程序
DHZ2: CLR A
MOVC A,@A+DPTR ; 查找漢字的高位碼
INC DPTR
LCALL WRITE_GLCD ; 送顯示
CLR A
MOVC A,@A+DPTR ; 查找漢字的低位碼
INC DPTR
LCALL WRITE_GLCD ; 送顯示
DJNZ B,DHZ2
RET
LDHZ: MOV ADDR,ADDR1 ; 開始行位置
;MOV B,N1 ; 顯示數量
LDHZ1: MOV A,ADDR;
ORL A,#80H ; 送顯示地址
LCALL COMMAND_GLCD
LDHZ3: MOV A,3DH
LDHZ2: LCALL HEX_LCD
;DJNZ B,LDHZ3
RET
;--------------------------------------------------------------------
;---------------------------------------------------------
;點陣式 LCD(128X64)模塊顯示實驗
;以下是公共的程序:
;----------------------------------------------------------
;執行 LCD 初始化工作
INITIAL_GLCD:
PUSH ACC
MOV A,#30H ;功能設定
CALL COMMAND_GLCD
MOV A,#30H ;功能設定
CALL COMMAND_GLCD
MOV A,#30H ;功能設定
CALL COMMAND_GLCD
MOV A,#06H ;顯示器控制:游標不顯示;但是字會閃爍
CALL COMMAND_GLCD
MOV A,#01H ;清除顯示器
CALL COMMAND_GLCD
MOV A,#0CH ;進入模式設定
CALL COMMAND_GLCD
POP ACC
RET
;---------------------------------------------------------------
;檢查LCD 忙碌標志
CHKBUSY_GLCD:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#R_B_GLCD
CHK$: MOVX A,@DPTR
JB ACC.7,CHK$ ;判別是不是忙?
POP ACC
POP DPL
POP DPH
RET
;---------------------------------------------------------------
;寫命令到 GLCD
COMMAND_GLCD:
PUSH DPH
PUSH DPL
CALL CHKBUSY_GLCD ;判別是不是忙?
MOV DPTR,#W_C_GLCD
MOVX @DPTR,A ;寫入命令
POP DPL
POP DPH
RET
;---------------------------------------------------------------
;寫資料到 GLCD
WRITE_GLCD:
PUSH DPH
PUSH DPL
CALL CHKBUSY_GLCD ;判別是不是忙?
MOV DPTR,#W_D_GLCD ;寫入數據
MOVX @DPTR,A
POP DPL
POP DPH
RET
;--------------------------------------------------------------------
;清除 LCD 的顯示幕
CLEAR_GLCD:
PUSH ACC
MOV A,#01H ;清除顯示器
CALL COMMAND_GLCD
POP ACC
RET
;--------------------------------------------------------------------
;將 ACC 內容,以十六進制值顯示
HEX_LCD:
PUSH DPH
PUSH DPL
PUSH ACC
PUSH ACC
SWAP A ;高低四位元交換
ANL A,#0FH ;留下低四位元
MOV DPTR,#ASCII_CODE ;DPTR 指到 ASCII_CODE
MOVC A,@A+DPTR ;取得 ASCII 碼
CALL WRITE_GLCD ;寫到 LCD
POP ACC
ANL A,#0FH ;留下低四位元
MOVC A,@A+DPTR ;取得 ASCII 碼
CALL WRITE_GLCD ;寫到 LCD
POP ACC
POP DPL
POP DPH
RET
ASCII_CODE: DB '0123456789ABCDEF'
;--------------------------------------------
;延時子程序
DELAY: PUSH TIMER1; 延時TIMER1*1 ms for 12MHz
PUSH TIMER0
DELAY1: MOV TIMER0,#250 ;循環一次需要4個機器周期,時間為4*1μS
DELAY2: NOP ; 1個周期
NOP ; 1個周期
DJNZ TIMER0,DELAY2 ;2個周期
DJNZ TIMER1,DELAY1
POP TIMER0
POP TIMER1
RET
NOP;--------------------
DELAY01: NOP; 延時 1 ms
PUSH TIMER1
MOV TIMER1,#01H
LCALL DELAY
POP TIMER1
RET
NOP;--------------------
DELAY10: NOP; 延時 10 ms
PUSH TIMER1
MOV TIMER1,#10
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY100: NOP; 延時100 ms
PUSH TIMER1
MOV TIMER1,#100
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY250: NOP; 延時 250 ms
PUSH TIMER1
MOV TIMER1,#250
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY500: NOP; 延時 500 ms
PUSH TIMER1
MOV TIMER1,#250
LCALL DELAY
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY1S: NOP; 延時 1 sec
PUSH TIMER1
MOV TIMER1,#250
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
END
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -