📄 4key_volume_con.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 + -