📄 ad_key.s
字号:
.module AD_key.c
.area vector(rom, abs)
.org 56
jmp _AD_handler
.org 36
jmp _TC0_handler
.area text(rom, con, rel)
.dbfile C:\AVR\M\1\AD_key.c
.dbfunc e AD_handler _AD_handler fV
.even
_AD_handler::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 17
;
; #include "AD_key.h"
;
; //---------全局变量定义----------//
; uint8 AD_data,AD_data1,AD_data2;
; uint8 tmp;
; uint8 AD_Flag,AD_time;
; uint8 key_num;
;
;
; //-------------------------------//
; //
; // AD中断处理函数
; //
; //-------------------------------//
; void AD_handler(void)
; {
.dbline 18
; AD_data=ADCH;
in R2,0x5
sts _AD_data,R2
.dbline 20
;
; if(AD_data>=0xF0)
mov R24,R2
cpi R24,240
brlo L2
.dbline 21
; {
.dbline 22
; AD_Flag=0;
clr R2
sts _AD_Flag,R2
.dbline 23
; AD_time=0;
sts _AD_time,R2
.dbline 24
; }
xjmp L3
L2:
.dbline 25
; else if(AD_Flag==0)
lds R2,_AD_Flag
tst R2
breq X0
xjmp L4
X0:
.dbline 26
; {
.dbline 27
; AD_time++;
lds R24,_AD_time
subi R24,255 ; addi 1
sts _AD_time,R24
.dbline 28
; if(AD_time==3)
cpi R24,3
breq X1
xjmp L6
X1:
.dbline 29
; {
.dbline 30
; if(AD_data1>AD_data2) tmp = AD_data2;
lds R2,_AD_data2
lds R3,_AD_data1
cp R2,R3
brsh L8
.dbline 30
sts _tmp,R2
xjmp L9
L8:
.dbline 31
; else tmp = AD_data1;
lds R2,_AD_data1
sts _tmp,R2
L9:
.dbline 32
; if(tmp>AD_data) tmp = AD_data;
lds R2,_AD_data
lds R3,_tmp
cp R2,R3
brsh L10
.dbline 32
sts _tmp,R2
L10:
.dbline 34
;
; if(tmp<0x0F) key_num = 1;
lds R24,_tmp
cpi R24,15
brsh L12
.dbline 34
ldi R24,1
sts _key_num,R24
xjmp L13
L12:
.dbline 35
; else if(tmp>0x7C&&tmp<0x8F)key_num=2;
ldi R24,124
lds R2,_tmp
cp R24,R2
brsh L14
mov R24,R2
cpi R24,143
brsh L14
.dbline 35
ldi R24,2
sts _key_num,R24
xjmp L15
L14:
.dbline 36
; else if(tmp>0xBC&&tmp<0xCA)key_num=3;
ldi R24,188
lds R2,_tmp
cp R24,R2
brsh L16
mov R24,R2
cpi R24,202
brsh L16
.dbline 36
ldi R24,3
sts _key_num,R24
xjmp L17
L16:
.dbline 37
; else if(tmp>0xA8&&tmp<0xBC)key_num=4;
ldi R24,168
lds R2,_tmp
cp R24,R2
brsh L18
mov R24,R2
cpi R24,188
brsh L18
.dbline 37
ldi R24,4
sts _key_num,R24
xjmp L19
L18:
.dbline 38
; else if(tmp>0xD2&&tmp<0xDF)key_num=5;
ldi R24,210
lds R2,_tmp
cp R24,R2
brsh L20
mov R24,R2
cpi R24,223
brsh L20
.dbline 38
ldi R24,5
sts _key_num,R24
xjmp L21
L20:
.dbline 39
; else if(tmp>0xC9&&tmp<0xD3)key_num=6;
ldi R24,201
lds R2,_tmp
cp R24,R2
brsh L22
mov R24,R2
cpi R24,211
brsh L22
.dbline 39
ldi R24,6
sts _key_num,R24
xjmp L23
L22:
.dbline 40
; else key_num=0;
clr R2
sts _key_num,R2
L23:
L21:
L19:
L17:
L15:
L13:
.dbline 42
;
; AD_Flag=1;
ldi R24,1
sts _AD_Flag,R24
.dbline 43
; }
xjmp L7
L6:
.dbline 44
; else if(AD_time==1)AD_data1 = AD_data;
lds R24,_AD_time
cpi R24,1
brne L24
.dbline 44
lds R2,_AD_data
sts _AD_data1,R2
xjmp L25
L24:
.dbline 45
; else if(AD_time==2)AD_data2 = AD_data;
lds R24,_AD_time
cpi R24,2
brne L26
.dbline 45
lds R2,_AD_data
sts _AD_data2,R2
L26:
L25:
L7:
.dbline 46
; }
L4:
L3:
.dbline -2
L1:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e AD_Init _AD_Init fV
.even
_AD_Init::
.dbline -1
.dbline 57
; }
;
;
;
; //---------------------------------//
; //
; // AD初始化函数
; //
; //---------------------------------//
; void AD_Init(void)
; {
.dbline 58
; PORTA &= 0x7F; // PA7无上拉
in R24,0x1b
andi R24,127
out 0x1b,R24
.dbline 59
; DDRA &= 0x7F; // 设置PA7口为输入
in R24,0x1a
andi R24,127
out 0x1a,R24
.dbline 60
; ADMUX=0x67; // 基准AVCC,左对齐选择第7通道
ldi R24,103
out 0x7,R24
.dbline 61
; ADCSRA=0xCE; // 采用单次转换模式,64分频
ldi R24,206
out 0x6,R24
.dbline 62
; ADCSRA|=BIT(ADSC); // 启动一次哑转换
sbi 0x6,6
.dbline 63
; SREG=0x80; // 开中断
ldi R24,128
out 0x3f,R24
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbend
.dbfunc e TC0_handler _TC0_handler fV
.even
_TC0_handler::
st -y,R0
in R0,0x3f
st -y,R0
.dbline -1
.dbline 74
; }
;
;
;
; //---------------------------------//
; //
; // T/C0中断函数
; //
; //---------------------------------//
; void TC0_handler(void)
; {
.dbline 75
; ADCSRA|=BIT(ADSC); // 进行一次AD转换
sbi 0x6,6
.dbline -2
L29:
ld R0,y+
out 0x3f,R0
ld R0,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e TC0_Init _TC0_Init fV
.even
_TC0_Init::
.dbline -1
.dbline 86
; }
;
;
;
; //---------------------------------//
; //
; // T/C0初始化函数
; //
; //---------------------------------//
; void TC0_Init(void)
; {
.dbline 89
; // 16MHz模式下,16ms中断一次,作为AD采样间隔基准
;
; TCNT0=0; // 定时器0初值
clr R2
out 0x32,R2
.dbline 91
;
; TCCR0 = BIT(CS02)| BIT(CS00); // 预分频 ck/1024 ,启动计数器
ldi R24,5
out 0x33,R24
.dbline 93
;
; TIMSK = BIT(TOIE0); // T/C0 中断允许
ldi R24,1
out 0x37,R24
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\AVR\M\1\AD_key.c
_key_num::
.blkb 1
.dbsym e key_num _key_num c
_tmp::
.blkb 1
.dbsym e tmp _tmp c
_AD_time::
.blkb 1
.dbsym e AD_time _AD_time c
_AD_Flag::
.blkb 1
.dbsym e AD_Flag _AD_Flag c
_AD_data2::
.blkb 1
.dbsym e AD_data2 _AD_data2 c
_AD_data1::
.blkb 1
.dbsym e AD_data1 _AD_data1 c
_AD_data::
.blkb 1
.dbsym e AD_data _AD_data c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -