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

📄 4key_volume_con.asm

📁 十几个proteus的仿真实例
💻 ASM
字号:
;*******************************************************************************
;*文件:4key_volume_con.asm                                                     *
;*作者:张绍斌  2006/8/18                                                      *
;*版本:VER1.0                                                                  *
;*功能描述:键盘模拟音量数码管显示                                             *
;*          S1:音量+                                                           *
;*          S2:音量-                                                           *
;*          S3:最优音量级别                                                    *
;*          S4:夜深音量级别                                                    *
;*******************************************************************************
    KEY_OK      BIT     00h
    keyval_save    equ     45h
    key_delay      equ     46h
    
    VOLNUMB     EQU     22H     
    PHONE       EQU     21H
    COUNTER     EQU     23H     ;用于显示的计数器
    KEYVAL      EQU     25H
    DISPBUF     EQU     5EH
    FIRST       BIT     P2.7    ;第一位数码管的位控制
    SECOND      BIT     P2.6    ;第二位数码管的位控制
    TMRVAR      EQU     60110   ;65536-5000*12/11.0592  定时器初值5毫秒
    NUMLJ       EQU    44H
;===============================================================================        
    ORG     0000H   
    JMP     START
    ORG     0*8+3               ;INT0中断入口
    RETI
    ORG     1*8+3               ;TIMER0中断入口
    JMP     INT_T0              ;转去定时器0中断服务程序入口
    ORG     2*8+3               ;INT1中断入口
    RETI
    ORG     3*8+3               ;TIMER1中断入口
    RETI
    ORG     4*8+3               ;串行中断入口
    RETI
;===============================================================================
START:
    MOV     SP,#5FH
    MOV     P1,#0FFH          
    MOV     VOLNUMB,#40H
    call    init_t0
    SETB    EA
;===============================================================================
LOOP:
    ACALL   DISP_VOL
    call key
    jmp keyproc

    JMP     LOOP
;===============================================================================

;===============================================================================

;===============================================================================   
VOLUP:;键盘音量+
    MOV PHONE,VOLNUMB
    MOV A,PHONE
    XRL A,#70H
    JZ VOLUP1
    ACALL UAA
    MOV VOLNUMB,PHONE
    ret
VOLUP1: MOV VOLNUMB,#70H
       ret
;===============================================================================
VOLDW:;键盘音量-
     MOV PHONE,VOLNUMB
    MOV A,PHONE
    JZ VOLDW1
    ACALL DAA
    MOV VOLNUMB,PHONE
    ret
VOLDW1: MOV VOLNUMB,#00H
       ret
;===============================================================================
VOLRSUM:;最佳音量级别
    MOV VOLNUMB,#32H
    ret
VOL24:;夜深推荐音量级别
    MOV VOLNUMB,#24H
    ret
;===============================================================================   
DISP_VOL:;送显示处理
        MOV A,VOLNUMB
        SWAP A
        ANL A,#0FH
        MOV DISPBUF,A;十位到DISPBUF
        MOV A,VOLNUMB
        ANL A,#0FH
        MOV DISPBUF+1,A;个位到DISPBUF+1
        RET
;===============================================================================
UAA:;10进制位数递增1
        MOV A,PHONE
        SWAP A
        ANL A,#0FH
        MOV R5,A
        MOV A,PHONE
        ANL A,#0FH
        NOP
        CJNE A,#09H,UAA_1;到9就要变了
        NOP
        MOV R4,#00H
        INC R5;十位加1
        AJMP UAA_2
UAA_1:
        INC A
        MOV R4,A
UAA_2:
        MOV A,R5
        SWAP A
        ADD A,R4
        MOV PHONE,A
        RET
;===============================================================================
DAA:;10进制二位数递减1
        MOV A,PHONE
        SWAP A
        ANL A,#0FH
        MOV R5,A
        MOV A,PHONE;
        ANL A,#0FH
        JNZ DAA_1;A≠0就转移,把A-1,只减个位
        MOV R4,#09H;A=0则R4=#09H
        DEC R5;且把R5-1即十位减1
        NOP
        SJMP DAA_2;跳转
  DAA_1:
        DEC A
        MOV R4,A
  DAA_2:;十个位复原但十进制减1
        MOV A,R5;
        SWAP A
        ADD A,R4
        MOV PHONE,A
        RET
        
;///////////////////////////////////////////////////////////////////////////////
key:
;     clr key_ok
     orl p3,#00111100b
     mov a,p3
     orl a,#11000011b
     cpl a
     jz key_4

     call delay
     mov a,p3
     orl a,#11000011b
     cpl a
     jz key_4
     jnb acc.2,key_1
     mov keyval,#1
     jmp key_ret
key_1:
     jnb acc.3,key_2
     mov keyval,#2
     jmp key_ret
key_2:
     jnb acc.4,key_3
     mov keyval,#3
     jmp key_ret
key_3:
     jnb acc.5,key_4
     mov keyval,#4
     jmp key_ret
key_4:mov keyval,#0
key_ret:
     ret

delay:;                去键抖延时
         push psw
         setb rs0
         mov  r7,#50
     d1: mov  r6,#50
     d2: djnz r6,d2
         djnz r7,d1
         pop  psw
         ret   


;//////////////////////////////////////////////
keyproc:
     mov a,keyval;
     jz delay_4;键值为0,KEY_DELAY=129并保存KEYVAL后退出
     inc key_delay
     mov a,key_delay
     cjne a,#60,out

;     mov a,keyval
;     cjne a,#1,delay_0
;     jmp delay_1
;delay_0:
;     cjne a,#2,delay_3
;delay_1:
;    mov a,keyval_save    
;    cjne a,keyval,delay_3

;   jmp out

delay_3:
     call bijiao
;     mov r4,#00
;     mov r5,#00
     mov key_delay,#00h
     jmp out
delay_4:mov key_delay,#59
out:    ;mov keyval_save,keyval
;        jmp key_rest
jmp loop
     
;key_rest:

;          mov a,keyval
;          jnz bck_1
;bck_0:    
;          inc r4
;          cjne r4,#150,bck_2
;bck_3:
;          mov r4,#0h
;          inc r5
;          cjne r5,#16,bck_2
;          mov r5,#0
     
;          mov key_delay,#59
 ;         jmp bck_2
; bck_1:   
 ;         mov r4,#0
;          mov r5,#0
; bck_2:   jmp loop
     
;///////////////////////////////////  
bijiao:mov r6,keyval
       cjne r6,#1,ba_1
       call volup
       jmp ret4
ba_1:  cjne r6,#2,ba_2
       call voldw
       jmp ret4
ba_2:  cjne r6,#3,ba_3
       call vol24
       jmp ret4
ba_3:cjne r6,#4,ret4
      call volrsum
ret4:ret     
     
             
        
        
;===============================================================================    
INIT_T0:                ;初始化T0为5毫秒的定时器
    MOV     TMOD,#01H
    MOV     TH0,#HIGH(TMRVAR)
    MOV     TL0,#LOW(TMRVAR)
    SETB    ET0         ;开T0中断
    SETB    TR0         ;定时器0开始运行
    RET                 ;返回
;===============================================================================
;以下是中断程序,实现数码管显示
INT_T0:                 ;定时器T0的中断响应程序
    PUSH    ACC         ;ACC入栈
    PUSH    PSW         ;PSW入栈
    MOV TH0,#HIGH(TMRVAR)
    MOV TL0,#LOW(TMRVAR)
    SETB    FIRST
    SETB    SECOND      ;关显示
    MOV     A,#DISPBUF  ;显示缓冲区首地址
    ADD     A,Counter 
    MOV     R0,A
    MOV     A,@R0       ;根据计数器的值取相应的显示缓冲区的值
    MOV     DPTR,#DISPTAB   ;字形表首地址
    MOVC    A,@A+DPTR   ;取字形码
    MOV     P0,A        ;将字形码送P0位(段口)
    MOV     A,Counter   ;取计数器的值
    JZ      DISPFIRST   ;如果是0则显示第一位
    CLR     SECOND      ;否则显示第二位
    AJMP    DISPNEXT
DISPFIRST:
    CLR     FIRST       ;显示第一位 
DISPNEXT:
    INC     Counter     ;计数器加1
    MOV     A,Counter
    DEC     A           ;如果计数器计到2,则让它回0
    DEC     A 
    JZ      RSTCOUNT 
    AJMP    int_exit
RSTCOUNT:
    MOV     Counter,#0  ;计数器的值只能是0或1

INT_EXIT:   
    POP     PSW
    POP     ACC
    RETI
DISPTAB:    DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H 
    END

⌨️ 快捷键说明

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