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

📄 keylcd.asm

📁 用于4x8液晶显示和键盘控制
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;***************数码显示时钟程序
;RAM定义
;*************************
BIT_COUNT     DATA    07FH
TIMER         DATA    07EH
TIMER1        DATA    07DH
TEN           DATA    07CH
TIMER3        DATA    07BH
TIMER4        DATA    07CH
DATA_IN       DATA    020H
DATA_OUT      DATA    021H
;**************************
;I/O口定义
;**************************
KEY          BIT   P3.3
DAT          BIT   P3.4
CLK          BIT   P3.5
FMQ          BIT   P2.0
;**************************
             ORG      0000H
             AJMP     START
             ORG      0003H
             AJMP     ZD0
             ORG      000BH
             AJMP     ZDT0

             ORG      0030H
START:       MOV      SP,#50H
             CLR      DAT
             SETB     KEY
             CLR      CLK
             ACALL    d100ms                ;显示、DS12C887延时
             ACALL    d100ms
             ACALL    D100MS
             MOV      DATA_OUT,#10100100B   ;发复位指令
             ACALL    SEND
             CLR      FMQ
             SETB     IT0                   ;中断0用脉冲后沿触发
             SETB     EA
             SETB     EX0
             MOV      TMOD,#11H
             SETB     ET0
             MOV      TIMER3,#20            ;1S中断1次
             MOV      TH0,#3CH
             MOV      TL0,#0B0H             ;50MS(12M)
             SETB     TR0
MAIN:        JB       KEY,$                 ;检测是否有键按下
             CLR      EX0                   ;有键按下时必须让中断关闭,不让数据改变
             CLR      ET0
             MOV      DATA_OUT,#00010101B   ;有键按下,发送读键盘指令
             ACALL    SEND
             ACALL    RECEIVE
             MOV      A,DATA_IN
             CJNE     A,#10,MAIN2              ;不是设定键?
             MOV      3AH,#11011111B         ;装位闪烁数据
             MOV      3BH,#0CDH              ;装显示位
             MOV      R0,#40H                ;按键值暂存首地址
             MOV      45H,#0FFH              ;便于判断是否按完6位
MAINA:       MOV      DATA_OUT,#10001000B    ;位闪烁
             ACALL    SEND
             MOV      DATA_OUT,3AH           ;第N位闪烁
             ACALL    SEND
             JNB      KEY,$                  ;等待按键结束
             JB       KEY,$                  ;检测是否有键按下
             MOV      DATA_OUT,#00010101B    ;有键按下,发送读键盘指令
             ACALL    SEND
             ACALL    RECEIVE
             MOV      A,DATA_IN
MAINB:       CJNE     A,#12,MAINC            ;按结束键
             MOV      A,45H
             CJNE     A,#0FFH,MAIND
             JNB      KEY,$
             AJMP     MAIN1

MAINC:       MOV      @R0,DATA_IN
             mov      data_out,3BH           ;下载数据且按方式1译码(第6位)
             ACALL    send
             mov      data_out,data_in       ;发送1位数字到HD7279
             ACALL    SEND
             MOV      A,3AH
             RR       A
             MOV      3AH,A
             DEC      3BH
             INC      R0
             AJMP     MAINA
 MAIND:      MOV      A,44H      ;将键盘值2字节合成1字节保存在以30H为首的RAM中
             MOV      B,#10
             MUL      AB
             ADD      A,45H
             MOV      30H,A
             MOV      A,42H
             MOV      B,#10
             MUL      AB
             ADD      A,43H
             MOV      31H,A
             MOV      A,40H
             MOV      B,#10
             MUL      AB
             ADD      A,41H
             MOV      32H,A
             JNB      KEY,$     ;等待按键结束
             NOP
             NOP
             ACALL     WSJ
             NOP
 MAIN1:      SETB     EX0
             SETB     ET0
             MOV      DATA_OUT,#10100100B   ;发复位指令
             ACALL    SEND
             AJMP     MAIN

 MAIN2:      CJNE     A,#11,MAIN1            ;不是定闹去开中断
             ACALL    NZXS
             MOV      3AH,#11011111B         ;装位闪烁数据
             MOV      3BH,#0CDH              ;装显示位
             MOV      R0,#40H                ;按键值暂存首地址
             MOV      45H,#0FFH              ;便于判断是否按完6位
  DN1:       MOV      DATA_OUT,#10001000B    ;位闪烁
             ACALL    SEND
             MOV      DATA_OUT,3AH           ;第N位闪烁
             ACALL    SEND
             JNB      KEY,$                  ;等待按键结束
             JB       KEY,$                  ;检测是否有键按下
             MOV      DATA_OUT,#00010101B    ;有键按下,发送读键盘指令
             ACALL    SEND
             ACALL    RECEIVE
             MOV      A,DATA_IN
  DN2:       CJNE     A,#12,DN3              ;按结束键
             MOV      A,45H
             CJNE     A,#0FFH,DN4
             JNB      KEY,$
             AJMP     MAIN1

  DN3:       MOV      @R0,DATA_IN
             mov      data_out,3BH           ;下载数据且按方式1译码(第6位)
             ACALL    send
             mov      data_out,data_in       ;发送1位数字到HD7279
             ACALL    SEND
             MOV      A,3AH
             RR       A
             MOV      3AH,A
             DEC      3BH
             INC      R0
             AJMP     DN1
   DN4:      MOV      A,44H      ;将键盘值2字节合成1字节保存在以33H为首的RAM中
             MOV      B,#10
             MUL      AB
             ADD      A,45H
             MOV      33H,A
             MOV      A,42H
             MOV      B,#10
             MUL      AB
             ADD      A,43H
             MOV      34H,A
             MOV      A,40H
             MOV      B,#10
             MUL      AB
             ADD      A,41H
             MOV      35H,A
             JNB      KEY,$     ;等待按键结束
             NOP
             NOP
             ACALL    WNZ
             NOP
             AJMP     MAIN1

WSJ:         MOV      R1,#0AH     ;寄存器A地址
             MOV      A,#70H      ;DV2~DV0=111,分频复位
             MOVX     @R1,A
             INC      R1          ;到寄存器B地址
             MOV      A,#8EH      ;停止更新,允许更新中断,选10进制,24小时制
             MOVX     @R1,A
             MOV      R1,#00H     ;秒单元地址
             MOV      A,30H
             MOVX     @R1,A
             MOV      R1,#02H      ;分单元地址
             MOV      A,31H
             MOVX     @R1,A
             MOV      R1,#04H      ;时单元地址
             MOV      A,32H
             MOVX     @R1,A
             MOV      R1,#07H      ;日单元地址
             MOV      A,#20
             MOVX     @R1,A
             INC      R1           ;月单元地址
             MOV      A,#2         ;2月
             MOVX     @R1,A
             INC      R1           ;年单元后两位地址
             MOV      A,#2         ;2002年
             MOVX     @R1,A
             MOV      R1,#32H      ;年单元前两位地址
             MOV      A,#20        ;2002年
             MOVX     @R1,A
 WSJ1:       MOV      R1,#0AH      ;寄存器A地址
             MOV      A,#2FH       ;DV2~DV0=010   RS3~RS0=1111 决定输出频率500MS
             MOVX     @R1,A        ;选周期中断为500Ms,允许方波输出,频率2Hz
             MOV      R1,#0BH      ;到寄存器B地址
             MOV      A,#2EH       ;每秒更新1次,允许方波输出,24小时制 每秒中断1次
             MOVX     @R1,A        ;时钟开始运行
             RET
 ;写闹钟
 WNZ:        MOV      R1,#0AH     ;寄存器A地址
             MOV      A,#70H      ;DV2~DV0=111,分频复位
             MOVX     @R1,A
             INC      R1          ;到寄存器B地址
             MOV      A,#8EH      ;停止更新,允许更新中断,选10进制,24小时制
             MOVX     @R1,A
             MOV      R1,#01H      ;秒闹地址
             MOV      A,33H        ;秒闹时间
             MOVX     @R1,A
             MOV      R1,#03H      ;分闹地址
             MOV      A,34H        ;分闹时间
             MOVX     @R1,A
             MOV      R1,#05H      ;时闹地址
             MOV      A,35H        ;时闹时间
             MOVX     @R1,A

⌨️ 快捷键说明

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