51汇编做的电子时钟


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND EQU 20H      ;当前秒
MINUTE EQU 21H      ;当前分
HOUR   EQU 22H      ;当前时

ALAMINU EQU 23H     ;闹钟分钟
ALAHOUR EQU 24H     ;闹钟小时

DAY    EQU 25H      ;当前日
MONTH  EQU 26H      ;当前月
YEAR  EQU 27H      ;当前年   

WEEK   EQU 29H      ;星期

STATE  EQU 30H      ;状态
INTNUM EQU 31H      ;中断次数
MONTHDAYS EQU 32H   ;月所对应的天数

ALAON     EQU 33H   ;闹钟开关状态
TEMP       EQU 34H  ;临时变量
ALARM     EQU 35H   ;实事报时,该处存放的变量为1时报时

;液晶模块的寄存器地址
LCD_CMD_WR EQU  0
LCD_DATA_WR EQU 1
LCD_BUSY_RD EQU 2
LCD_DATA_RD EQU 3
;显示命令
LCD_CLS  EQU 1            ;清楚屏幕并且置AC为0
LCD_HOME EQU 2            ;显示返回到原始位置
LCD_SETMODE EQU 4            ;设置模式
LCD_SETVISIBLE EQU 8            ;开关控制
LCD_SHIFT EQU 16           ;光标移位
LCD_SETFUNCTION EQU 32           ;功能设置
LCD_SETCGADDR EQU 64           ;设置CGRAM
LCD_SETDDADDR EQU 128          ;设置DDRAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ORG 0000H
 LJMP MAIN                     ;跳往主程序
 ORG 0003H
 LJMP KEYDOWN                  ;键盘中断
 ORG 000BH
 LJMP TIMER                    ;定时中断
MAIN:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;月份所对应的天数表 
DAYNUM: DB    1FH,1CH,1FH,1EH,1FH,1EH,1FH,1FH,1EH,1FH,1EH,1FH
;显示星期字符串
MON:    DB  'MON',0
TUE:    DB  'TUE',0
WED:    DB  'WED',0
THU:    DB  'THU',0
FRI:    DB  'FRI',0
SAT:    DB  'SAT',0
SUN:    DB  'SUN',0
ON :    DB  'ON' ,0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 MOV   SP ,#40H
 MOV   TMOD,#01H               ;设置为T0
 LCALL INITIAL                 ;初始化内存数据
        LCALL DIS_INI                 ;液晶显示初始化
        MOV   A,#38H
 LCALL WRCMD
 SETB  ET0                     ;允许TO中断
 SETB  EX0                     ;允许INTRO中断
 MOV   IP,#02H                 ;设置定时器的中断优先于键盘中断
 SETB  EA                      ;CPU 开中断
 MOV   TH0,#3CH                ;装初始值
 MOV   TL0,#0B0H
 SETB  TCON.4                  ;启动T0
HERE:
        LCALL DISPLAY                 ;根据模式不同在LCD上显示
        LJMP HERE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;初始化子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INITIAL:
        PUSH ACC
 MOV   INTNUM,#0AH              ;装入中断次数
 CLR A                         ;初始化时间:00:00:00
 MOV SECOND,A
 MOV MINUTE,A
 MOV HOUR  ,A                
 MOV ALAMINU ,A
 MOV ALAHOUR ,A
 MOV DAY ,#4                 ;初始化日期为:2007-7-4 星期3
 MOV MONTH,#7
 MOV YEAR,#7H              
 MOV WEEK ,#3H
        MOV STATE ,#0H               ;初始化状态为0
 MOV ALAON,#00H               ;初始化闹钟关闭
 MOV ALARM,#00H               ;初始化不报时
 POP ACC
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;键盘中断程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYDOWN:
       PUSH ACC
       MOV A,P1                      ;读键盘的状态
       ANL A,#1FH                    ;屏蔽高三位
       MOV TEMP,A
       LCALL D_10MS                  ;延时10ms
       MOV A,P1                      ;再次读入按键状态
       ANL A,#1FH
       CJNE A,TEMP,RET_KEY           ;两次不等,则是抖动引起的
       CJNE A,#1EH,KEYDOWN1
       LCALL KEY_0
       AJMP RET_KEY
KEYDOWN1:
       CJNE A,#1DH,KEYDOWN2
       LCALL KEY_1
       AJMP RET_KEY
KEYDOWN2:
       CJNE A,#1BH,KEYDOWN3
       LCALL KEY_2
       AJMP RET_KEY
KEYDOWN3:
       CJNE A,#17H,KEYDOWN4
       LCALL KEY_3
       AJMP RET_KEY
KEYDOWN4:
       CJNE A,#0FH,RET_KEY
       LCALL KEY_4
       AJMP RET_KEY
RET_KEY:
       POP  ACC
RETI

;;;;;延时程序10MS
D_10MS:
      MOV R5,#0FFH
D_10MS1:
      MOV R6,#0EEH
D_10MS2:
      NOP
      DJNZ R6,D_10MS2
      DJNZ R5,D_10MS1
RET
;;;;;;功能键按下,设置状态
KEY_0:
       PUSH ACC
MOV P0,#00H
       MOV A,STATE
       INC A
       CJNE A,#05H,KEY_0_RET
       MOV A,#00H
KEY_0_RET:
       MOV STATE,A
       POP ACC
RET
;;;;;;;;;;;;;;;
KEY_1:
;MOV P0,#01H
       MOV R7,#01H             ;设置为增加(子程序的入口参数)
       MOV A,STATE
       CJNE A,#00H,KEY_1_1    
       AJMP KEY_1_RET          ;状态0下无作用
KEY_1_1:
       CJNE A,#01H,KEY_1_2
       LCALL INC_DEC_HOUR      ;状态1下小时加一
       A

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值