📄 ds1302ok.asm
字号:
CLR T_RST
DJNZ R7,Get13021
RET
;;写1302 1 B 子程序
RTInputByte:
MOV R4,#8
Inbit1: MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
CLR T_CLK
DJNZ R4,Inbit1
RET
;;读1302 1B子程序
RT0utputByte:
MOV R4,#8
Outbit1: MOV C,T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4,Outbit1
RET
;============================================================================
;=================字符转换程序,使压缩BCD变为非压缩BCD码=====================
CHANGE: PUSH A ;存放顺序为低位在低字节,高位在高字节
MOV R5,#7
MOV R0,#SECOND
MOV R1,#SEC_LCD1
C_LOOP: MOV A,@R0
MOV B,A
ANL A,#0FH
CLR C
ADD A,#30H
MOV @R1,A
INC R1
MOV A,B
SWAP A
ANL A,#0FH
CLR C
ADD A,#30H
MOV @R1,A
INC R0
INC R1
DJNZ R5,C_LOOP
POP A
RET
;=================================================================================
;====================DATA,TIME DISPLAY program====================================
TIME_DISPLAY:
MOV FIRST_ADD,#07H ;显示位置第三行第七
MOV FIRST_LIN,#03H
MOV START_ADD,#00H
ACALL LCDPOS ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
ACALL LCDWC
MOV A,SEC_LCD2
ACALL LCDWD
MOV A,SEC_LCD1
ACALL LCDWD
MOV FIRST_ADD,#05H
MOV FIRST_LIN,#03H
MOV START_ADD,#00H
ACALL LCDPOS
MOV A, START_ADD
ACALL LCDWC
MOV A,MIN_LCD4
ACALL LCDWD
MOV A,MIN_LCD3
ACALL LCDWD
MOV FIRST_ADD,#03H
MOV FIRST_LIN,#03H
MOV START_ADD,#00H
ACALL LCDPOS
MOV A, START_ADD
ACALL LCDWC
MOV A,HOR_LCD6
ACALL LCDWD
MOV A,HOR_LCD5
ACALL LCDWD
MOV FIRST_ADD,#03H ;星期显示位置
MOV FIRST_LIN,#02H
MOV START_ADD,#00H
ACALL LCDPOS
MOV A, START_ADD
ACALL LCDWC
MOV R3,#05
MOV A,WEEK_LCD11
SUBB A,#30H
MOV B,#10
MUL AB
MOV B,A
MOV DPTR,#WEEK_TAB
WEEK_LOOP:
MOVC A,@A+DPTR
ACALL LCDWD
MOV A,B
INC DPTR
MOVC A,@A+DPTR
ACALL LCDWD
MOV A,B
INC DPTR
DJNZ R3,WEEK_LOOP
MOV FIRST_ADD,#06H ;设定日期显示位置
MOV FIRST_LIN,#01H
MOV START_ADD,#00H
ACALL LCDPOS
MOV A, START_ADD
ACALL LCDWC
MOV A,DAT_LCD8
ACALL LCDWD
MOV A,DAT_LCD7
ACALL LCDWD
MOV FIRST_ADD,#04H
MOV FIRST_LIN,#01H
MOV START_ADD,#00H
ACALL LCDPOS
MOV A, START_ADD
ACALL LCDWC
MOV A,MON_LCD10
ACALL LCDWD
MOV A,MON_LCD9
ACALL LCDWD
MOV FIRST_ADD,#01H
MOV FIRST_LIN,#01H
MOV START_ADD,#00H
ACALL LCDPOS
MOV A, START_ADD
ACALL LCDWC
MOV A,YEAR_LCD14
ACALL LCDWD
MOV A,YEAR_LCD13
ACALL LCDWD
RET
WEEK_TAB: DB "ERROR!!!!!"
DB "Mon/星期一"
DB "Tue/星期二"
DB "Wed/星期三"
DB "Thu/星期四"
DB "Fri/星期五"
DB "Sat/星期六"
DB "Sun/星期日"
DB " "
;=================================================================================
HZKLIB: ;显示汉字子程序
MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
;设置firstadd可以从任意位置显示
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #TAB ;需要显示汉字机内码数据表
MOV HZK_WID,#08H ;每行显示汉字个数
MOV HZK_LIN,#04H ;显示行数
MOV START_ADD,#00H ;清首个显示地址缓存单元
ACALL HZK_DISP ;调用汉字显示子程序
RET
HZK_DISP: ;汉字显示子程序
MOV R1,HZK_WID
HZK10: ACALL LCDPOS ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
ACALL LCDWC
HZK11: CLR A ;因为要连续输入机内码高位(区码)、低位(位码)
MOVC A, @A+DPTR ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
ACALL LCDWD ;DATA LCDWC
INC DPTR ;显示地址会自动加一,如果连续写就不用再输入地址,空白可用某空白汉字或字符代替
CLR A
MOVC A, @A+DPTR
ACALL LCDWD
;LCALL DELAY03 ;延时一下让字一个一个显示(spillar)
INC DPTR
DJNZ R1,HZK11
MOV R1,HZK_WID ;调整显示长度
INC FIRST_LIN ;跳到下一行
DJNZ HZK_LIN,HZK10
RET
LCDRESET:
ACALL DELAY ;延时
;首先选择基本指令集
MOV A, #30H ;30---基本指令操作
ACALL LCDWC
MOV A,#30H ;使用8位控制界面
ACALL LCDWC
ACALL DELAY01
MOV A, #01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
ACALL LCDWC ;
ACALL DELAY01
MOV A, #06H ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
ACALL LCDWC
MOV A,#0CH ;显示状态选择,整体显示ON
CALL LCDWC
ACALL DELAY01
RET
;---------------------------------------------------------
;SEARCH ADDRESS -
;目的是为了转换地址单元为DDRAM地址单元,以方便 -
;定义显示位置 -
;汉字显示DDRAM位置为:第一行:80H----87H -
; 第二行:90H----97H -
; 第三行:88H----8FH -
; 第四行:98H----9FH -
;---------------------------------------------------------
LCDPOS: PUSH DPH ;地址转换子程序
PUSH DPL
PUSH A
MOV DPTR,#LINE_ADD ;LINE-ADD为地址表指针
MOV A,FIRST_LIN
MOVC A,@A+DPTR
ADD A,FIRST_ADD
MOV START_ADD,A
POP A
POP DPL
POP DPH
RET
LINE_ADD:
DB 00H,80H,90H,88H,98H,00H
READ: MOV P3, #0FCH ;读数据子程序
;P3--CONTRAL I/O
NOP ;P3=11111011B RS=1 R/W=1 READ DATA
SETB E ;E=E(I/O)
LCALL DELAY01
MOV A, P0 ;P1=DATA(I/O)
NOP
CLR E
RET
CHK_BUSY: PUSH ACC
CLR RS ;读忙状态子程序
SETB RW
SETB E
CHK_B: NOP
JB P0.7,CHK_B
CLR E
POP ACC
RET
LCDWD: ;写数据子程序
LCALL CHK_BUSY ;P3--CONTRAL I/O
NOP ;RS=1 RW=0 WRITE DATA
SETB RS
CLR RW
SETB E ;E=1
MOV P0, A ;P1=DATA(I/O)
LCALL DELAY01
NOP
CLR E
NOP
MOV P0,#0FFH
RET
LCDWC: ;写指令子程序
LCALL CHK_BUSY ;以确保上一指令/数据模块已经接收处理完
NOP ;RS=0 WRITE INSTRUTION
CLR RS ;RW=0
CLR RW
SETB E ;E=1
MOV P0, A ;P1=DATA(I/O)
LCALL DELAY01
NOP
CLR E
NOP
MOV P0,#0FFH
RET
;****************************按键声音处理************************
SPKER: CLR P2.1
ACALL DELAY03
SETB P2.1
RET
DELAY: ; 延时子程序
MOV R5,#03H
DE_1: MOV R6,#0FFH
DE_2: MOV R7,#0FFH
DE_3: DJNZ R7,DE_3
DJNZ R6,DE_2
NOP
NOP
DJNZ R5, DE_1
RET
DELAY01: MOV R6, #6
DE_A: MOV R7, #0Fh
DE_B: DJNZ R7, DE_B
DJNZ R6, DE_A
RET
DELAY02: MOV R6, #50H
DE_A1: MOV R7, #0FFH
DE_B1: DJNZ R7, DE_B1
DJNZ R6, DE_A1
RET
DELAY03: MOV R5,#01H
DE_6: MOV R6,#0BFH
DE_4: MOV R7,#0BFH
DE_5: DJNZ R7,DE_5
DJNZ R6,DE_4
NOP
NOP
DJNZ R5,DE_6
RET
TAB: DB "20 年// 月 日"
DB "Week-- "
DB "Time-- : : "
DB "TEL:13462320202 "
DB 00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -