⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10000clock.asm

📁 具有显示时分秒年月日和星期以及识别闰年得功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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到标志

S_WATCH BIT  07H          ;秒表启动标志

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
LIG BIT P2.1

;***********************定义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         ;判别选择键按的次数
D_COUNT EQU 4EH         ;背光定时10S倒数单元
P_COUNT EQU 4FH         ;图案计数单元

;***********************定义闹钟缓冲区地址******************
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倒数单元

;***********************定义闹钟缓冲区地址******************
S_MS1   EQU 56H
S_MS0   EQU 57H
S_SEC1  EQU 58H
S_SEC0  EQU 59H
S_MIN1  EQU 5AH
S_MIN0  EQU 5BH
S_HOU1  EQU 5CH
S_HOU0  EQU 5DH

ORG 0000H                 ;跳转主程序
LJMP MAIN

ORG 0003H                 ;显示中断入口
LJMP INT0

ORG 000BH                 ;闹钟计时中断
LJMP CTC0

ORG 0013H                 ;闹钟中断入口
LJMP INT1


ORG 001BH                 ;背光灯计时中断
LJMP CTC1

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 LIG                ;关背光灯
     SETB BEE                ;关蜂鸣器
     CLR S_WATCH             ;关秒表
     ;日历初始化
     LCALL LOAD8563
     ;闹钟初始化
     CLR ALARM
     CLR C_5S
     CLR C_2S
     LCALL LOADCLOCK
     MOV C_COUNT,#64H
     MOV D_COUNT,#0C8H
     ;初始化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
     SETB PT0                ;T0优先级为3级,最高级
     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        ;清按键有效标志
     CLR LIG                 ;开背光灯
     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 DIS_STOPW
     MOV P_COUNT,#0
     LJMP STOPWATCH          ;秒表程序
CON3:
     CJNE A,#84H,CON4        ;
     LCALL C_STOP            ;中途停止闹钟,开背光
CON4:
     SETB EA
     MOV COUNT,#0            ;功能键计数器归零
     LCALL LOADLCD
     LJMP REDO               ;循环操作


;*******************时间日期闹钟设置程序****************
KEY:
    JBC ENTER,CON4       ;按下确认键就退出设置
    JB SW,KEY0           ;调整程序
    LCALL DELAY150MS
    JB SW,KEY0
IN:
    INC COUNT
    MOV A,COUNT
    CJNE A,#8,KEYOVER
    MOV COUNT,#00H
    MOV D_COUNT,#0C8H
    MOV TL1,#0B0H              ;设置T1初值,定时50ms
    MOV TH1,#3CH
    ANL TMOD,#0FH
    ORL TMOD,#00010000B        ;16位定时器
    SETB ET1
    SETB TR1
    ;SETB LIG              ;关背光
    LJMP CON4             ;一个循环后退出设置程序
KEYOVER:
    JB SW,KEY0            ;此句用来设置键盘是否重复输入,引用此句时没有重复输入
    LJMP KEYOVER

;**********************秒钟调整程序********

KEY0:
     MOV A,COUNT            ;秒钟加1程序
     CJNE A,#1,KEY1
     JB UP,KEY00
     LCALL DELAY150MS
     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 DELAY150MS
      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 DELAY150MS
     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 DELAY150MS
      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 DELAY150MS
     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 DELAY150MS
      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 DELAY150MS
     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 DELAY150MS
     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 DELAY150MS
     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
     ;LJMP KEY4OVER


KEY44:
      JB DOWN,KEY5            ;日减1程序
      LCALL DELAY150MS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -