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

📄 单片机.txt

📁 自己编写的关于数字钟的单片机程序.可实现多种功能.两个.
💻 TXT
字号:
  Z8279 EQU 0FF82H     ; 8279状态/命令口地址
  D8279 EQU 0FF80H     ; 8279数据口地址
  LEDMOD EQU 10H       ; 右端输入,8位字符显示
  LEDFEQ EQU 38H       ; 扫描频率分频系数为18h=24
  LEDWRO EQU 90H       ; 设定的将要写入的"显示RAM地址", 地址从0000开始,自动增量AI=1
  
  HOUR   EQU  42H      
  MINUTE EQU  41H      
  SECOND EQU  40H      
  KEY    EQU 43H      
    
  BASHI EQU 44H        
  BAFEN EQU 45H        
  BAMIAO EQU 46H      
  YISHI EQU 47H        
  YIFEN EQU 48H        
  YIMIAO EQU 49H       
  ERSHI EQU 4AH        
  ERFEN EQU 4BH        
  ERMIAO EQU 4CH       
  WUSHI EQU 4DH        
  WUFEN EQU 4EH        
  WUMIAO EQU 4FH       
 
  BASIGNAL  EQU 5AH     ;8定时到标志存放地址      
  YISIGNAL1 EQU 5BH     ;11:30第一次标志 
  YISIGNAL2 EQU 5CH     ;11:30第二次标志  
  ERSIGNAL  EQU 5DH     ;12:30到标志  
  WUSIGNAL1 EQU 5EH     ;5点到第一次标志 
  WUSIGNAL2 EQU 5FH     ;5点到第二次标志        
  
  MON EQU 2BH         
  LAST EQU 28H        
  NEXT EQU 29H        
  SHIFT EQU 2AH       	  
    
  ORG 0000H           ;主程序开始
  AJMP START
  ORG 000BH
  AJMP T0INT
  ORG 0040H
START:
  MOV BASHI,#08H
  MOV BAFEN,#00H
  MOV BAMIAO,#00H
  MOV YISHI,#11H
  MOV YIFEN,#30H
  MOV YIMIAO,#00H
  MOV ERSHI,#12H
  MOV ERFEN,#30H
  MOV ERMIAO,#00H
  MOV WUSHI,#17H
  MOV WUFEN,#00H
  MOV WUMIAO,#00H
  CLR P1.0           ;开始时灭p1,p2
  CLR P1.1
  CLR P1.2           
  MOV R1,#20H        ;开启一个从20开始的内存块用来存表的读数,初始清零
  MOV R2,#08H
  MOV A,#00H    
 LOOP22:                
  MOV @R1,A
  INC R1
  DJNZ R2,LOOP22
  MOV 22H,#40H        
  MOV 25H,#40H
  MOV R1,#50H         ;开启一个从50开始的内存块用来存显示定时时间的读数,初始清零
  MOV R2,#08H
  MOV A,#40H
 LOOP21:                
  MOV @R1,A      
  INC R1
  DJNZ R2,LOOP21
  MOV 52H,#40H       
  MOV 55H,#40H
  MOV SP,#60H
  MOV SECOND,#00H     ; 初始清表的各位值
  MOV MINUTE,#00H
  MOV HOUR,#00H
  LCALL LOOP77        ;查表子程序  
  LCALL INIT8279      ;显示子程序
  CLR TF0
  MOV TMOD,#01H       ;设定T0为模式1定时方式
  MOV TH0,#4BH
  MOV TL0,#0FCH       ;T0定时时间为50ms
  MOV IE,#82H         ;开中断
  SETB TR0         
  MOV R2,#14H         ;计数器初值20
 DENG:
  LCALL WAIT          ;等待键盘输入程序
  SJMP DENG   
    
INIT8279:             ;显示子程序
      PUSH DPH
      PUSH DPL
      PUSH ACC
      PUSH 02H
      PUSH 01H
      LCALL DELAY      
      MOV R1,#20H
      MOV R2,#08H
      MOV DPTR,#Z8279  ;设置8279工作方式
      MOV A,#LEDMOD
      MOVX @DPTR,A
      MOV A,#LEDFEQ
      MOVX @DPTR,A
      MOV DPTR,#Z8279
      MOV A,#LEDWRO
      MOVX @DPTR,A
      MOV DPTR,#D8279

      MOV R1,#20H             
  LOOP33:
      MOV A,@R1
      MOVX @DPTR,A
      INC R1
      DJNZ R2,LOOP33
      SJMP LOOP30
      POP 01H
      POP 02H
      POP ACC
      POP DPL 
      POP DPH
      RET
      
DELAY:                 
     PUSH 00H
     PUSH 01H
     MOV R0,#00H
  DELAY1:
     MOV R1,#00H
     DJNZ R1,$
     DJNZ R0,DELAY1
     POP 01H
     POP 00H
     RET
      
T0INT:                  ;中断程序
     MOV TH0,#4BH       
     MOV TL0,#0FCH
     DJNZ R2,LOOP4      ;判断是否到1秒,到1秒中断返回
     MOV R2,#14H         
     MOV A,SECOND       
     ADD A,#01H         ;秒加1
     DA A
     MOV SECOND,A
     CJNE A,#60H,LOOP5  
     MOV  SECOND,#00H   

     MOV A, MINUTE
     ADD A,#01H         ;分加1
     DA A
     MOV  MINUTE,A
     CJNE A,#60H,LOOP5  ;判断是否到1小时
     MOV MINUTE,#00H  
       
     MOV A,HOUR
     ADD A,#01H         ;小时加1
     DA A
     MOV HOUR,A
     CJNE A,#24H,LOOP5  
     MOV HOUR,#00H

  LOOP5:   
     MOV R2,#14H        ;计数器重赋初值20
     LCALL LOOP77       ;调查表子程序
     LCALL DINGSHIDAO   ;调报时自程序
  LOOP4:
     RETI
     
     
LOOP77:                  ;查字形表子程序
     LCALL CHAIFEN       ;调拆分秒位程序
     MOV A,R3 
     MOV DPTR,#LEDSEG    ;查表找出字形码
     MOVC A,@A+DPTR   
     MOV 20H,A
     MOV A,R4 
     MOVC A,@A+DPTR
     MOV 21H,A
        
     LCALL CHAIFEN1      ;调拆分分位程序
     MOV A,R3 
     MOV DPTR,#LEDSEG    ;查表找出字形码
     MOVC A,@A+DPTR
     MOV 23H,A
     MOV A,R4
     MOVC A,@A+DPTR
     MOV 24H,A
     
     LCALL CHAIFEN2      ;调拆分时位程序
     MOV A,R3 
     MOV DPTR,#LEDSEG    ;查表找出字形码
     MOVC A,@A+DPTR
     MOV 26H,A
     MOV A,R4
     MOVC A,@A+DPTR
     MOV 27H,A
     LCALL INIT8279
     RET
     
CHAIFEN:                ;拆分表的秒位子程序
     PUSH ACC
     MOV A,SECOND
     MOV R3,A
     MOV R4,A
     MOV A,#0FH
     ANL A,R3
     MOV R3,A
     MOV A,#0F0H
     ANL A,R4
     SWAP A
     MOV R4,A
     POP ACC
     RET
     
CHAIFEN1:                ;拆分表的分位子程序
     PUSH ACC
     MOV A, MINUTE
     MOV R3,A
     MOV R4,A
     MOV A,#0FH
     ANL A,R3
     MOV R3,A
     MOV A,#0F0H
     ANL A,R4
     SWAP A
     MOV R4,A
     POP ACC
     RET
     
CHAIFEN2:                ;拆分表的时位子程序
     PUSH ACC
     MOV A,HOUR
     MOV R3,A
     MOV R4,A
     MOV A,#0FH
     ANL A,R3
     MOV R3,A
     MOV A,#0F0H
     ANL A,R4
     SWAP A
     MOV R4,A
     POP ACC
     RET
     
     
WAIT:                   ;等待键盘输入子程序
    MOV DPTR,#Z8279     ;从8279的状态口读状态
    MOVX A,@DPTR        ;保留状态字的低4位
    ANL A,#0FH          ;如果低4位为0等待
    JZ WAIT 
    MOV A,#40H          ;如果有键按下时向8279发读FIFO RAM命令
    MOVX @DPTR,A        ;设定FIFO RAM的地址为000
    MOV DPTR,#D8279     ;指向8279的数据口
    MOVX A,@DPTR        ;读出FIFO RAM中000单元中的键值                       
   YI:                  ;判断键值的内容
    CJNE A,#01H,ER      
    LJMP FUZHI
   ER:
    CJNE A,#02H,SAN     
    LJMP FUZHI
   SAN:
    CJNE A,#03H,SI
    LJMP FUZHI
   SI:
    CJNE A,#04H,WU
    LJMP FUZHI
   WU:
    CJNE A,#05H,LIU
    LJMP FUZHI
   LIU:
    CJNE A,#06H,QI
    LJMP FUZHI
   QI:
    CJNE A,#07H,BA
    LJMP FUZHI
   BA:
    CJNE A,#08H,JIU
    LJMP FUZHI
   JIU:
    CJNE A,#09H,LING
    LJMP FUZHI
   LING:
    CJNE A,#00H,MIAO
    LJMP FUZHI
   MIAO:
    CJNE A,#SHIFT,FEN       
    LCALL TIAOMIAO
   FEN:
    CJNE A,#NEXT, SHI      
    LCALL TIAOFEN
   SHI:
    CJNE A,#LAST,ZHUANYI     
    LCALL TIAOSHI
    LJMP LOOP44   
   FUZHI:
    MOV KEY,A             
   LOOP44:
    RET
    ZHUANYI:
    LJMP WAIT
     
     
TIAOMIAO:                     ;调秒位子程序
     CLR EA                     
     MOV SECOND,#00H
     LCALL LOOP77
 COME:   
     LCALL WAIT                 ;从键盘读十位的值
     MOV A, KEY
     CJNE A,#01H,L2
     LJMP CONTINUE
   L2:
     CJNE A,#02H,L3 
     LJMP CONTINUE
   L3:
     CJNE A,#03H,L4
     LJMP CONTINUE
   L4:
     CJNE A,#04H,L5
     LJMP CONTINUE
   L5:
     CJNE A,#05H,GO
   CONTINUE:     
     MOV B,#10H                  
     MUL AB                     ;乘10
     MOV SECOND, A
     LCALL WAIT                 ;从键盘读个位的值
     MOV A,SECOND
     ADD A,KEY
     DA A
     MOV SECOND, A
     LCALL LOOP77
     SETB EA
     LJMP TT 
   GO: 
     MOV  A,#76H
     MOV  21H,a
     LCALL INIT8279
     LJMP COME
   TT:                              
     RET                        
     
TIAOFEN:                     ;调分位子程序
     CLR EA                     
     MOV MINUTE,#00H
     LCALL LOOP77
   COME1:  
     LCALL WAIT                 ;从键盘读十位的值
     MOV A, KEY 
        CJNE A,#01H,LL2
        LJMP CONTINUE1
   LL2:
        CJNE A,#02H,LL3 
        LJMP CONTINUE1
   LL3:
        CJNE A,#03H,LL4
        LJMP CONTINUE1
   LL4:
        CJNE A,#04H,LL5
        LJMP CONTINUE1
   LL5:
        CJNE A,#05H,GO1
   CONTINUE1:     
     MOV B,#10H                 
     MUL AB                     ;乘10
     MOV MINUTE, A
     LCALL WAIT                 ;从键盘读个位的值
     MOV A,MINUTE
     ADD A,KEY
     DA A
     MOV MINUTE, A
     LCALL LOOP77
     SETB EA 
     LJMP TT1
   GO1: 
     MOV  a,#76h
     MOV  24h,a
     LCALL INIT8279
     LJMP COME1
   TT1:                              
     RET
     
TIAOSHI:                   ;调时位子程序
     CLR EA                     
     MOV HOUR,#00H
     LCALL LOOP77
   DU: 
     LCALL WAIT                 ;从键盘读十位的值
     MOV A, KEY
     CJNE A,#00H,J1
     LJMP MO
   J1:
     CJNE A,#01H,J2
     LJMP MO
   J2:
     CJNE A,#02H,CUO
     LJMP DUI
   CUO:
     MOV  a,#76h
     MOV  27h,a
     LCALL INIT8279
     LJMP DU      
   DUI:  
     MOV B,#10H
     MUL AB                     ;乘10
     MOV HOUR, A
     
   DU1:  
     LCALL WAIT                 ;从键盘读个位的值
     CJNE A,#00H,JJ1
     LJMP PLUS
   JJ1:
     CJNE A,#01H,JJ2
     LJMP PLUS
   JJ2:
     CJNE A,#02H,JJ3
     LJMP PLUS
   JJ3:
     CJNE A,#03H,CUO1
     LJMP PLUS
   CUO1:
     MOV  a,#76h
     MOV  26h,a
     LCALL INIT8279
     LJMP DU1
            
   PLUS: 
     MOV A,HOUR         
     ADD A,KEY
     DA A
     MOV HOUR, A
     LCALL LOOP77     
     LJMP FANHUI
        
   MO:
     MOV B,#10H
     MUL AB                     ;乘10
     MOV HOUR, A
     LCALL WAIT                 ;从键盘读个位的值
     MOV A,HOUR
     ADD A,KEY
     DA A
     MOV HOUR, A
     LCALL LOOP77
   FANHUI:
     SETB EA                    
     RET
     

          
     
DINGSHIDAO:   
   EIGHT:                       ;判断第一个定时时间
     MOV A,HOUR                 
     CJNE A, BASHI,EIGHT1
     MOV A, MINUTE
     CJNE A, BAFEN,EIGHT1
     MOV A,SECOND 
     CJNE A,BAMIAO,EIGHT1 
     SETB P1.0                  ;定时时间到亮p1灯
   EIGHT1:
     MOV A,HOUR
     CJNE A, BASHI,ELEVEN 
     MOV A, MINUTE
     CJNE A, BAFEN,ELEVEN 
     MOV A,BAMIAO
     ADD A,#02H                ;将秒位的值加2,存在baxin中
     MOV BASIGNAL,A
     MOV A,SECOND 
     CJNE A,BASIGNAL,ELEVEN          
     CLR P1.0                  ;两秒钟后灭灯p1
   
   ELEVEN:                   ;判断第二个定时时间
     MOV A, HOUR               
     CJNE A, YISHI,ELEVEN1
     MOV A, MINUTE
     CJNE A, YIFEN,ELEVEN1
     MOV A,SECOND 
     CJNE A,YIMIAO,ELEVEN1
     SETB P1.0                 ;定时时间到亮p1,p2灯
     SETB P1.1
   ELEVEN1:
     MOV A, HOUR
     CJNE A, YISHI,ELEVEN2
     MOV A, MINUTE
     CJNE A, YIFEN,ELEVEN2
     MOV A,YIMIAO
     ADD A,#02H                ;将秒位的值加2,存在YIXIN1中
     MOV YISIGNAL1,A
     MOV A,SECOND 
     CJNE A,YISIGNAL1,ELEVEN2
     CLR P1.0                  ;两秒钟后灭灯p1
   ELEVEN2:
     MOV A,YISHI
     ADD A,#01H                ;将时位的值加1,存在YIXIN2中
     MOV YISIGNAL2,A
     MOV A, HOUR
     CJNE A,YISIGNAL2,TWELVE
     MOV A, MINUTE
     CJNE A, YIFEN,TWELVE
     MOV A,SECOND 
     CJNE A,YIMIAO,TWELVE
     CLR P1.1                 ;一小时后灭灯p2
    
   TWELVE:                     ;判断第三个定时时间
     MOV A, HOUR              
     CJNE A, ERSHI,TWELVE1
     MOV A, MINUTE
     CJNE A, ERFEN,TWELVE1
     MOV A,SECOND 
     CJNE A,ERMIAO,TWELVE1
     SETB P1.0                ;定时时间到亮p1灯
   TWELVE1:
     MOV A, HOUR 
     CJNE A, ERSIGNAL,FIVE
     MOV A, MINUTE
     CJNE A, ERFEN,FIVE
     MOV A,ERMIAO
     ADD A,#02H               ;将秒位的值加2,存在ERXIN中
     MOV ERSIGNAL,A
     MOV A,SECOND 
     CJNE A,ERSIGNAL ,FIVE
     CLR P1.0                 ;两秒钟后灭灯p1
     
   FIVE:                       ;判断第四个定时时间
     MOV A, HOUR              
     CJNE A, WUSHI,FIVE1
     MOV A, MINUTE
     CJNE A,WUFEN,FIVE1
     MOV A,SECOND 
     CJNE A,WUMIAO,FIVE1
     SETB P1.0                ;定时时间到亮p1,p2灯
     SETB P1.1
   FIVE1:
     MOV A, HOUR
     CJNE A, WUSHI,FIVE2
     MOV A, MINUTE
     CJNE A,WUFEN,FIVE2
     MOV A,WUMIAO
     ADD A,#02H               ;将秒位的值加2,存在WUXIN1中
     MOV WUSIGNAL1,A
     MOV A,SECOND 
     CJNE A,WUSIGNAL1,FIVE2
     CLR P1.0                 ;两秒钟后灭灯p1
   FIVE2:
     MOV A, HOUR
     CJNE A, WUSHI,LOOPBB
     MOV A,WUFEN
     ADD A,#10H               ;将分位的值加10,存在WUXIN2中
     MOV WUSIGNAL2,A
     MOV A, MINUTE
     CJNE A,WUSIGNAL2,LOOPBB
     MOV A,SECOND 
     CJNE A,WUMIAO,LOOPBB
     CLR P1.1                 ;十分钟后灭灯p2
   LOOPBB:
     RET
     
  
LEDSEG: DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H;
        DB  7FH,6FH,77H,7CH,39H,5EH,79H,71H;
     END
      
     

⌨️ 快捷键说明

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