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

📄 exp1.asm

📁 51单片机按键每按1次加1
💻 ASM
字号:
ORG 0000h
LJMP MAIN
ORG 0003h           /*外部中断0入口地址*/
LJMP INTE0          /*中断入口转移*/     
ORG 000Bh           /*定时器0中断入口地址*/
LJMP TIE0           /*中断入口转移*/
    
MAIN:MOV DPTR,#0E100H
    MOV A,#03H       
    MOVX @DPTR,A        
    MOV 2AH,#00H
   MOV 2BH,#00H
   MOV 2CH,#00H
   MOV 2DH,#00H
   MOV 2EH,#00H
   MOV 2FH,#00H   
   SETB  EX0           /*允许外部中断0中断*/
   SETB  EA            /*cpu开中断*/
   SETB  IT0           /*设置外部中断0下降沿有效*/ 
   SETB  ET0           /*允许定时器0中断*/
   CLR F0              /*加减法标志位清0*/
   MOV R0,#2AH         /*将数码管地址赋给R0,R1*/ 
   MOV R1,#2BH           
   MOV TMOD,#51H       /*设置定时器/计数器工作方式*/     
   MOV TL0,#0B0H       /*给定时器赋初值*/          
   MOV TH0,#3CH
   SETB IP.1           /*设置定时器0中断为高优先级*/        
   SETB P3.2          
   MOV R5,#0B0H         
   MOV R4,#03CH
   MOV R6,#05H
LOOP:LCALL DISPLAY         /*调用显示子程序*/            
    SJMP LOOP              
LOOP2:DJNZ R5,MDISPLAY     /*当连续加减显示时,显示一段时间*/
      DJNZ R4,MDISPLAY
      DJNZ R6,MDISPLAY
      RET                 
MDISPLAY:LCALL DISPLAY
         SJMP LOOP2                    
INTE0:SETB TR0             /*定时器0开始计时*/
      MOV R6,#20           
      MOV C,P3.2           /*判断int0是否为低电平,若为低电平,则转到CTIME子程序*/
       JNC CTIME
INTE00:CLR TR0             /*定时器0停止工作*/
       JB F0, DECE0        /*判断加减法标志位,若为1,则做减法,否则,做加法*/
       LJMP INCRE
    
CTIME:MOV C,P3.2           /*判断int0是否为高电平,若不是,则等待*/
      JNC CTIME 
TIE0:DJNZ R6,CTU           /*判断是否计时到2s,若没到,则重新赋初值*/
     MOV A,R6              /*若已经到2s,则连续做加减*/
     JZ INTE00
     JNC CTIME             /*若按键未到2s且仍然为低电平,则转到CTIME子程序继续等待*/
     CLR TR0                    /*若按键未到2s但已经为高电平,则结束计时*/
     MOV TL0,#0B0H
     MOV TH0,#3CH          /*给定时器0重新赋初值*/
     LJMP INTE00           /*转到INTE0子程序*/
                        
CTU:MOV TL0,#0B0H
    MOV TH0,#3CH
    RETI
                                                 
INCRE:MOV A,R6             
     CJNE @R0,#09H,SETR00 /*判断是否已经加到9,若没有,则转到STER00子程序*/
     MOV @R1,#01H         /*若已经加到9,则将十位置为1,个位置为0*/
     MOV @R0,#00H
     SETB F0               /*将加减法标志位置为1*/
     LJMP DISPLAY          /*调用显示*/          
     JZ LOOP2               
     JZ INTE00             /*若按键时间达到2s,则连续加减并显示*/  
     RETI                  
                      
SETR00:INC @R0            /*个位增1,并显示*/
       LJMP DISPLAY
       JZ LOOP2
       JZ INCRE
       RETI      
                    
DECE0:MOV A,R6                        
      CJNE @R1,#01H,DECE00  /*判断是否十位为1,若不是,则转到DECE00子程序*/
      MOV @R1,#00H          /*若十位为1,则将十位置为0,个位置为9并显示*/
      MOV @R0,#09H         
      LJMP DISPLAY           
       JZ LOOP2             /*判断按键是否达到2s,若达到,则显示并连续加减*/
       JZ DECE0             
       RETI       
     
                 
DECE00: CJNE @R0,#01H,SETR01 /*判断个位是否为1,若不是,则转到SETR01子程序*/
        CLR F0               /*若个位为1,则加减法标志位清0,个位减1并显示*/
      DEC @R0
      LJMP DISPLAY
      JZ LOOP2               /*判断按键是否达到2s,若达到,则显示并继续加减*/  
      JZ INTE00
      RETI     
                   
SETR01:DEC @R0               /*若个位不为1,则个位自减1并显示*/
       LJMP DISPLAY
       JZ LOOP2
       JZ DECE0
       RETI                                                                
                                   
DISPLAY:MOV R0,#2AH
        MOV R7,#00H
DISPN:  MOV DPTR,#0E102H
        MOV A,#00H
        MOVX @DPTR,A
        MOV DPTR,#DISPD
        MOV A,@R0
        MOVC A,@A+DPTR
        MOV DPTR,#0E101H
        MOVX @DPTR,A
        MOV DPTR,#DISPW
        MOV A,R7
        MOVC A,@A+DPTR
        MOV DPTR,#0E102H
        MOVX @DPTR,A
        LCALL DIMS
        INC R0
        INC R7
        CJNE R7,#06H,DISPN
        RET
DIMS:MOV 30H,#0FAH
DLP:  NOP
      NOP
      DJNZ 30H,DLP
      RET
DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H               
       DB  7FH,6FH,77H,7CH,39H,5EH,79H,71H
       DB  79H,50H,5CH,54H,40H,00H
DISPW:DB  01H,02H,04H,08H,10H,20H
                  

⌨️ 快捷键说明

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