📄 ad_key.lis
字号:
.module AD_key.c
.area vector(rom, abs)
.org 56
0038 0C940000 jmp _AD_handler
.org 36
0024 0C94A500 jmp _TC0_handler
.area text(rom, con, rel)
0000 .dbfile C:\AVR\M\1\AD_key.c
0000 .dbfunc e AD_handler _AD_handler fV
.even
0000 _AD_handler::
0000 2A92 st -y,R2
0002 3A92 st -y,R3
0004 8A93 st -y,R24
0006 9A93 st -y,R25
0008 2FB6 in R2,0x3f
000A 2A92 st -y,R2
000C .dbline -1
000C .dbline 17
000C ;
000C ; #include "AD_key.h"
000C ;
000C ; //---------全局变量定义----------//
000C ; uint8 AD_data,AD_data1,AD_data2;
000C ; uint8 tmp;
000C ; uint8 AD_Flag,AD_time;
000C ; uint8 key_num;
000C ;
000C ;
000C ; //-------------------------------//
000C ; //
000C ; // AD中断处理函数
000C ; //
000C ; //-------------------------------//
000C ; void AD_handler(void)
000C ; {
000C .dbline 18
000C ; AD_data=ADCH;
000C 25B0 in R2,0x5
000E 20920600 sts _AD_data,R2
0012 .dbline 20
0012 ;
0012 ; if(AD_data>=0xF0)
0012 822D mov R24,R2
0014 803F cpi R24,240
0016 30F0 brlo L2
0018 .dbline 21
0018 ; {
0018 .dbline 22
0018 ; AD_Flag=0;
0018 2224 clr R2
001A 20920300 sts _AD_Flag,R2
001E .dbline 23
001E ; AD_time=0;
001E 20920200 sts _AD_time,R2
0022 .dbline 24
0022 ; }
0022 7EC0 xjmp L3
0024 L2:
0024 .dbline 25
0024 ; else if(AD_Flag==0)
0024 20900300 lds R2,_AD_Flag
0028 2220 tst R2
002A 09F0 breq X0
002C 79C0 xjmp L4
002E X0:
002E .dbline 26
002E ; {
002E .dbline 27
002E ; AD_time++;
002E 80910200 lds R24,_AD_time
0032 8F5F subi R24,255 ; addi 1
0034 80930200 sts _AD_time,R24
0038 .dbline 28
0038 ; if(AD_time==3)
0038 8330 cpi R24,3
003A 09F0 breq X1
003C 60C0 xjmp L6
003E X1:
003E .dbline 29
003E ; {
003E .dbline 30
003E ; if(AD_data1>AD_data2) tmp = AD_data2;
003E 20900400 lds R2,_AD_data2
0042 30900500 lds R3,_AD_data1
0046 2314 cp R2,R3
0048 18F4 brsh L8
004A .dbline 30
004A 20920100 sts _tmp,R2
004E 04C0 xjmp L9
0050 L8:
0050 .dbline 31
0050 ; else tmp = AD_data1;
0050 20900500 lds R2,_AD_data1
0054 20920100 sts _tmp,R2
0058 L9:
0058 .dbline 32
0058 ; if(tmp>AD_data) tmp = AD_data;
0058 20900600 lds R2,_AD_data
005C 30900100 lds R3,_tmp
0060 2314 cp R2,R3
0062 10F4 brsh L10
0064 .dbline 32
0064 20920100 sts _tmp,R2
0068 L10:
0068 .dbline 34
0068 ;
0068 ; if(tmp<0x0F) key_num = 1;
0068 80910100 lds R24,_tmp
006C 8F30 cpi R24,15
006E 20F4 brsh L12
0070 .dbline 34
0070 81E0 ldi R24,1
0072 80930000 sts _key_num,R24
0076 3FC0 xjmp L13
0078 L12:
0078 .dbline 35
0078 ; else if(tmp>0x7C&&tmp<0x8F)key_num=2;
0078 8CE7 ldi R24,124
007A 20900100 lds R2,_tmp
007E 8215 cp R24,R2
0080 38F4 brsh L14
0082 822D mov R24,R2
0084 8F38 cpi R24,143
0086 20F4 brsh L14
0088 .dbline 35
0088 82E0 ldi R24,2
008A 80930000 sts _key_num,R24
008E 33C0 xjmp L15
0090 L14:
0090 .dbline 36
0090 ; else if(tmp>0xBC&&tmp<0xCA)key_num=3;
0090 8CEB ldi R24,188
0092 20900100 lds R2,_tmp
0096 8215 cp R24,R2
0098 38F4 brsh L16
009A 822D mov R24,R2
009C 8A3C cpi R24,202
009E 20F4 brsh L16
00A0 .dbline 36
00A0 83E0 ldi R24,3
00A2 80930000 sts _key_num,R24
00A6 27C0 xjmp L17
00A8 L16:
00A8 .dbline 37
00A8 ; else if(tmp>0xA8&&tmp<0xBC)key_num=4;
00A8 88EA ldi R24,168
00AA 20900100 lds R2,_tmp
00AE 8215 cp R24,R2
00B0 38F4 brsh L18
00B2 822D mov R24,R2
00B4 8C3B cpi R24,188
00B6 20F4 brsh L18
00B8 .dbline 37
00B8 84E0 ldi R24,4
00BA 80930000 sts _key_num,R24
00BE 1BC0 xjmp L19
00C0 L18:
00C0 .dbline 38
00C0 ; else if(tmp>0xD2&&tmp<0xDF)key_num=5;
00C0 82ED ldi R24,210
00C2 20900100 lds R2,_tmp
00C6 8215 cp R24,R2
00C8 38F4 brsh L20
00CA 822D mov R24,R2
00CC 8F3D cpi R24,223
00CE 20F4 brsh L20
00D0 .dbline 38
00D0 85E0 ldi R24,5
00D2 80930000 sts _key_num,R24
00D6 0FC0 xjmp L21
00D8 L20:
00D8 .dbline 39
00D8 ; else if(tmp>0xC9&&tmp<0xD3)key_num=6;
00D8 89EC ldi R24,201
00DA 20900100 lds R2,_tmp
00DE 8215 cp R24,R2
00E0 38F4 brsh L22
00E2 822D mov R24,R2
00E4 833D cpi R24,211
00E6 20F4 brsh L22
00E8 .dbline 39
00E8 86E0 ldi R24,6
00EA 80930000 sts _key_num,R24
00EE 03C0 xjmp L23
00F0 L22:
00F0 .dbline 40
00F0 ; else key_num=0;
00F0 2224 clr R2
00F2 20920000 sts _key_num,R2
00F6 L23:
00F6 L21:
00F6 L19:
00F6 L17:
00F6 L15:
00F6 L13:
00F6 .dbline 42
00F6 ;
00F6 ; AD_Flag=1;
00F6 81E0 ldi R24,1
00F8 80930300 sts _AD_Flag,R24
00FC .dbline 43
00FC ; }
00FC 11C0 xjmp L7
00FE L6:
00FE .dbline 44
00FE ; else if(AD_time==1)AD_data1 = AD_data;
00FE 80910200 lds R24,_AD_time
0102 8130 cpi R24,1
0104 29F4 brne L24
0106 .dbline 44
0106 20900600 lds R2,_AD_data
010A 20920500 sts _AD_data1,R2
010E 08C0 xjmp L25
0110 L24:
0110 .dbline 45
0110 ; else if(AD_time==2)AD_data2 = AD_data;
0110 80910200 lds R24,_AD_time
0114 8230 cpi R24,2
0116 21F4 brne L26
0118 .dbline 45
0118 20900600 lds R2,_AD_data
011C 20920400 sts _AD_data2,R2
0120 L26:
0120 L25:
0120 L7:
0120 .dbline 46
0120 ; }
0120 L4:
0120 L3:
0120 .dbline -2
0120 L1:
0120 2990 ld R2,y+
0122 2FBE out 0x3f,R2
0124 9991 ld R25,y+
0126 8991 ld R24,y+
0128 3990 ld R3,y+
012A 2990 ld R2,y+
012C .dbline 0 ; func end
012C 1895 reti
012E .dbend
012E .dbfunc e AD_Init _AD_Init fV
.even
012E _AD_Init::
012E .dbline -1
012E .dbline 57
012E ; }
012E ;
012E ;
012E ;
012E ; //---------------------------------//
012E ; //
012E ; // AD初始化函数
012E ; //
012E ; //---------------------------------//
012E ; void AD_Init(void)
012E ; {
012E .dbline 58
012E ; PORTA &= 0x7F; // PA7无上拉
012E 8BB3 in R24,0x1b
0130 8F77 andi R24,127
0132 8BBB out 0x1b,R24
0134 .dbline 59
0134 ; DDRA &= 0x7F; // 设置PA7口为输入
0134 8AB3 in R24,0x1a
0136 8F77 andi R24,127
0138 8ABB out 0x1a,R24
013A .dbline 60
013A ; ADMUX=0x67; // 基准AVCC,左对齐选择第7通道
013A 87E6 ldi R24,103
013C 87B9 out 0x7,R24
013E .dbline 61
013E ; ADCSRA=0xCE; // 采用单次转换模式,64分频
013E 8EEC ldi R24,206
0140 86B9 out 0x6,R24
0142 .dbline 62
0142 ; ADCSRA|=BIT(ADSC); // 启动一次哑转换
0142 369A sbi 0x6,6
0144 .dbline 63
0144 ; SREG=0x80; // 开中断
0144 80E8 ldi R24,128
0146 8FBF out 0x3f,R24
0148 .dbline -2
0148 L28:
0148 .dbline 0 ; func end
0148 0895 ret
014A .dbend
014A .dbfunc e TC0_handler _TC0_handler fV
.even
014A _TC0_handler::
014A 0A92 st -y,R0
014C 0FB6 in R0,0x3f
014E 0A92 st -y,R0
0150 .dbline -1
0150 .dbline 74
0150 ; }
0150 ;
0150 ;
0150 ;
0150 ; //---------------------------------//
0150 ; //
0150 ; // T/C0中断函数
0150 ; //
0150 ; //---------------------------------//
0150 ; void TC0_handler(void)
0150 ; {
0150 .dbline 75
0150 ; ADCSRA|=BIT(ADSC); // 进行一次AD转换
0150 369A sbi 0x6,6
0152 .dbline -2
0152 L29:
0152 0990 ld R0,y+
0154 0FBE out 0x3f,R0
0156 0990 ld R0,y+
0158 .dbline 0 ; func end
0158 1895 reti
015A .dbend
015A .dbfunc e TC0_Init _TC0_Init fV
.even
015A _TC0_Init::
015A .dbline -1
015A .dbline 86
015A ; }
015A ;
015A ;
015A ;
015A ; //---------------------------------//
015A ; //
015A ; // T/C0初始化函数
015A ; //
015A ; //---------------------------------//
015A ; void TC0_Init(void)
015A ; {
015A .dbline 89
015A ; // 16MHz模式下,16ms中断一次,作为AD采样间隔基准
015A ;
015A ; TCNT0=0; // 定时器0初值
015A 2224 clr R2
015C 22BE out 0x32,R2
015E .dbline 91
015E ;
015E ; TCCR0 = BIT(CS02)| BIT(CS00); // 预分频 ck/1024 ,启动计数器
015E 85E0 ldi R24,5
0160 83BF out 0x33,R24
0162 .dbline 93
0162 ;
0162 ; TIMSK = BIT(TOIE0); // T/C0 中断允许
0162 81E0 ldi R24,1
0164 87BF out 0x37,R24
0166 .dbline -2
0166 L30:
0166 .dbline 0 ; func end
0166 0895 ret
0168 .dbend
.area bss(ram, con, rel)
0000 .dbfile C:\AVR\M\1\AD_key.c
0000 _key_num::
0000 .blkb 1
0001 .dbsym e key_num _key_num c
0001 _tmp::
0001 .blkb 1
0002 .dbsym e tmp _tmp c
0002 _AD_time::
0002 .blkb 1
0003 .dbsym e AD_time _AD_time c
0003 _AD_Flag::
0003 .blkb 1
0004 .dbsym e AD_Flag _AD_Flag c
0004 _AD_data2::
0004 .blkb 1
0005 .dbsym e AD_data2 _AD_data2 c
0005 _AD_data1::
0005 .blkb 1
0006 .dbsym e AD_data1 _AD_data1 c
0006 _AD_data::
0006 .blkb 1
0007 .dbsym e AD_data _AD_data c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -