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

📄 timer and ring.asm

📁 教学打铃控制器,单片机,汇编语言,proteus仿真
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         ;教学打铃控制器       湖南师范大学工学院04级应用电子班王原亮
         ;
         ;-------------------------------按键定义,对应于P1口
         SETUP   EQU     0FEH            ; "设置" "11111110"
         NEW     EQU     0FDH            ; "新增 "11111101"
         DEL     EQU     0FBH            ; "删除" "11111011"
         UP      EQU     0F7H            ; "向上" "11110111"
         DOWN    EQU     0EFH            ; "向下" "11101111"
         RIGHT   EQU     0DFH            ; "向右" "11011111"
         ENTER   EQU     07FH            ; "确认" "10111111"
         CANCEL  EQU     0BFH            ; "取消" "01111111"
         SDA     EQU     P3.2
         SCL     EQU     P3.3
         BELLR   EQU     P3.4
         ;--------------------------------存储单元定义
         SECLOC  EQU     30H
         MINLOC  EQU     31H
         HOURLOC EQU     32H              ;时.分.秒存储单元
         T0COUNT EQU     33H              ;50MS计数存储单元
         SECLED  EQU     P3.1             ;秒闪信息
                                          ;34H到39H定义为显示缓冲区
         DPLYLOC EQU     3AH              ;显示子程序的起入口指针存放单元,在调用时钟显示时为#34H
         KEYBUF  EQU     3BH
         KEYCODE EQU     3CH              ;存放按键值单元,没有按键时为0FFH
         KEYFLAG EQU     3DH              ;按键标志位, 有按键时置0FFH,默认为00
         CONSOS  EQU     3EH              ;3_6转换程序源单元块的首地址存放单元
         CONDES  EQU     3FH              ;3_6转换程序目的单元块的尾地址存放单元
         SECBUF  EQU     40H
         MINBUF  EQU     41H
         HOURBUF EQU     42H              ;时,分,秒设置缓冲区
         T1COUNT EQU     43H              ;T1中断计数
                                          ;44H-49H定义为设置时的显示缓冲区
         BELLM   EQU     50H              ;存放打铃时间分位,初始为--
         BELLH   EQU     51H              ;打铃时间时位,初始为--
         BELNUM  EQU     52H              ;打铃序号,初始为0,BCD格式
                                          ;54H-59H为打铃点浏览和设置时的显示缓冲区
         NEWFLAG EQU     5AH              ;新增打铃点的标志位
         BELFLAG EQU     5BH              ;打铃点个数有效标志
         BNBIN   EQU     5CH              ;BELNUM的二进制表示
         BCBIN   EQU     5DH              ;BELCOT的二进制表示
         KEYFLAG2 EQU    5FH

         TCDOWN  EQU    4AH                ;时间设置倒计时
         BCDOWN  EQU    4BH                ;打铃倒计时
         BRFLAG  EQU    4CH                ;打铃标志
         ;--------------------------------80H-0CFH为打铃信息缓冲区
         ;--------------------------------位单元定义
                                          ;00单元用于存放闪烁位信息
         T0L     EQU     0BAH             ;TL0初值,方便调试
         ;--------------------------------主程序开始
       ORG     0000H
       AJMP    START                   ;主程序入口
       ORG     000BH
       LJMP    T0INT                   ;定时器T0中断入口

START:  CLR     BELLR
        MOV     SP,#60H
        MOV     T0COUNT,#20                ;秒计数标志
        MOV     T1COUNT,#00H
        MOV     SECLOC,#00H
        MOV     MINLOC,#30H
        MOV     HOURLOC,#12H               ;初始化时、分、秒存储单元
        MOV     CONSOS,#30H
        MOV     CONDES,#39H                ;初始化3-6转换程序参数
        MOV     DPLYLOC,#34H               ;初始显示时钟
        MOV     KEYCODE,#0FFH              ;初始化P1口按键扫描值
        MOV     KEYFLAG,#00H               ;初始化按键标志
        MOV     KEYFLAG2,#00H
        MOV     BCDOWN,#00H
        MOV     BRFLAG,#00H
        MOV     TCDOWN,#20
        SETB    C
        MOV     01H,C
        MOV     R0,#07FH
        MOV     R1,#80H
        MOV     A,#0FFH                    ;初始化80H-0FF单元为0FF
INTLP1: MOV     @R1,A
        INC     R1
        DJNZ    R0,INTLP1
        MOV     BELLM,#0EEH                 ;初始化打铃点分单元为"-"
        MOV     BELLH,#0EEH                 ;初始化打铃点时单元为"-"
        MOV     BELNUM,#00H
        MOV     BELFLAG,#0FFH
        MOV     NEWFLAG,#00H
INTGO:  MOV     TMOD,#11H
        MOV     TH0,#03CH
        MOV     TL0,#T0L
        SETB    EA
        SETB    ET0
        SETB    TR0
MAINRD: LCALL   START24
        MOV     A,#0A0H
        LCALL   WBYTE
        MOV     A,#00H
        LCALL   WBYTE
        LCALL   START24
        MOV     A,#0A1H
        LCALL   WBYTE
        LCALL   RBYTE
        MOV     B,A
        LCALL   STOP24
        MOV     A,B
        CLR     C
        SUBB    A,#41                   ;读入的是用二进制表示的BELCOT
        JC      INTEF
        MOV     BCBIN,#00H
        MOV     BNBIN,#00H
        AJMP    INTSTOP
INTEF:  MOV     BCBIN,B                 ;---------------- ;初始化打铃点个数
INTSTOP:MOV     A,BCBIN
        JZ      MAIN
        MOV     BNBIN,#01H               ;有打铃点,则显示为第一个打铃点信息,
        MOV     R0,#80H                  ;RAM指针
        MOV     A,BCBIN
        MOV     B,#2
        MUL     AB
        MOV     R3,A                      ;数据字节数
        MOV     R4,#01H                   ;24C02存储地址
        LCALL   RD24                      ;读24C02
;-----------------------------------
MAIN:   LCALL   LEDDIS
        LCALL   DISPLAY
        LCALL   GETKEY
        MOV     A,KEYFLAG
        JZ      LOOP
        MOV     A,KEYCODE
        MOV     KEYFLAG,#00H
        CJNE    A,#RIGHT,NOTRIGHT
        LJMP    BELLBRO                  ;按下RIGHT键,转入打铃点浏览状态,BELL BROWSE
NOTRIGHT:MOV    A,KEYCODE
        CJNE    A,#SETUP,LOOP
        LJMP    TIMESET                  ;按下SETUP键,转入时间设置状态,TIME SET
LOOP:   LJMP    MAIN
;------------------------------------  ;T0中断子程序,
T0INT:  MOV     TL0,#T0L                  ;重新置定时常数
        MOV     TH0,#03CH
        PUSH    DPL
        PUSH    DPH
        PUSH    ACC
        PUSH    PSW
        PUSH    CONSOS
        PUSH    CONDES
        MOV     A,T1COUNT
        ADD     A,#1
        MOV     T1COUNT,A
        CJNE    A,#10,NEXT1
        MOV     T1COUNT,#00H
        MOV     C,01H
        CPL     C
        MOV     01H,C
NEXT1:  MOV     A,T0COUNT
        CJNE    A,#15,NEXT0
        SETB    SECLED
NEXT0:  DJNZ    T0COUNT,EXIT              ;判断是否为1S
        MOV     T0COUNT,#20
        MOV     A,SECLOC                  ;秒钟值
        CJNE    A,#59H,SECEXIT            ;不到59时调整
        MOV     SECLOC,#99H
        MOV     A,MINLOC                  ;分钟值
        CJNE    A,#59H,MINEXIT
        MOV     MINLOC,#99H
        MOV     A,HOURLOC                 ;时钟值
        CJNE    A,#23H,HOUREXIT
        MOV     HOURLOC,#99H
HOUREXIT:MOV    A,HOURLOC
        ADD     A,#01
        DA      A                     ;时加1
        MOV     HOURLOC,A
MINEXIT:MOV     A,MINLOC
        ADD     A,#01
        DA      A                     ;分加1
        MOV     MINLOC,A
        LCALL   SCAN
SECEXIT:MOV     A,SECLOC
        ADD     A,#01
        DA      A                     ;秒加1
        MOV     SECLOC,A
        CLR     SECLED
        DEC     TCDOWN
        MOV     A,TCDOWN
        SUBB    A,#21
        JC      TCGO
        MOV     TCDOWN,#20
TCGO:   MOV     A,BRFLAG
        JZ      EXIT
        INC     BCDOWN
        MOV     A,BCDOWN
        CJNE    A,#11,EXIT
        CLR     BELLR
        MOV     BRFLAG,#00H
EXIT:   POP     CONDES
        POP     CONSOS
        POP     PSW
        POP     ACC
        POP     DPH
        POP     DPL
        RETI                             ;中断返回
;---------------------------------------打铃点扫描程序
SCAN:   PUSH    02H
        PUSH    01H
        PUSH    00H
        PUSH    ACC
        MOV     A,BCBIN
        JZ      SEXIT
        MOV     R2,A                     ;R2放置扫描次数        
        MOV     R0,#80H                ;R0为地址指针
SCANHLP:MOV     A,@R0
        CJNE    A,32H,SCANNEXT
        MOV     R1,00H
        INC     R1                     ;R1为分指针
        MOV     A,@R1
        CJNE    A,31H,SCANNEXT
        MOV     BCDOWN,#00H
        SETB    BELLR
        MOV     BRFLAG,#0FFH
        AJMP    SEXIT
SCANNEXT:INC    R0
        INC     R0
        DJNZ    R2,SCANHLP
SEXIT:  POP     ACC
        POP     00H
        POP     01H
        POP     02H
        RET
;-----------------------------------------读键子程序
GETKEY: PUSH   ACC
        PUSH   B
        PUSH   01H
        MOV    KEYFLAG,#00H
        MOV    KEYBUF,#00H
        MOV    A,P1
        CJNE   A,#0FFH,KEYDOWN
        MOV    KEYFLAG2,#00H
        AJMP   GKEXIT
KEYDOWN:MOV    KEYBUF,A
        ACALL  DY10MS
        MOV    A,P1
        MOV    B,KEYBUF
        CJNE   A,B,GKEXIT
        MOV    A,KEYFLAG2
        JNZ    GKLPOUT1
        MOV    R1,#200
GKLP:   ACALL  DY10MS
        LCALL  LEDDIS
        LCALL  DISPLAY
        MOV    A,P1
        CJNE   A,#0FFH,GKNEXT
        AJMP   GKLPOUT
GKNEXT: DJNZ   R1,GKLP
        MOV    KEYFLAG2,#0FFH
        AJMP   GKLPOUT
GKLPOUT1:MOV   R1,#20
GKLP1LP:ACALL  DY10MS
        LCALL  LEDDIS
        LCALL  DISPLAY
        DJNZ   R1,GKLP1LP
GKLPOUT:MOV    KEYCODE,KEYBUF
        MOV    KEYFLAG,#0FFH
GKEXIT: POP    01H
        POP    B
        POP    ACC
        RET
;------------------------------
DY10MS: PUSH   00H
        MOV    R0,#20
DL10LP: LCALL  DISPLAY
        DJNZ   R0,DL10LP
        POP    00H
        RET
;-------------------------------------- 此程序将@CONSOS起始的三个单元拆解
;                                       为6个BCD码送往@CONDES为尾的六个单元
LEDDIS:PUSH     00H
       PUSH     01H
       PUSH     02H
       MOV      R2,#3H
       MOV      R0,CONSOS
       MOV      R1,CONDES
LDLOOP: MOV     A,@R0
       PUSH     ACC
       MOV      B,#0FH
       ANL      A,B
       MOV      @R1,A
       DEC      R1
       POP      ACC
       SWAP     A
       ANL      A,B
       MOV      @R1,A
       DEC      R1
       INC      R0
       DJNZ     R2,LDLOOP
       POP      02H
       POP      01H
       POP      00H
       RET
;------------------------------------     显示子程序,入口条件:在40H中存放了显示段低地址指针,对应的显示为高位,
DISPLAY:PUSH     ACC
       PUSH     PSW
       PUSH     00H
       PUSH     01H
       MOV      R0,DPLYLOC
       MOV      R1,#0FEH
DISLP: MOV      DPTR,#TABLE
       MOV      A,@R0
       MOVC     A,@A+DPTR
       MOV      P2,#0FFH
       MOV      P0,A
       MOV      A,R1
       MOV      P2,A
       LCALL    DLYMS
       RL       A
       MOV      R1,A
       INC      R0
       JB       ACC.6,DISLP
       MOV      P2,#0FFH
       POP      01H
       POP      00H
       POP      PSW
       POP      ACC
       RET
;------------------                     ;用于显示暂留的延迟
DLYMS:  PUSH    00H
        MOV     R0,#20H
        DJNZ    R0,$
        POP     00H
        RET
;************************************* 时钟设置子程序
TIMESET:PUSH   ACC
        PUSH   PSW
        PUSH   DPLYLOC
        PUSH   CONSOS
        PUSH   CONDES                    ;现场保护
        MOV    TCDOWN,#20
        MOV    DPLYLOC,#44H             ;显示程序入口指针指向44H
        MOV    40H,30H
        MOV    41H,31H
        MOV    42H,32H
        MOV    CONSOS,#40H
        MOV    CONDES,#49H             ;初始化转换程序
        LCALL  LEDDIS                  ;将40H-42H单元的内容拆解为六个BCD字节送往显示单元
        LCALL  DISPLAY                 ;初始化完毕
HOURSET:MOV    A,TCDOWN
        JNZ    HOURGO
        LJMP   SETCAN
HOURGO: MOV    C,01H
        JNC    HIDE
        LCALL  LEDDIS
        LCALL  DISPLAY
        AJMP   HOURSP
HIDE:   PUSH   42H
        MOV    42H,#0FFH
        LCALL  LEDDIS
        LCALL  DISPLAY
        POP    42H
HOURSP: LCALL   GETKEY
        MOV     A,KEYFLAG
        JZ      HOURSET
        MOV     A,KEYCODE
        MOV     TCDOWN,#20
        MOV     KEYFLAG,#00H
        MOV     B,A
        CJNE    A,#CANCEL,NOTCN
        LJMP    SETCAN                  ;CANCEL,则转向取消设置程序
NOTCN:  CJNE    A,#ENTER,NOTENT
        LJMP    SETENT                  ;ENTER,则转向确定设置程序
NOTENT: CJNE    A,#RIGHT,NOTRIT
        LJMP    MINSET                  ;按下RIGHT键,转入分钟设置
NOTRIT: MOV     A,KEYCODE
        CJNE    A,#UP,NOTUP
        MOV     A,42H
        CJNE    A,#23H,ADDH
        MOV     42H,#00H
        AJMP    SETOK
ADDH:   LCALL   DAASP
        MOV     42H,A
        LJMP    SETOK
NOTUP:  MOV     A,B
        CJNE    A,#DOWN,NOTDOWN
        MOV     A,42H
        CJNE    A,#00H,SUBH
        MOV     42H,#23H
        AJMP    SETOK
SUBH:   SUBB    A,#1
        JNB     AC,STOH
        SUBB    A,#6
STOH:   MOV     42H,A
SETOK:  LCALL   LEDDIS
NOTDOWN:LJMP    HOURSET
;--------------------------             分钟设置
MINSET: MOV    A,TCDOWN
        JNZ    MINGO
        LJMP   SETCAN
MINGO:  MOV     C,01H
        JNC     HIDE1
        LCALL   LEDDIS
        LCALL   DISPLAY
        AJMP    MINSP
HIDE1:  PUSH    41H
        MOV     41H,#0FFH
        LCALL   LEDDIS
        LCALL   DISPLAY
        POP     41H
MINSP:  LCALL  GETKEY
        MOV     A,KEYFLAG
        JZ      MINSET
        MOV     A,KEYCODE
        MOV     TCDOWN,#20
        MOV     KEYFLAG,#00H
        MOV     B,A
        CJNE    A,#CANCEL,NOTCN1
        LJMP    SETCAN                  ;CANCEL,则转向取消设置程序
NOTCN1: CJNE    A,#ENTER,NOTENT1
        LJMP    SETENT                  ;ENTER,则转向确定设置程序
NOTENT1: CJNE    A,#RIGHT,NOTRIT1
        LJMP    SECSET                  ;按下RIGHT键,转入秒钟设置
NOTRIT1:MOV    A,KEYCODE
        CJNE    A,#UP,NOTUP1
        MOV     A,41H
        CJNE    A,#59H,ADDM
        MOV     41H,#00H
        AJMP    SETOK1
ADDM:   LCALL   DAASP
        MOV     41H,A
        AJMP    SETOK1
NOTUP1: MOV     A,B
        CJNE    A,#DOWN,NOTDOWN1
        MOV     A,41H
        CJNE    A,#00H,SUBM
        MOV     41H,#59H
        AJMP    SETOK1
SUBM:   SUBB    A,#1
        JNB     AC,STOM
        SUBB    A,#6
STOM:   MOV     41H,A

SETOK1:  LCALL   LEDDIS
NOTDOWN1:LJMP    MINSET
;------------------------------         秒设置
SECSET: MOV    A,TCDOWN
        JNZ    SECGO
        LJMP   SETCAN
SECGO:  MOV     C,01H
        JNC     HIDE2
        LCALL   LEDDIS
        LCALL   DISPLAY
        AJMP    SECSP
HIDE2:  PUSH    40H
        MOV     40H,#0FFH
        LCALL   LEDDIS
        LCALL   DISPLAY
        POP     40H
SECSP:  LCALL  GETKEY
        MOV     A,KEYFLAG
        JZ      SECSET
        MOV     A,KEYCODE
        MOV     TCDOWN,#20
        MOV     KEYFLAG,#00H
        MOV     B,A
        CJNE    A,#CANCEL,NOTCN2
        LJMP    SETCAN                  ;CANCEL,则转向取消设置程序
NOTCN2: CJNE    A,#ENTER,NOTENT2
        LJMP    SETENT                  ;ENTER,则转向确定设置程序
NOTENT2: CJNE   A,#RIGHT,NOTRIT2
        LJMP    HOURSET                  ;按下RIGHT键,转入时钟设置
NOTRIT2:MOV     A,KEYCODE
        CJNE    A,#UP,NOTUP2
        MOV     A,40H
        CJNE    A,#59H,ADDS
        MOV     40H,#00H
        AJMP    SETOK2
ADDS:   LCALL   DAASP
        MOV     40H,A
        LJMP    SETOK2
NOTUP2: MOV     A,B
        CJNE    A,#DOWN,NOTDOWN2
        MOV     A,40H
        CJNE    A,#00H,SUBS
        MOV     40H,#59H
        AJMP    SETOK2
SUBS:   SUBB    A,#1

⌨️ 快捷键说明

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