📄 clock-mine.asm
字号:
ByteCnt DATA 28H ;I2C总线收发字节计数器
SlvAdr DATA 29H ;从器件地址(控制信息)
SubAdr DATA 2AH ;对于32Kbit(4BK)存储容量及以上器件来说,待读写
;单元地址为两字节,分别存放SubAdr、SubAdr+1单元中
KEYSTU DATA 2BH ;键盘按键状态寄存器,其中b2、b1、b0分别记录最近
KEYNAME DATA 2DH ;b0,b1位记录按键值
;b7作为按键有效标志,b7为0时,键值无效。
;b7为1时,按键值有效,且未尚未处理,不能
;接受新按键。
;外部程序执行了按键功能后,将按键有效标志清0,允许接收新按键
RcvDat DATA 30H ;接收数据缓冲区(长度为8字节)
XmtDat DATA 38H ;发送数据缓冲区(长度为8字节)
FHbit BIT 00H ;发送及接收成功标志存放在00H位单元中。0表示成功;
;1表示失败
NOACK BIT 01H ;读操作时主器件非应答标志位,1表示非应答,0表示应答。
T40 BIT 02H ;40ms时间到标志
ENTER BIT 03H ;确认键按下标志
ALARM BIT 04H ;闹钟开启标志
C_5S BIT 05H ;5S到标志
C_2S BIT 06H ;2S到标志
SCL BIT P1.0 ;模拟I2C总线时钟信号, 输出
SDA BIT P1.1 ;模拟I2C总线数据/地址引脚,双向
RS BIT P2.5 ;决定要传送的是命令还是数据
RW BIT P2.6 ;决定要读还是写,一般写的时候多
E BIT P2.7 ;时钟信号
BEE BIT P2.0
;***********************定义LCD显示缓冲区地址******************
YER1 EQU 40H
YER0 EQU 41H
MON1 EQU 42H
MON0 EQU 43H
DAY1 EQU 44H
DAY0 EQU 45H
WEK EQU 46H
HOU1 EQU 47H
HOU0 EQU 48H
MIN1 EQU 49H
MIN0 EQU 4AH
SEC1 EQU 4BH
SEC0 EQU 4CH
;************************定义按键位*********************
SW BIT P1.7 ;定义P1.7调整键
UP BIT P1.6 ;定义P1.6加一键
DOWN BIT P1.5 ;定义P1.5减一键
CONF BIT P1.4 ;定义P1.4键为确认键
COUNT EQU 4DH ;判别选择键按的次数
;***********************定义闹钟缓冲区地址******************
C_WEK EQU 50H
C_HOU1 EQU 51H
C_HOU0 EQU 52H
C_MIN1 EQU 53H
C_MIN0 EQU 54H
C_COUNT EQU 55H ;闹钟定时5S
ORG 0000H ;跳转主程序
LJMP MAIN
ORG 0003H ;显示中断入口
LJMP INT0
ORG 000BH ;闹钟计时中断
LJMP CTC0
ORG 0013H ;闹钟中断入口
LJMP INT1
ORG 002BH ;键盘扫描中断入口
LJMP CTC2
ORG 0100H
;主程序
MAIN:
NOP
NOP
NOP
MOV SP, #0DFH ;对于具有256字节内部RAM芯片来说,
;将0E0H-0FFH,共计32字节作为堆栈区
MOV R0, #01H
LOOPIC1:
MOV @R0, #0
INC R0
CJNE R0, #0, LOOPIC1
SETB BEE ;关蜂鸣器
;日历初始化
LCALL LOAD8563
;闹钟初始化
CLR ALARM
CLR C_5S
CLR C_2S
LCALL LOADCLOCK
;MOV C_COUNT,#64H
;初始化CLKOUT为1Hz时钟输出
MOV R0,#XmtDat
MOV @R0,#83H
MOV ByteCnt,#01H
MOV SlvAdr,#0A2H
MOV SubAdr,#0DH
LCALL SendData
;初始化中断INT0
SETB IT0 ;下降沿触发
ORL IPH,#01H ;IPH没有位寻址功能,所以要用ORL置1
CLR PX0 ;优先级为2级,次高级
SETB EX0
;初始化中断INT1
CLR IT1 ;低电平触发
ORL IPH,#06H ;INT1,T0中断优先级高位置1
CLR PT0 ;T0优先级为2级,次高级
CLR PX1 ;INT1优先级为2级,次高级
SETB EX1
;初始化LCD
LCALL LOADLCD
;初始化键盘
MOV KEYSTU,#07H ;按键状态初始化为111
ANL KEYNAME,#01111111B ;将键值设为无效
CLR ENTER ;确认键初始化为没有按下
;初始化定时器T2
MOV TH2,#63H ;定时40ms
MOV TL2,#0C0H
MOV RCAP2H,#63H ;重装63C0
MOV RCAP2L,#0C0H
MOV T2CON,#00000100B ;自动重装,定时,并启动T2
ORL IPH,#00100000B ;IPH没有位寻址功能,所以要用ORL置1
SETB PT2 ;优先级为3级,最高级
SETB ET2
SETB EA ;中断总开关
;按键功能执行程序
REDO:
JNB T40,REDO ;40ms未到
CLR T40
LCALL KEYCHK ;扫描键盘有没有按下
MOV A,KEYNAME ;读键值
JNB ACC.7,REDO ;键盘按键无效,就循环等待
CLR EA ;停止中断
ANL KEYNAME,#7FH ;清按键有效标志
CJNE A,#81H,CON1 ;执行功能键功能1
LCALL DIS_TIME ;右下角显示TIME,表示正在设置时间日期
LJMP IN ;时间日期闹钟设置程序
CON1:
CJNE A,#82H,CON2 ;
LCALL DIS_ALARM ;显示正在设置闹钟
LJMP C_IN ;设置闹钟
CON2:
CJNE A,#83H,CON3 ;
LCALL STOPWATCH ;秒表程序
SJMP CON4
CON3:
CJNE A,#84H,CON4 ;
LCALL C_STOP ;中途停止闹钟
SJMP CON4
CON4:
SETB EA
MOV COUNT,#0 ;功能键计数器归零
LCALL LOADLCD
LCALL ANUBIS ;重新显示ANUBIS
LJMP REDO ;循环操作
;*******************时间日期闹钟设置程序****************
KEY:
JBC ENTER,CON4 ;按下确认键就退出设置
JB SW,KEY0 ;调整程序
LCALL DELAY250MS
JB SW,KEY0
IN:
INC COUNT
MOV A,COUNT
CJNE A,#8,KEYOVER
MOV COUNT,#00H
LJMP CON4 ;一个循环后退出设置程序
KEYOVER:
JB SW,KEY0
LJMP KEYOVER
;**********************秒钟调整程序********
KEY0:
MOV A,COUNT ;秒钟加1程序
CJNE A,#1,KEY1
JB UP,KEY00
LCALL DELAY250MS
JB UP,KEY00
INC SEC0
MOV A,SEC0
CJNE A,#10,KEY0OVER
MOV SEC0,#00H
INC SEC1
MOV A,SEC1
CJNE A,#6,KEY0OVER
MOV SEC1,#00H
LJMP KEY0OVER
KEY0OVER:
JB UP,KEY00
LJMP KEY0OVER
KEY00:
JB DOWN,KEY1 ;秒钟减1程序
LCALL DELAY250MS
JB DOWN,KEY1
MOV A,SEC0
CJNE A,#0,CCC
MOV SEC0,#9
MOV A,SEC1
CJNE A,#0,CCCC
MOV SEC1,#5
LJMP KEY00OVER
CCCC:
DEC SEC1
LJMP KEY00OVER
CCC:
DEC SEC0
KEY00OVER:
JB DOWN,KEY1
LJMP KEY00OVER
;*************分钟调整程序*********************
KEY1:
MOV A,COUNT ;分钟加1程序
CJNE A,#2,KEY2
JB UP,KEY11
LCALL DELAY250MS
JB UP,KEY11
INC MIN0
MOV A,MIN0
CJNE A,#10,KEY1OVER
MOV MIN0,#00H
INC MIN1
MOV A,MIN1
CJNE A,#6,KEY1OVER
MOV MIN1,#00H
LJMP KEY1OVER
KEY1OVER:
JB UP,KEY11
LJMP KEY1OVER
KEY11:
JB DOWN,KEY2 ;分钟减1程序
LCALL DELAY250MS
JB DOWN,KEY2
MOV A,MIN0
CJNE A,#0,AAA
MOV MIN0,#9
MOV A,MIN1
CJNE A,#0,AAAA
MOV MIN1,#5
LJMP KEY11OVER
AAAA:
DEC MIN1
LJMP KEY11OVER
AAA:
DEC MIN0
KEY11OVER:
JB DOWN,KEY2
LJMP KEY11OVER
;***********时调整程序******************
KEY2:
MOV A,COUNT ;时加1程序
CJNE A,#3,KEY3
JB UP,KEY22
LCALL DELAY250MS
JB UP,KEY22
INC HOU0
MOV A,HOU1
CJNE A,#2,HOURS
MOV A,HOU0
CJNE A,#4,KEY2OVER
MOV HOU0,#00H
MOV HOU1,#00H
LJMP KEY2OVER
HOURS:
MOV A,HOU0
CJNE A,#10,KEY2OVER
MOV HOU0,#00H
INC HOU1
KEY2OVER:
JB UP,KEY22
LJMP KEY2OVER
KEY22:
JB DOWN,KEY3 ;时钟减1程序
LCALL DELAY250MS
JB DOWN,KEY3
MOV A,HOU0
CJNE A,#0,H4
MOV A,HOU1
CJNE A,#0,H5
MOV HOU0,#3
MOV HOU1,#2
LJMP KEY22OVER
H5:
MOV HOU0,#9
DEC HOU1
LJMP KEY22OVER
H4:
DEC HOU0
KEY22OVER:
JB DOWN,KEY3
LJMP KEY22OVER
;************星期调整程序****************
KEY3:
MOV A,COUNT ;星期加1程序
CJNE A,#4,KEY4
JB UP,KEY33
LCALL DELAY250MS
JB UP,KEY33
INC WEK
MOV A,WEK
CJNE A,#7,KEY3OVER
MOV WEK,#00H
KEY3OVER:
JB UP,KEY33
LJMP KEY3OVER
KEY33:
JB DOWN,KEY4 ;星期减1程序
LCALL DELAY250MS
JB DOWN,KEY4
MOV A,WEK
CJNE A,#0,A2
MOV WEK,#6
LJMP KEY33OVER
A2:
DEC WEK
KEY33OVER:
JB DOWN,KEY4
LJMP KEY33OVER
;*******************日调整*****************
KEY4:
MOV A,COUNT ;日加1程序
CJNE A,#5,KEY5
JB UP,KEY44
LCALL DELAY250MS
JB UP,KEY44
INC DAY0
MOV A,DAY1
CJNE A,#3,DAYY
MOV A,DAY0
CJNE A,#2,KEY4OVER
MOV DAY0,#1
MOV DAY1,#00H
LJMP KEY4OVER
DAYY:
MOV A,DAY0
CJNE A,#10,KEY4OVER
MOV DAY0,#00H
INC DAY1
KEY4OVER:
JB UP,KEY44
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -