📄 hex.asm
字号:
;地址常量定义
E EQU P3.0 ;使能端,当E端由高电平跳变为低电平时,液晶模块执行命令
RW EQU P3.1 ;读写信号线,高电平时进行读操作,低电平时进行写操作
RS EQU P3.2 ;寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器
SCLK EQU P3.5 ;串行时钟输入端
IO EQU P3.6 ;串行数据输入、输出端
RST EQU P3.7 ;控制端。高电平使能读/写操作;低电平禁止读/写操作
SPEAK EQU P0.0 ;定时器定时时间到响
LED1 EQU P0.1 ;LED1亮表示定时器1工作
LED2 EQU P0.3 ;LED2亮表示定时器2工作
LED3 EQU P0.5 ;LED3亮表示定时器3工作
LED4 EQU P0.7 ;LED4亮表示工作在定时器状态,灯灭表示工作在日期时间状态
;标志定义与资源分配
SZSJ BIT 20H.0 ;是否设置时间位,1不设置,0设置
KSZT BIT 20H.1 ;开始暂停,1开始,0暂停
PAND BIT 20H.2 ;当SZSJ、KSZT同时为1时,PAND为1,设置定时器时间有效
KG1 BIT 20H.3 ;KG1=1,定时器开,KG1=0,定时器关
KG2 BIT 20H.4 ;KG2=1,定时器开,KG2=0,定时器关
KG3 BIT 20H.5 ;KG3=1,定时器开,KG3=0,定时器关
DSSJ BIT 20H.6 ;DSSJ 为0,处于定时器状态,为1处于时钟状态
XUAN BIT 20H.7 ;XUAN为1,处于暂停状态,在地址0CDH显示的标志$,XUAN为0,清除地址0CDH显示的标志$
SN1 BIT 2FH.0 ;SN1 为0,显示定时器剩余时间,为1显示超时时间
SN2 BIT 2FH.1 ;SN2 为0,显示定时器剩余时间,为1显示超时时间
SN3 BIT 2FH.2 ;SN3 为0,显示定时器剩余时间,为1显示超时时间
;变量定义与资源分配
S1S DATA 4AH ;定时器1 秒的存放单元
S2M DATA 4BH ;定时器2 分的存放单元
S2S DATA 4CH ;定时器2 秒的存放单元
S3M DATA 4DH ;定时器3 分的存放单元
S3S DATA 4EH ;定时器3 秒的存放单元
SZ123 DATA 4FH ;SZ123为1,设置定时器1,为2,设置定时器2,为3,设置定时器3
XS DATA 56H ;用于设置定时器
XSSS DATA 57H ;用于设置日期时间
DS1302DATA DATA 58H ;存放DS1302数据的单元
DS1302ADDR DATA 59H ;存放DS1302命令的单元
SEC DATA 60H ;时钟秒存放单元
MIN DATA 61H ;时钟分存放单元
HR DATA 62H ;时钟时存放单元
WEEK DATA 63H ;时钟星期存放单元
DAY DATA 64H ;时钟日存放单元
MONTH DATA 65H ;时钟月存放单元
YEAR DATA 66H ;时钟年存放单元
;向量区
ORG 0000H ;复位起始地址
LJMP MAIN ;至主程序
ORG 000BH ;定时器/计数器0工作在定时状态
LJMP TIME0 ;至定时中断子程序
ORG 0030H ;程序代码由地址30H开始执行
MAIN:
LCALL INIT
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV SP,#70H ;设置堆栈首地址
CLR DSSJ
CLR SN1
CLR SN2
CLR SN3
CLR XUAN ;XUAN为0,清除地址0CDH显示的标志
SETB KSZT ; KSZT为1,处于开始状态,为0处于暂停状态
SETB SZSJ ;SZSJ为1,处于不设置时间的状态,为0处于设置时间的状态
SETB KG1 ;定时器1开
SETB KG2 ;定时器2开
SETB KG3 ;定时器3开
MOV DS1302ADDR,#8EH ;初始化DS1302
MOV DS1302DATA,#00H ;开写保护,允许写DS1302
LCALL WRITE
MOV DS1302ADDR,#90H ;DS1302充电,选R1=2K,1个二极管
MOV DS1302DATA,#0A5H
LCALL WRITE
MOV TMOD,#01H ;定时器/计数器0工作在方式1(16位)
MOV TH0,#3CH ;定时50000微秒中断一次
MOV TL0,#0AFH
MOV S1S,#20H ;给定时器1赋初值
MOV S2M,#00H ;给定时器2赋初值
MOV S2S,#40H
MOV S3M,#00H ;给定时器3赋初值
MOV S3S,#18H
MOV 5CH,#10H ;中断20次为1秒
LCALL INIT ;调用初始化LCD1602液晶显示器子程序
LCALL WENZI ; 调用自定义字库
MOV YEAR,#08H
MOV DS1302ADDR,#8CH ;写入DS1302年的值的命令码
MOV DS1302DATA,YEAR ;写入DS1302年的值
LCALL WRITE
MOV MONTH,#06H
MOV DS1302ADDR,#88H ;写入DS1302月的值的命令码
MOV DS1302DATA,MONTH ;写入DS1302月的值
LCALL WRITE
MOV DAY,#03H
MOV DS1302ADDR,#86H ;写入DS1302日的值的命令码
MOV DS1302DATA,DAY ;写入DS1302月的值
LCALL WRITE
MOV HR,#09H
MOV DS1302ADDR,#84H ;写入DS1302时的值的命令码
MOV DS1302DATA,HR ;写入DS1302时的值
LCALL WRITE
MOV MIN,#08H
MOV DS1302ADDR,#82H ;写入DS1302分的值的命令码
MOV DS1302DATA, MIN ;写入DS1302分的值
LCALL WRITE
MOV SEC,#09H
MOV DS1302ADDR,#80H ;写入DS1302秒的值的命令码
MOV DS1302DATA, SEC ;写入DS1302秒的值
LCALL WRITE
MOV WEEK,#03H
MOV DS1302ADDR,#8AH ;写入DS1302星期的值的命令码
MOV DS1302DATA, WEEK ;写入DS1302星期的值
LCALL WRITE
SETB EA ; CPU中断允许
SETB ET0 ;允许定时器/计数器0申请中断
SETB TR0 ;定时器/计数器0开始工作
LCALL DISP1 ;显示定时器1
LCALL DISP2 ;显示定时器2
LCALL DISP3 ;显示定时器3
START: LCALL ROW4 ;转到扫描定时器/时钟切换键是否按下,不按下显示定时器的值
JB DSSJ,DSSJ2 ;DSSJ若为0,则显示定时器的值.DSSJ若为1,则显示日期时间值
CLR LED4 ;LED4亮表示显示为定时器时间,灭表示日期时钟时间
LCALL DISP1 ;显示定时器1
LCALL DISP2 ;显示定时器2
LCALL DISP3 ;显示定时器3
LCALL ROW1
LCALL ROW2
LCALL ROW3
LJMP START
DSSJ2: SETB LED4
MOV DS1302ADDR,#8DH ;读出年
LCALL READ
MOV YEAR,DS1302DATA
MOV DS1302ADDR,#8BH ;读出星期
LCALL READ
MOV WEEK ,DS1302DATA
MOV DS1302ADDR,#89H ;读出月
LCALL READ
MOV MONTH,DS1302DATA
MOV DS1302ADDR,#87H ;读出日
LCALL READ
MOV DAY,DS1302DATA
MOV DS1302ADDR,#85H ;读出小时
LCALL READ
MOV HR,DS1302DATA
MOV DS1302ADDR,#83H ;读出分钟
LCALL READ
MOV MIN,DS1302DATA
MOV DS1302ADDR,#81H ;读出秒
LCALL READ
MOV SEC,DS1302DATA
MOV A,#80H ;日期开始显示地址
LCALL ENABLE
LCALL DISPRQ ;显示日期
MOV A,#0C0H ;时间开始显示地址
LCALL ENABLE
LCALL DISPSJ ;显示时间
MOV A,#0CBH ;星期开始显示地址
LCALL ENABLE
LCALL WEEKCHL ;调用星期处理程序
LCALL DISPWEEK ;显示星期
LCALL ROW2 ;调用设置日期时间子程序
LJMP START
ROW4: MOV P2,#0EFH ;定时器状态与时钟状态切换键
MOV A,P2
CJNE A,#0EFH,KEYRS
RET
KEYRS: CJNE A,#0EEH,EXITT
LCALL DELAY
MOV A,P2
CJNE A,#0EFH,EXITT
MOV A,#01H
LCALL ENABLE
MOV A,#00H
LCALL ENABLE
CPL DSSJ ;DSSJ若为0,则显示定时时间.DSSJ若为1,则显示日期时间.
CPL TR0
CLR SN1 ;定时器处于显示剩余时间状态
CLR SN2
CLR SN3
EXITT: RET
INIT: MOV A,#00H ;清屏并光标复位
LCALL ENABLE ;调用写入命令子程序
MOV A,#01H
LCALL ENABLE
MOV A,#38H ;设置显示模式,8位双行5*7点阵
LCALL ENABLE ;调用写入命令子程序
MOV A,#0CH ; 显示器开显示,光标无闪烁
LCALL ENABLE
MOV A,#06H ; 文字不动,光标自动右移
LCALL ENABLE
RET
DISPWEEK: ;星期显示子程序,67H,68H,69H分别显示星期英文第一、二、三个字母,第一个为大写
MOV A,67H
LCALL DISPABLE
MOV A,68H
LCALL DISPABLE
MOV A,69H
LCALL DISPABLE
RET
WRITE: CLR SCLK ;单字节写命令/数据到DS1302
NOP
SETB RST
NOP
MOV A,DS1302ADDR
MOV R4,#8H
WRITE1: RRC A
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE1
CLR SCLK
NOP
MOV A,DS1302DATA
MOV R4,#8H
WRITE2: RRC A
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE2
CLR RST
RET
READ: CLR SCLK ;单字节读命令/数据
NOP
NOP
SETB RST
NOP
MOV A,DS1302ADDR
MOV R4,#8H
READ1: RRC A
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R4,READ1
MOV R4,#8H
READ2: CLR SCLK
NOP
NOP
NOP
MOV C,IO
NOP
NOP
NOP
NOP
NOP
RRC A
NOP
NOP
NOP
NOP
SETB SCLK
NOP
DJNZ R4,READ2
MOV DS1302DATA,A
CLR RST
RET
DISPRQ: MOV 2DH,#20H ;显示日期子程序
MOV 2CH,#20H
MOV 2BH,#02H ;日字的代码
MOV R2,DAY
MOV A,#0FH
ANL A,R2
ADD A,#30H
MOV 2AH,A ;存日的低位
MOV A,R2
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 29H,A ;存日的高位
MOV 28H,#01H ;月字的代码
MOV R2,MONTH
MOV A,#0FH
ANL A,R2
ADD A,#30H
MOV 27H,A ;存月的低位
MOV A,R2
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 26H,A ;存月的高位
MOV 25H,#00H ;年字的代码
MOV R2,YEAR
MOV A,#0FH
ANL A,R2
ADD A,#30H
MOV 24H,A ;存年的低位
MOV A,R2
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 23H,A ;存年的高位
MOV 22H,#30H ;显示0
MOV 21H,#32H ;显示2
MOV R1,#21H
BB1: MOV A,@R1
LCALL DISPABLE
INC R1
CJNE R1,#2DH,BB1
RET
DISPSJ: PUSH ACC ;显示时间程序
PUSH PSW
MOV R1,#30H
MOV R0,#HR
MOV R5,#03H
DD: MOV A,@R0
SWAP A
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1
MOV @R1,#3AH ;冒号的代码
INC R1
DEC R0
DJNZ R5,DD
MOV R1,#30H
AA: MOV A,@R1
LCALL DISPABLE
INC R1
CJNE R1,#38H,AA
POP PSW
POP ACC
RET
ENABLE: MOV P1,A ;LCD写入命令子程序
CLR RS
CLR RW
CLR E
LCALL BUZYCHECK
SETB E
RET
BUZYCHECK: ;判断液晶显示器是否忙的子程序
MOV P1,#0FFH
CLR RS
SETB RW
CLR E
SETB E
JB P1.7,BUZYCHECK ;如果P1.7为高电平表示忙就循环等待
RET
DISPABLE: ;LCD显示数据使能程序
MOV P1,A
SETB RS
CLR RW
CLR E
LCALL BUZYCHECK ;调用判断液晶显示器是否忙的子程序
SETB E ;显示完成,程序停车
RET
WEEKCHL: ;星期处理程序,外国的星期日为第一天,所以DAY为1时为星期日,2为星期一,依此类推
MOV A,WEEK
CJNE A,#02H,NEXT ;Mon
MOV 67H,#4DH
MOV 68H,#6FH
MOV 69H,#6EH
RET
NEXT: CJNE A,#03H,NEXT1 ;Tue
MOV 67H,#54H
MOV 68H,#75H
MOV 69H,#65H
RET
NEXT1: CJNE A,#04H,NEXT2 ;Wed
MOV 67H,#57H
MOV 68H,#65H
MOV 69H,#64H
RET
NEXT2: CJNE A,#05H,NEXT3 ;Thu
MOV 67H,#54H
MOV 68H,#68H
MOV 69H,#75H
RET
NEXT3: CJNE A,#06H,NEXT4 ;Fri
MOV 67H,#46H
MOV 68H,#72H
MOV 69H,#69H
RET
NEXT4: CJNE A,#07H,NEXT5 ;Sat
MOV 67H,#53H
MOV 68H,#61H
MOV 69H,#74H
RET
NEXT5: MOV 67H,#53H ;其它为Sun
MOV 68H,#75H
MOV 69H,#6EH
RET
KK1: MOV C,PAND
ANL C,KG1 ;PAND、KG1 同时为1定时器1才工作
JC KK11
LJMP OUT11
KK11: MOV A,S1S
JB SN1,SH1 ;SN1为1说明了定时器1时间到,顺序显示超时时间
SNPD: CJNE A,#00H,NET1
CLR SPEAK ;开蜂鸣器
CLR LED1 ; LED1亮表示定时器1定时时间到
SETB SN1 ;定时器1定时时间到,SN1置1
SH1: MOV A,S1S
ADD A,#01H ;顺序显示超时时间
DA A
MOV S1S,A
CJNE A,#60H,OUT11
MOV S1S,#00H
SJMP OUT11
NET1: ANL A,#0FH ;倒计时显示定时器1剩余时间
CJNE A,#00H,BD1
MOV A,S1S
ADD A,#09H
SWAP A
DEC A
SWAP A
MOV S1S,A
LJMP OUT11
BD1: DEC S1S
OUT11: RET
DISP1: MOV A,#80H ;显示定时器1时间子程序
LCALL ENABLE
MOV 31H,#31H ;1表示定时器1
JB KG1,K1
MOV 32H,#07H ;关,表示定时器1不工作
JMP G1
K1: MOV 32H,#06H ;开,表示定时器1工作
G1: MOV R2,S1S
MOV A,#0FH
ANL A,R2
ADD A,#30H
MOV 34H,A
MOV A,R2
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 33H,A
MOV 35H,#04H ;表示秒
MOV 36H,#05H
MOV R1,#31H
DS1: MOV A,@R1
LCALL DISPABLE
INC R1
CJNE R1,#37H,DS1
RET
KK2: MOV C,PAND
ANL C,KG2 ;PAND、KG2 同时为1定时器2才工作
JC KK22
LJMP OUT22
KK22: MOV A,S2S
JB SN2,SH2 ;SN2为1说明了定时器2时间到,顺序显示超时时间
CJNE A,#00H,NET2
CJNE A,S2M,NET22
CLR SPEAK ;开蜂鸣器
CLR LED2 ; LED2亮表示定时器2定时时间到
SETB SN2 ;定时器2定时时间到,SN2置1
LJMP OUT22
SH2: MOV A,S2S
ADD A,#01H ;顺序显示超时时间
DA A
MOV S2S,A
CJNE A,#60H,OUT22
MOV S2S,#00H
LJMP OUT22
NET2: ANL A,#0FH ;倒计时显示定时器2剩余时间处理程序
CJNE A,#00H,BD2
MOV A,S2S
ADD A,#09H
SWAP A
DEC A
SWAP A
MOV S2S,A
SJMP OUT22
NET22: MOV S2S,#59H
MOV A,S2M
ANL A,#0FH
CJNE A,#00H,BD22
MOV A,S2M
ADD A,#09H
SWAP A
DEC A
SWAP A
MOV S2M,A
LJMP OUT22
BD22:DEC S2M
SJMP OUT22
BD2: DEC S2S
OUT22: RET
DISP2: ;显示定时器2时间子程序
MOV A,#87H
LCALL ENABLE
MOV 37H,#32H
JB KG2,K2
MOV 38H,#07H ;关,表示定时器2不工作
LJMP G2
K2: MOV 38H,#06H ;开,表示定时器2工作
G2: MOV R2,S2M
MOV A,#0FH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -