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

📄 123.txt

📁 键盘输入数据和保存数据的程序,适合4键盘的机器
💻 TXT
字号:
端口说明: 定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁用

           P3.5为调整按钮,P0口 为字符输出口,P2口为位选端。

时间调整方法:按3.5未超过1s进入省电模式,数码管不亮,内部时钟计时。按3.5超过1s进入调
           整模式,要调整的时间会闪动,此时,按下P3.5超过0.5S,进入下位调整。按下P3.5
           未超过0.5S,当前位加一。

硬件原理图:请参考本站产品实验原理图

-----源程序-----

单片机自学网版权所有,转载请注明出处
;**********************************************************
; 中断入口程序 
;**********************************************************
      ORG     0000H           ;程序执行开始地址
      LJMP    START           ;跳到标号START执行
      ORG     0003H           ;外中断0中断程序入口
      RETI                    ;外中断0中断返回
      ORG     000BH           ;定时器T0中断程序入口
      LJMP    INTT0           ;跳至INTTO执行
      ORG     0013H           ;外中断1中断程序入口
      RETI                    ;外中断1中断返回
      ORG     001BH           ;定时器T1中断程序入口
      LJMP    INTT1           ;跳至INTT1执行
      ORG     0023H           ;串行中断程序入口地址
      RETI                    ;串行中断程序返回
;**********************************************************
 主 程 序 
;**********************************************************
START: MOV    R0,#70H         ;清70H-7AH共11个内存单元
       MOV    R7,#0BH  
CLEARDISP:MOV @R0,#00H  
       INC     R0 
       DJNZ   R7,CLEARDISP  
       MOV    20H,#00H        ;清20H(标志用)
       MOV    7AH,#0AH        ;放入"熄灭符"数据
       MOV    TMOD,#11H       ;设T0、T1为16位定时器
       MOV    TL0,#0B0H       ;50MS定时初值(T0计时用)
       MOV    TH0,#3CH        ;50MS定时初值
       MOV    TL1,#0B0H       ;50MS定时初值(T1闪烁定时用)
       MOV    TH1,#3CH        ;50MS定时初值
       SETB   EA              ;总中断开放
       SETB   ET0             ;允许T0中断
       SETB   TR0             ;开启T0定时器
       MOV    R4,#14H         ;1秒定时用初值(50MS×20)
START1:LCALL  DISPLAY         ;调用显示子程序
       JNB    P3.5,SETMM1     ;P3.7口为0时转时间调整程序
       SJMP   START1          ;P3.7口为1时跳回START1
SETMM1:LJMP   SETMM           ;转到时间调整程序SETMM
;**********************************************************
;; 1秒计时程序  
;**********************************************************
;T0中断服务程序
INTT0: PUSH   ACC             ;累加器入栈保护
       PUSH   PSW             ;状态字入栈保护
       CLR    ET0             ;关T0中断允许
       CLR    TR0             ;关闭定时器T0
       MOV    A,#0B7H         ;中断响应时间同步修正
       ADD    A,TL0           ;低8位初值修正
       MOV    TL0,A           ;重装初值(低8位修正值)
       MOV    A,#3CH          ;高8位初值修正
       ADDC   A,TH0 ;
       MOV    TH0,A           ;重装初值(高8位修正值)
       SETB   TR0             ;开启定时器T0
       DJNZ   R4, OUTT0       ;20次中断未到中断退出
ADDSS: MOV    R4,#14H         ;20次中断到(1秒)重赋初值
       MOV    R0,#71H         ;指向秒计时单元(71H-72H)
       ACALL  ADD1            ;调用加1程序(加1秒操作)
       MOV    A,R3            ;秒数据放入A(R3为2位十进制数组合)
       CLR    C               ;清进位标志
       CJNE   A,#60H,ADDMM 
ADDMM: JC     OUTT0           ;小于60秒时中断退出
       ACALL  CLR0            ;大于或等于60秒时对秒计时单元清0
       MOV    R0,#77H         ;指向分计时单元(76H-77H)
       ACALL  ADD1            ;分计时单元加1分钟
       MOV    A,R3            ;分数据放入A
       CLR    C               ;清进位标志
       CJNE   A,#60H,ADDHH 
ADDHH: JC     OUTT0           ;小于60分时中断退出
       ACALL  CLR0            ;大于或等于60分时分计时单元清0
       MOV    R0,#79H         ;指向小时计时单元(78H-79H)
       ACALL  ADD1            ;小时计时单元加1小时
       MOV    A,R3            ;时数据放入A
       CLR    C               ;清进位标志
       CJNE   A,#24H,HOUR 
HOUR:  JC     OUTT0           ;小于24小时中断退出
       ACALL  CLR0            ;大于或等于24小时小时计时单元清0
OUTT0: MOV    72H,76H         ;中断退出时将分、时计时单元数据移
       MOV    73H,77H         ;入对应显示单元
       MOV    74H,78H  
       MOV    75H,79H 
       POP    PSW             ;恢复状态字(出栈)
       POP    ACC             ;恢复累加器
       SETB   ET0             ;开放T0中断
       RETI                   ;中断返回
;**********************************************************
;; 闪动调时 程 序  
;**********************************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1: PUSH   ACC             ;中断现场保护
       PUSH   PSW  
       MOV    TL1, #0B0H      ;装定时器T1定时初值
       MOV    TH1, #3CH 
       DJNZ   R2,INTT1OUT     ;0.3秒未到退出中断(50MS中断6次)
       MOV    R2,#06H         ;重装0.3秒定时用初值
       CPL    02H             ;0.3秒定时到对闪烁标志取反
       JB     02H,FLASH1      ;02H位为1时显示单元"熄灭"
       MOV    72H,76H         ;02H位为0时正常显示
       MOV    73H,77H 
       MOV    74H,78H 
       MOV    75H,79H   
INTT1OUT:POP  PSW             ;恢复现场
       POP    ACC 
       RETI                   ;中断退出
FLASH1:JB     01H,FLASH2      ;01H位为1时,转小时熄灭控制
       MOV    72H,7AH         ;01H位为0时,"熄灭符"数据放入分
       MOV    73H,7AH         ;显示单元(72H-73H),将不显示分数据
       MOV    74H,78H  
       MOV    75H,79H  
       AJMP   INTT1OUT       ;转中断退出
FLASH2:MOV    72H,76H        ;01H位为1时,"熄灭符"数据放入小时
       MOV    73H,77H        ;显示单元(74H-75H),小时数据将不显示
       MOV    74H,7AH 
       MOV    75H,7AH   
       AJMP   INTT1OUT       ;转中断退出
;**********************************************************      
;; 加1子 程 序  
;**********************************************************
ADD1:  MOV    A,@R0          ;取当前计时单元数据到A
       DEC    R0             ;指向前一地址
       SWAP   A              ;A中数据高四位与低四位交换
       ORL    A,@R0          ;前一地址中数据放入A中低四位
       ADD    A,#01H         ;A加1操作
       DA     A              ;十进制调整
       MOV    R3,A           ;移入R3寄存器
       ANL    A,#0FH         ;高四位变0
       MOV    @R0,A          ;放回前一地址单元
       MOV    A,R3           ;取回R3中暂存数据
       INC    R0             ;指向当前地址单元
       SWAP   A              ;A中数据高四位与低四位交换
       ANL    A,#0FH         ;高四位变0
       MOV    @R0,A          ;数据放入当削地址单元中
       RET                   ;子程序返回
;**********************************************************
;; 清零程序  
;**********************************************************
;对计时单元复零用
CLR0:  CLR    A              ;清累加器
       MOV    @R0,A          ;清当前地址单元
       DEC    R0             ;指向前一地址
       MOV    @R0,A          ;前一地址单元清0
       RET                   ;子程序返回
;**********************************************************
;; 时钟调整程序  
;**********************************************************
;当调时按键按下时进入此程序
SETMM: CLR    ET0            ;关定时器T0中断
       CLR    TR0            ;关闭定时器T0
       LCALL  DL1S           ;调用1秒延时程序
       JB     P3.5,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)
       MOV    R2,#06H        ;进入调时状态,赋闪烁定时初值
       SETB   ET1            ;允许T1中断
       SETB   TR1            ;开启定时器T1
SET2:  JNB    P3.5,SET1      ;P3.7口为0(键未释放),等待
       SETB   00H            ;键释放,分调整闪烁标志置1
SET4:  JB     P3.5,SET3      ;等待键按下
       LCALL  DL05S          ;有键按下,延时0.5秒
       JNB    P3.5,SETHH     ;按下时间大于0.5秒转调小时状态
       MOV    R0,#77H        ;按下时间小于0.5秒加1分钟操作
       LCALL  ADD1           ;调用加1子程序
       MOV    A,R3           ;取调整单元数据
       CLR    C              ;清进位标志
       CJNE   A,#60H,HHH     ;调整单元数据与60比较
HHH:   JC     SET4           ;调整单元数据小于60转SET4循环
       LCALL  CLR0           ;调整单元数据大于或等于60时清0
       CLR    C              ;清进位标志
       AJMP   SET4           ;跳转到SET4循环
CLOSEDIS:SETB ET0            ;省电(LED不显示)状态。开T0中断
       SETB   TR0            ;开启T0定时器(开时钟)
CLOSE: JB     P3.5,CLOSE     ;无按键按下,等待。
       LCALL  DISPLAY        ;有键按下,调显示子程序延时削抖
       JB     P3.5,CLOSE     ;是干扰返回CLOSE等待
WAITH: JNB    P3.5,WAITH     ;等待键释放
       LJMP   START1         ;返回主程序(LED数据显示亮)
SETHH: CLR    00H            ;分闪烁标志清除(进入调小时状态)
SETHH1:JNB    P3.5,SET5      ;等待键释放
       SETB   01H            ;小时调整标志置1
SET6:  JB     P3.5,SET7      ;等待按键按下
       LCALL  DL05S          ;有键按下延时0.5秒
       JNB    P3.5,SETOUT    ;按下时间大于0.5秒退出时间调整
       MOV    R0,#79H        ;按下时间小于0.5秒加1小时操作
       LCALL  ADD1           ;调加1子程序
       MOV    A,R3  
       CLR    C 
       CJNE   A,#24H,HOUU    ;计时单元数据与24比较
HOUU:  JC     SET6           ;小于24转SET6循环
       LCALL  CLR0           ;大于或等于24时清0操作
       AJMP   SET6           ;跳转到SET6循环
SETOUT:JNB    P3.5,SETOUT1   ;调时退出程序。等待键释放
       LCALL  DISPLAY        ;延时削抖
       JNB    P3.5,SETOUT    ;是抖动,返回SETOUT再等待
       CLR    01H            ;清调小时标志
       CLR    00H            ;清调分标志
       CLR    02H            ;清闪烁标志
       CLR    TR1            ;关闭定时器T1
       CLR    ET1            ;关定时器T1中断
       SETB   TR0            ;开启定时器T0
       SETB   ET0            ;开定时器T0中断(计时开始)
       LJMP   START1         ;跳回主程序
SET1: LCALL   DISPLAY        ;键释放等待时调用显示程序(调分)
       AJMP   SET2           ;防止键按下时无时钟显示
SET3: LCALL   DISPLAY        ;等待调分按键时时钟显示用
       AJMP   SET4
SET5: LCALL   DISPLAY        ;键释放等待时调用显示程序(调小时)
       AJMP   SETHH1         ;防止键按下时无时钟显示
SET7: LCALL   DISPLAY        ;等待调小时按键时时钟显示用
       AJMP   SET6
SETOUT1:LCALL DISPLAY        ;退出时钟调整时键释放等待
       AJMP   SETOUT         ;防止键按下时无时钟显示
;**********************************************************
;; 显示程序 ;;
;**********************************************************
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY:MOV    R1,#70H       ;指向显示数据首址
       MOV     R5,#0FEH      ;扫描控制字初值
PLAY:  MOV     A,R5          ;扫描字放入A
       MOV     P2,A          ;从P3口输出
       MOV     A,@R1         ;取显示数据到A
       MOV     DPTR,#TAB     ;取段码表地址
       MOVC    A,@A+DPTR     ;查显示数据对应段码
       MOV     P0,A          ;段码放入P1口
       LCALL   DL1MS         ;显示1MS
       INC     R1            ;指向下一地址
       MOV     A,R5          ;扫描控制字放入A
       JNB     ACC.5,ENDOUT  ;ACC.5=0时一次显示结束
       RL      A             ;A中数据循环左移
       MOV     R5,A          ;放回R5内
       AJMP    PLAY          ;跳回PLAY循环
ENDOUT:SETB    P2.5          ;一次显示结束,P3口复位
       MOV     P0,#0FFH      ;P1口复位
       RET                   ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;    段码表 "0""1""2" "3""4""5""6""7" "8""9""不亮"
;**********************************************************
;; 延时程序 ;;
;**********************************************************
;1MS延时程序,LED显示程序用
DL1MS: MOV     R6,#14H
DL1:   MOV     R7,#19H
DL2:   DJNZ    R7,DL2
       DJNZ    R6,DL1
       RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS:ACALL   DISPLAY
       ACALL   DISPLAY
       ACALL   DISPLAY
       RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL    DL05S
      LCALL    DL05S
      RET
DL05S: MOV     R3,#20H ;8毫秒*32=0.196秒
DL05S1:LCALL   DISPLAY
       DJNZ    R3,DL05S1
       RET
       END           ;程序结束

⌨️ 快捷键说明

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