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

📄 clock-mine.asm

📁 电子钟的单片机实现,这里配合时钟芯片令时间更加准确,LCD界面更加人性化
💻 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到标志 

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 + -