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

📄 xcy.txt

📁 利用8279键盘显示后接口电路做做电子钟
💻 TXT
字号:
利用8279键盘显示后接口电路做做电子钟2007-01-29 23:08;系统晶振是 11.0592 MHz
Z8279   EQU     0FF82H  ;8279 状态/命令口地址
D8279   EQU     0FF80H  ;8279 数据口地址
LEDMOD  EQU     00H     ;左边输入 八位字符显示
                        ;外部译码键扫描方式,双键互锁
LEDFEQ  EQU     2FH     ;扫描速率
LEDCLS  EQU     0C1H    ;清除显示 RAM
LEDWR0  EQU     80H     ;设定的将要写入的显示RAM地址
READKB  EQU     40H     ;读 FIFO RAM 地址 0 的命令字

        ORG     0000H
        AJMP    START
        ORG     001BH   ;INT T1 入口地址
        AJMP    INT_T1
        ORG     0040H
START:
        MOV     SP,#60H
        LCALL   INIT8279        ;初始化8279
        MOV     R3,#0H          ;时
        MOV     R2,#0H          ;分
        MOV     R1,#0H          ;秒
        MOV     R0,#0H          ;10毫秒
        MOV     R6,#0FFH        ;标志
        MOV     TMOD,#10H
        MOV     TL1,#00H        ;10毫秒的时间常数
        MOV     TH1,#0DCH
        LCALL   DIS_mS
        SETB    ET1
        SETB    EA              ;允许中断
WAIT:
        LCALL   GETKEY          ;读键盘
        CJNE    A,#0FFH,CONT    ;判断是否有键输入
        MOV     A,B
        CJNE    A,#3CH,KEY_G    ;输入键是'C',转CLEAR_T
        LCALL   CLEAR_T
KEY_G:  CJNE    A,#3AH,KEY_D    ;输入键是'G',转START_T
        LCALL   START_T
KEY_D:  CJNE    A,#3DH,KEY_P    ;输入键是'D',转STOP_T
        LCALL   STOP_T
KEY_P:  CJNE    A,#3BH,KEY_E    ;输入键是'P',转SET_T
        LCALL   SET_T
KEY_E:  CJNE    A,#3EH,CONT     ;输入键是'E',转MONITOR
        AJMP    MONITOR
CONT:   CJNE    R6,#0FFH,WAIT   ;若无秒标志则循环
        LCALL   DISPLAY         ;显示时间
        MOV     R6,#0           ;清标志
        SJMP    WAIT            ;循环
MONITOR:NOP
        SJMP    $               ;等待回到监控

CLEAR_T:                        ;时间清零子程序
        CLR     TR1             ;关计数器
        MOV     R3,#0H          ;小时清零
        MOV     R2,#0H          ;分钟清零
        MOV     R1,#0H          ;秒清零
        MOV     R0,#0H          ;10毫秒清零
        MOV     R6,#0FFH        ;置秒标志
        LCALL   DIS_mS          ;显示毫秒
        RET
START_T:                        ;电子钟计时子程序
        SETB    TR1
        RET
STOP_T:                         ;电子钟停止计时子程序
        CLR     TR1
        RET
SET_T:                          ;设置初值子程序
        CLR     TR1             ;关计数器

        MOV     R4,#7
        LCALL   GETWORD         ;读小时数
        CJNE    A,#0FFH,INVALID ;判断输入合法性
        MOV     A,B
        ADD     A,#232
        JC      INVALID         ;判断输入小时值 < 24
        MOV     A,B
        MOV     B,#10
        DIV     AB
        SWAP    A
        ADD     A,B
        MOV     R3,A            ;保存输入的值

        MOV     R4,#5
        LCALL   GETWORD         ;读分钟数
        CJNE    A,#0FFH,INVALID ;判断输入合法性
        MOV     A,B
        ADD     A,#196
        JC      INVALID         ;判断输入分钟数 < 60
        MOV     A,B
        MOV     B,#10
        DIV     AB
        SWAP    A
        ADD     A,B
        MOV     R2,A            ;保存输入的值

        MOV     R4,#3
        LCALL   GETWORD         ;读分钟数
        CJNE    A,#0FFH,INVALID ;判断输入合法性
        MOV     A,B
        ADD     A,#196
        JC      INVALID         ;判断输入分钟值 < 60
        MOV     A,B
        MOV     B,#10
        DIV     AB
        SWAP    A
        ADD     A,B
        MOV     R1,A            ;保存输入的值

        MOV     R4,#1
        LCALL   GETWORD         ;读10毫秒数
        CJNE    A,#0FFH,INVALID ;判断输入合法性
        MOV     A,B
        MOV     B,#10
        DIV     AB
        SWAP    A
        ADD     A,B
        MOV     R0,A            ;保存输入的值
        AJMP    SET_TOK
INVALID:
        LCALL   CLEAR_T         ;时间清零
SET_TOK:LCALL   DIS_mS          ;显示10毫秒
        LCALL   DISPLAY         ;显示时间
        RET

GETWORD:                        ;读数子程序
WKEY1:  LCALL   GETKEY          ;读键盘
        CJNE    A,#0FFH,WKEY1   ;无键输入,则再读
        MOV     A,B
        ADD     A,#0C6H
        JC      ERROR1          ;判断输入是否大于9
        MOV     A,B
        SUBB    A,#30H
        JC      ERROR1          ;判断输入是否小于0
        MOV     R5,A
        LCALL   DISLED          ;显示输入的字符
        MOV     B,#10
        MUL     AB
        PUSH    ACC             ;保存输入的值
WKEY2:  LCALL   GETKEY          ;读键盘
        CJNE    A,#0FFH,WKEY2   ;无键输入则再读
        MOV     A,B
        ADD     A,#0C6H         ;判断输入是否大于9
        JC      ERROR2
        MOV     A,B
        SUBB    A,#30H          ;判断输入是否小于0
        JC      ERROR2
        DEC     R4
        MOV     R5,A
        LCALL   DISLED          ;显示输入的字符
        MOV     B,A
        POP     ACC
        ADD     A,B
        MOV     B,A             ;把得到的值存在B
        MOV     A,#0FFH         ;置合法输入标志
        AJMP    KEYOK
ERROR2: POP     ACC
ERROR1: MOV     A,#0            ;置非法输入标志
KEYOK:  RET

INIT8279:                       ;8279初始化子程序
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        LCALL  DELAY            ;延时
        MOV    DPTR ,#Z8279
        MOV    A,#LEDMOD        ;置8279工作方式
        MOVX   @DPTR,A
        MOV    A,#LEDFEQ        ;置键盘扫描速率
        MOVX   @DPTR,A
        MOV    A,#LEDCLS        ;清除 LED 显示
        MOVX   @DPTR,A
        POP    ACC              ;恢复现场
        POP    DPL
        POP    DPH
        RET
;读取键盘子程序
;输入: 无   ; 输出: B: 读到的键码 A: 按键的标志
GETKEY: PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   PSW
        MOV    DPTR,#Z8279
        MOVX   A,@DPTR          ;读8279状态
        ANL    A,#07H           ;屏蔽D7-D3
        JNZ    GETVAL           ;判断是否有键输入
        MOV    A,#0H            ;置标志(无键输入)
        SJMP   NKBHIT
GETVAL: MOV    A,#READKB        ;读 FIFO RAM 命令
        MOVX   @DPTR,A
        MOV    DPTR,#D8279
        MOVX   A,@DPTR          ;读键
        ANL    A,#3FH           ;屏蔽 SHIFT 和 CTRL 键
        MOV    DPTR,#KEYCODE    ;键码表起始地址
        MOVC   A,@A+DPTR        ;查表
        MOV    B,A              ;置返回键值
        MOV    A,#0FFH          ;置标志(有键输入)
NKBHIT: POP    PSW              ;恢复现场
        POP    DPL
        POP    DPH
        RET
;显示字符子程序
;输入: R4,位置 R5,值
DISLED:  PUSH   DPH             ;保存现场
         PUSH   DPL
         PUSH   ACC
         MOV    A,#LEDWR0       ;置显示起始地址
         ADD    A,R4            ;加位置偏移量
         MOV    DPTR,#Z8279
         MOVX   @DPTR,A         ;设定显示位置
         MOV    DPTR,#LEDSEG    ;置显示常数表起始位置
         MOV    A,R5
         MOVC   A,@A+DPTR       ;查表
         MOV    DPTR,#D8279
         MOVX   @DPTR,A         ;显示数据
         POP    ACC             ;恢复现场
         POP    DPL
         POP    DPH
         RET

DELAY:                          ;延时子程序
        PUSH    0               ;保存现场
        PUSH    1
        MOV     0,#0H
DELAY1: MOV     1,#0H
        DJNZ    1,$
        DJNZ    0,DELAY1
        POP     1               ;恢复现场
        POP     0
        RET
DIS_mS:
        MOV     A,R0
        ANL     A,#0FH
        MOV     R5,A
        MOV     R4,#0
        LCALL   DISLED          ;显示10毫秒低位
        MOV     A,R0
        SWAP    A               ;高低半字节交换
        ANL     A,#0FH
        MOV     R5,A
        MOV     R4,#1
        LCALL   DISLED          ;显示10毫秒高位
        RET

INT_T1:                         ;INT_T1中断服务子程序
        PUSH    DPH             ;保护现场
        PUSH    DPL
        PUSH    ACC
        PUSH    PSW
        CLR     TR1
        MOV     TL1,#00H        ;10毫秒定时常数
        MOV     TH1,#0DCH
        SETB    TR1

        MOV     A,R0
        ADD     A,#1            ;10毫秒数加 1
        DA      A
        MOV     R0,A

        LCALL   DIS_mS          ;显示10毫秒

        CJNE    R0,#0,EXIT      ;判断10毫秒=0
        MOV     R6,#0FFH        ;置秒标志
        CJNE    R1,#59H,SECOND  ;判断秒=59
        MOV     R1,#99H
        CJNE    R2,#59H,MINUTE  ;判断分=59
        MOV     R2,#99H
        CJNE    R3,#23H,HOUR    ;判断时=23
        MOV     R3,#99H
HOUR:
        MOV     A,R3
        ADD     A,#1            ;时加1
        DA      A
        MOV     R3,A
MINUTE:
        MOV     A,R2
        ADD     A,#1            ;分加1
        DA      A
        MOV     R2,A
SECOND:
        MOV     A,R1
        ADD     A,#1            ;秒加1
        DA      A
        MOV     R1,A
EXIT:
        POP     PSW             ;恢复现场
        POP     ACC
        POP     DPL
        POP     DPH
        RETI                    ;中断返回
DISPLAY:
        MOV     A,R3
        ANL     A,#0FH
        ADD     A,#10H
        MOV     R5,A
        MOV     R4,#6
        LCALL   DISLED          ;显示小时低位
        MOV     A,R3
        SWAP    A
        ANL     A,#0FH
        MOV     R5,A
        MOV     R4,#7
        LCALL   DISLED          ;显示小时高位
        MOV     A,R2
        ANL     A,#0FH
        ADD     A,#10H
        MOV     R5,A
        MOV     R4,#4
        LCALL   DISLED          ;显示分钟低位
        MOV     A,R2
        SWAP    A
        ANL     A,#0FH
        MOV     R5,A
        MOV     R4,#5
        LCALL   DISLED          ;显示分钟高位
        MOV     A,R1
        ANL     A,#0FH
        ADD     A,#10H
        MOV     R5,A
        MOV     R4,#2
        LCALL   DISLED          ;显示秒低位
        MOV     A,R1
        SWAP    A
        ANL     A,#0FH
        MOV     R5,A
        MOV     R4,#3
        LCALL   DISLED          ;显示秒高位
        RET

;LED显示常数表
LEDSEG: DB      3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
        DB      7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
        DB      
0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;'0.,1.,2.,3.,4.,5.,6.,7.'
        DB      
0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;'8.,9.,A.,B.,C.,D.,E.,F.'
        DB      6DH,02H,08H,00H,59H,0FH,76H     ;'U,-,_, ,I,O,P, '
;键盘键码表
KEYCODE:DB      30H,31H,32H,33H,34H,35H,36H,37H ;'1,2,Q,W,A,S,+,Z'
        DB      38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;'3,4,E,R,D,F,X,C'
        END 

⌨️ 快捷键说明

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