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

📄 ad_key.s

📁 AVR单片机系统开发经典实例部分源程序
💻 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 + -