📄 16x1.asm
字号:
SETB RS
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*************************************
;* PR_R1子程式 *
;*************************************
;将一个字幕显示在LCM,字串的起地址要存入
;R1,字串必须以00H结束
PR_R1: PUSH ACC
MOV A,@R1
LCALL WRITELCDDATA
INC R1
MOV A,@R1
LCALL WRITELCDDATA
POP ACC
RET
PR_R2: PUSH ACC
MOV A,@R1
LCALL WRITELCDDATA
POP ACC
RET
;*************************************
;* PR_DPTR子程式 *
;*************************************
;将一个字幕显示在LCM,字串的起地址要存入
;R1,字串必须以00H结束
PR_DPTR: PUSH ACC
LOOP: CLR A
MOVC A,@A+DPTR
JZ END_P
LCALL WRITELCDDATA
INC DPTR
JMP LOOP
END_P: POP ACC
RET
;****************************************************************************
;**********************************DS1302驱动程序****************************
;****************************************************************************
;时间格式如下:
; D7 D6 D5 D4 D3 D2 D1 D0 地址
;秒:| CH | 10秒 | 秒 | 000 CH=1禁止计时,=0开始计时 00~59
;分:| 0 | 10分 | 分 | 001 00~59
;时:|12/24| 0 |A\p | 时 | 时 | 010 D7=1为12小时方式,=0为24小时方式;在12小时方式,D5是A\P选取择
; 在24小时方式,D5是第性个10小时位(20~23);01~12或00~23
;日:| 0 | 0 | 10日 | 日 | 011 01~28/29或01~30或01~31
;月:| 0 | 0 | 0 | 10月| 月 | 100 01~12
;周:| 0 | 0 | 0 | 0 | 0 | 周 | 101 01~07
;年:| 10年 | 年 | 110 00~99
;*************************************
;* 写一个字节到DS1302 *
;*************************************
; 输入参数A, 占用 R2
WRBYTE: MOV R2,#08 ; 一个字节有8位
WRBYT1: RRC A
MOV IO,C
CLR SCLK
SETB SCLK
DJNZ R2,WRBYT1
RET
;*************************************
;* 从DS1302读一字节 *
;*************************************
; 输出参数A ,占用R2
RDBYTE: MOV R2, #08 ; 一个字节有8位
CLR A
SETB IO
RDBYT1: SETB SCLK
CLR SCLK
MOV C,IO
RRC A
DJNZ R2,RDBYT1
RET
;*************************************
;* DS1303复位程序 *
;*************************************
RST1302:CLR SCLK
CLR RST
SETB RST
RET
;*************************************
;* 从DS1302获取时间值 *
;*************************************
; 用到子程序: wrbyte,rdbyte
; 存放时间首址:R0(显示方式为 秒 分 时 日 月 周 年)R0为首址放秒
; 占用: R0,A
GETTIME:LCALL RST1302 ;复位程序
MOV A,#0BFH ;操作指令(时钟/日历多字节(burst)方式),允许多字节读
;最先8个时间/日历寄存器可以从地址0的第0位开始
LCALL WRBYTE ; 写指令
LCALL RDBYTE ;秒
MOV @R0,A ;
INC R0
LCALL RDBYTE ;分
MOV @R0,A
INC R0
LCALL RDBYTE ;时
MOV @R0,A
INC R0
LCALL RDBYTE ;日
MOV @R0,A
INC R0
LCALL RDBYTE ;月
MOV @R0,A
INC R0
LCALL RDBYTE ;周
MOV @R0,A
INC R0
LCALL RDBYTE ;年
MOV @R0,A
INC R0
LCALL RDBYTE ;在连续读方式下必须读完8个字节
LCALL RST1302;终止读
CLR RST
RET
;*************************************
;* 设置时间值 *
;*************************************
; 用到子程序: wrbyte,rdbyte
; 初使时间首址:R0(显示方式为 秒 分 时 日 月 周 年)R0为首址放秒
; 占用: R0,A
SETTIME:LCALL RST1302
;控制寄存器
;{ D7 D6 __ D5 D4 D3 D2 D1 D0 _}
;{ 1 , RAM/CK, A4,A3,A2,A1,A0, RAM/K}
;|0才能 | 0(存取日历)|<----地址---->| 0(写)|
;|写数据 | 1(存取RAM) | | 1(读)|
MOV A,#8EH ;控制寄存器(指令)
LCALL WRBYTE
;设定允许写数据操作
;写入命令操作(80H,禁止写;00H,允许写)
CLR A ;00H,允许写
LCALL WRBYTE
LCALL RST1302 ;复位停止操作
;设定备用电池充电模式
;写入命令操作[d4~d7=1010使用充电器,d4~d7<>1010不使用充电器;
;d2~d3=01使用一个二极管充电d2~d3=10使用两个二极管充电,d2~d3=11或00
;禁止使用充电,与d4~d7无关;d0~d1=00\01\10\11分别为选用充电阻0\2K\4K\8K
MOV A,#90H ;慢速充电寄存器(指令)
LCALL WRBYTE ;
MOV A,#00H ;;;;;;;;被改,原先为#0ABH
LCALL WRBYTE ;使用充电器,用两个二极管充电,选用8K电阻
LCALL RST1302 ;复位停止操作
;时钟/日历多字节(burst)方式
;在此方式下,最先8个时间/日历寄存器可以从地址0的第0位开始
;连续地读或写,在这方式下慢速充电寄存器是不可以被访问的
MOV A,#0BEH ;时钟/日历多字节(burst)方式
LCALL WRBYTE
;开始设定时间,可连续对前8字节进行写
MOV A,@R0
INC R0
LCALL WRBYTE ;秒
MOV A,@R0
INC R0
LCALL WRBYTE ;分
MOV A,@R0
INC R0
LCALL WRBYTE ;时
MOV A,@R0
INC R0
LCALL WRBYTE ;日
MOV A,@R0
INC R0
LCALL WRBYTE ;月
MOV A,@R0
INC R0
LCALL WRBYTE ;周
MOV A,@R0
INC R0
LCALL WRBYTE ;年
MOV A,#80H
LCALL WRBYTE ;在连续读方式下必须读完8个字节, 开写保护,禁止写数据
LCALL RST1302
CLR RST
RET
;****************************************************************************
;**********************************键盘**************************************
;****************************************************************************
;跳出此子程序时,有按键A=键值,无按键A=0FFH
;按键释放后才会跳出此程序
;4条IO口组成4*3键
;占用A,B键值0-9分别为0-9、#为11、*为10
KEY: MOV A,#0FFH ;置键值为0ffh
LCALL KEYA ;判断按键
CJNE A,#0FFH,KEYB ;无键按下返回
RET ;
KEYB:MOV B,A ;有键按下将键值存在b中
LCALL DL20MS ;调用延时
LCALL KEYA ;再调用键盘程序
CJNE A,B,KE ;比较相等不等返回
MOV B,A
KEYF:LCALL KEYA
CJNE A,#0FFH,KEYF ;等待键盘释放
MOV A,B
RET
KE: MOV A,#0FFH
RET
KEYA:SETB KEY1
SETB KEY2
SETB KEY3
SETB KEY4
CLR KEY1
JNB KEY2,K11
JNB KEY3,K0
JNB KEY4,K10
SETB KEY1
CLR KEY2
JNB KEY1,K9
JNB KEY3,K8
JNB KEY4,K7
SETB KEY2
CLR KEY3
JNB KEY1,K6
JNB KEY2,K5
JNB KEY4,K4
SETB KEY3
CLR KEY4
JNB KEY1,K3
JNB KEY2,K2
JNB KEY3,K1
SETB KEY4
MOV A,#0FFH
RET
K11: MOV A,#11
RET
K10: MOV A,#10
RET
K0: MOV A,#1
RET
K1: MOV A,#1
RET
K2: MOV A,#2
RET
K3: MOV A,#3
RET
K4: MOV A,#4
RET
K5: MOV A,#5
RET
K6: MOV A,#6
RET
K7: MOV A,#7
RET
K8: MOV A,#8
RET
K9: MOV A,#9
RET
;*************************************
;* 表格 *
;*************************************
LINE1: DB 32H,30H,00H ;20
LINE2: DB 2DH,00H ;-
LINE3: DB 57H,45H,45H,4BH,3AH,00H;WEEK
LINE4: DB 3AH,00H ;:
ASC: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,2AH,23H;0~9,*,# (ASCII)
;*************************************
;* 延时程序 *
;*************************************
DL250US:MOV R6,#5
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DL20MS: MOV R5,#8
D2: LCALL DL250US
DJNZ R5,D2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -