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

📄 intkey.s

📁 protues_atmeg8学习之:中断篇源代码
💻 S
字号:
	.module IntKey.C
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey/Delay.h
	.dbfunc e delay_us _delay_us fV
;              i -> R20,R21
;              n -> R16,R17
	.even
_delay_us::
	rcall push_gset1
	.dbline -1
	.dbline 3
; /******************************************/
; //文件名:IntKey.c
; //功能: 中断触发键盘扫描的应用
	.dbline 5
	movw R20,R16
	rjmp L5
L2:
	.dbline 5
L3:
	.dbline 5
	subi R20,1
	sbci R21,0
L5:
	.dbline 5
; //作者:  young
; //时间: 2006.11.6
	cpi R20,0
	cpc R20,R21
	brne L2
X0:
	.dbline -2
	.dbline 6
; //目标MCU:ATmega8   
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 10
; //晶振:  8MHZ
; /******************************************/
; #include <iom8v.h>
; #include <macros.h>
	.dbline 12
; #include "Delay.h"
; 
	ldi R16,1
	ldi R17,0
	rjmp L10
L7:
	.dbline 13
L8:
	.dbline 12
	subi R16,255  ; offset = 1
	sbci R17,255
L10:
	.dbline 12
	cpi R16,118
	ldi R30,4
	cpc R17,R30
	brlo L7
	.dbline -2
	.dbline 14
; unsigned char KeyDown;
; 
L6:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_ms::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 18
; //按键扫描函数,返回按键的值
; unsigned char ScanKey(void)
; {
;     unsigned char temp,temp1,key;
	.dbline 19
;     temp=PINC;
	clr R20
	clr R21
	rjmp L13
L12:
	.dbline 21
	.dbline 22
	rcall _delay_1ms
	.dbline 23
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 24
L13:
	.dbline 20
;     temp&=0x38;
	cp R20,R22
	cpc R21,R23
	brlo L12
	.dbline -2
	.dbline 25
;     switch(temp) //判断行中哪条线有低电平
;     {
; 	case 0x30:  
;         DDRC=0X38;
;         PORTC=0X07;
L11:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
	.dbfunc e ScanKey _ScanKey fc
;          temp1 -> R22
;            key -> R20
;           temp -> R20
	.even
_ScanKey::
	rcall push_gset3
	.dbline -1
	.dbline 17
	.dbline 19
	in R20,0x13
	.dbline 20
	andi R20,56
	.dbline 21
	clr R21
	cpi R20,40
	ldi R30,0
	cpc R21,R30
	breq L26
	ldi R24,40
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L41
L40:
	cpi R20,24
	ldi R30,0
	cpc R21,R30
	brne X5
	rjmp L33
X5:
	rjmp L16
L41:
	cpi R20,48
	ldi R30,0
	cpc R21,R30
	breq L19
	rjmp L16
X1:
	.dbline 22
L19:
	.dbline 24
	ldi R24,56
	out 0x14,R24
	.dbline 25
	ldi R24,7
	out 0x15,R24
	.dbline 26
; 	    delay_us(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 27
;         temp1=PINC;
	in R22,0x13
	.dbline 28
; 		temp1&=0x07;
	andi R22,7
	.dbline 29
;         switch(temp1) //判断列中哪条线有低电平
	mov R20,R22
	clr R21
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L25
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L24
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	breq L23
	rjmp L20
X2:
	.dbline 30
; 		{
L23:
	.dbline 31
; 		    case 0x06: key=0x01;  //得到键值
	ldi R20,1
	.dbline 32
; 		        break;
	rjmp L21
L24:
	.dbline 33
; 		    case 0x05: key=0x04; 
	ldi R20,4
	.dbline 34
; 		        break;
	rjmp L21
L25:
	.dbline 35
; 			case 0x03: key=0x07; 
	ldi R20,7
	.dbline 36
; 		        break;							
	rjmp L21
L20:
	.dbline 37
; 			default:   key=0;
	clr R20
	.dbline 38
; 		        break;
L21:
	.dbline 40
; 		}
; 		DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 41
; 		PORTC=0X38;
	ldi R24,56
	out 0x15,R24
	.dbline 42
;         break;
	rjmp L17
L26:
	.dbline 45
; 			   
;     case 0x28:
; 	    DDRC=0X38;
	ldi R24,56
	out 0x14,R24
	.dbline 46
;         PORTC=0X07;
	ldi R24,7
	out 0x15,R24
	.dbline 47
; 	    delay_us(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 48
;         temp1=PINC;
	in R22,0x13
	.dbline 49
; 		temp1&=0x07;
	andi R22,7
	.dbline 50
; 		switch(temp1)
	mov R10,R22
	clr R11
	movw R24,R10
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	breq L32
	cpi R24,5
	ldi R30,0
	cpc R25,R30
	breq L31
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	breq L30
	rjmp L27
X3:
	.dbline 51
; 		{
L30:
	.dbline 52
; 	    case 0x06: key=0x02; 
	ldi R20,2
	.dbline 53
; 		    break;
	rjmp L28
L31:
	.dbline 54
; 		case 0x05: key=0x05; 
	ldi R20,5
	.dbline 55
; 		    break;
	rjmp L28
L32:
	.dbline 56
; 		case 0x03: key=0x08; 
	ldi R20,8
	.dbline 57
; 		    break;
	rjmp L28
L27:
	.dbline 58
; 		default:   key=0;
	clr R20
	.dbline 59
; 		    break;
L28:
	.dbline 61
; 		}
; 		DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 62
; 		PORTC=0X38;
	ldi R24,56
	out 0x15,R24
	.dbline 63
;         break;
	rjmp L17
L33:
	.dbline 66
; 		
;     case 0x18:  
; 	    DDRC=0X38;
	ldi R24,56
	out 0x14,R24
	.dbline 67
;         PORTC=0X07;
	ldi R24,7
	out 0x15,R24
	.dbline 68
; 	    delay_us(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 69
;         temp1=PINC;
	in R22,0x13
	.dbline 70
; 		temp1&=0x07;
	andi R22,7
	.dbline 71
;         switch(temp1)
	clr R23
	cpi R22,3
	ldi R30,0
	cpc R23,R30
	breq L39
	cpi R22,5
	ldi R30,0
	cpc R23,R30
	breq L38
	cpi R22,6
	ldi R30,0
	cpc R23,R30
	breq L37
	rjmp L34
X4:
	.dbline 72
; 		{
L37:
	.dbline 73
; 		case 0x06: key=0x03; 
	ldi R20,3
	.dbline 74
;             break;
	rjmp L35
L38:
	.dbline 75
; 	    case 0x05: key=0x06; 
	ldi R20,6
	.dbline 76
; 		    break;
	rjmp L35
L39:
	.dbline 77
; 		case 0x03: key=0x09; 
	ldi R20,9
	.dbline 78
; 		    break;
	rjmp L35
L34:
	.dbline 79
; 		default:   key=0;
	clr R20
	.dbline 80
; 		    break;
L35:
	.dbline 82
; 	    }
; 		DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 83
; 		PORTC=0X38;
	ldi R24,56
	out 0x15,R24
	.dbline 84
;         break;
	rjmp L17
L16:
	.dbline 86
;     default:
;         key=0;
	clr R20
	.dbline 87
;         break;   
L17:
	.dbline 89
;     }
;     return (key);
	mov R16,R20
	.dbline -2
L15:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp1 22 c
	.dbsym r key 20 c
	.dbsym r temp 20 c
	.dbend
	.area vector(rom, abs)
	.org 2
	rjmp _int_fun
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
	.dbfunc e int_fun _int_fun fV
	.even
_int_fun::
	st -y,R24
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 94
; }
; 
; #pragma interrupt_handler int_fun:2
; void int_fun(void)
; {
	.dbline 95
;     KeyDown=1;		//在中断中仅设置一个标志
	ldi R24,1
	sts _KeyDown,R24
	.dbline -2
	.dbline 96
; }
L42:
	ld R24,y+
	out 0x3f,R24
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area lit(rom, con, rel)
L44:
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
	.dbfunc e main _main fV
;            num -> y+0
;         keynum -> R20
;           temp -> R22
	.even
_main::
	sbiw R28,10
	.dbline -1
	.dbline 100
; 
; //主函数,扫描按键显示数据
; void main()
; {
	.dbline 102
;     unsigned char temp, keynum;
; 	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
	ldi R24,<L44
	ldi R25,>L44
	movw R30,R28
	ldi R16,10
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 105
; 	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
; 	//初始化端口
; 	DDRB=0xFF;	  //设置B口为输出模式
	ldi R24,255
	out 0x17,R24
	.dbline 106
; 	PORTB=0xFF;	  //置高电平	
	out 0x18,R24
	.dbline 107
;     DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 108
;     PORTC=0X38; 
	ldi R24,56
	out 0x15,R24
	.dbline 109
;     DDRD&=0x0F;
	in R24,0x11
	andi R24,15
	out 0x11,R24
	.dbline 110
; 	PORTD|=0xFC;
	in R24,0x12
	ori R24,252
	out 0x12,R24
	.dbline 112
; 	
;     MCUCR=0x03;   //INT0上升沿触发,INT1低电平有效
	ldi R24,3
	out 0x35,R24
	.dbline 113
; 	GICR|=0x40;   //打开INT0中断
	in R24,0x3b
	ori R24,64
	out 0x3b,R24
	.dbline 114
;     GIFR=0xC0;    //清除INT0、INT1中断标志位
	ldi R24,192
	out 0x3a,R24
	.dbline 116
; 	
; 	KeyDown=0;    //初始化全局变量
	clr R2
	sts _KeyDown,R2
	.dbline 117
; 	SEI();        //打开全局中断	
	sei
	rjmp L46
L45:
	.dbline 119
;     while(1)
;     { 
	.dbline 120
; 	   PORTB=0x40;
	ldi R24,64
	out 0x18,R24
	.dbline 121
;        if(KeyDown==1)        //检测是否有按键按下 
	lds R24,_KeyDown
	cpi R24,1
	brne L48
	.dbline 122
; 	   {
	.dbline 123
; 	       GIFR&=0xCF;       //关闭INT0中断
	in R24,0x3a
	andi R24,207
	out 0x3a,R24
	.dbline 124
; 	       KeyDown=0;
	clr R2
	sts _KeyDown,R2
	.dbline 125
; 	       delay_ms(5);		 
	ldi R16,5
	ldi R17,0
	rcall _delay_ms
	.dbline 126
; 	       temp=PINC;
	in R22,0x13
	.dbline 127
;            temp&=0x38;
	andi R22,56
	.dbline 128
;            if(temp==0x38)     //确认是否有按键按下
	cpi R22,56
	brne L50
	.dbline 129
; 		   {
	.dbline 130
; 		       GICR|=0x40;   //打开INT0中断
	in R24,0x3b
	ori R24,64
	out 0x3b,R24
	.dbline 131
; 	           continue;
	rjmp L46
L50:
	.dbline 133
; 		   }
;            keynum=ScanKey();
	rcall _ScanKey
	mov R20,R16
	.dbline 134
;            PORTB=num[keynum];
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0x18,R2
	rjmp L53
L52:
	.dbline 136
	.dbline 137
	in R22,0x13
	.dbline 138
	andi R22,56
	.dbline 139
L53:
	.dbline 135
; 	       while(temp!=0x38) 
	cpi R22,56
	brne L52
	.dbline 140
; 	       {
; 	          temp=PINC;
;               temp&=0x38;
; 	       }		   	
; 		   GICR|=0x40;       //打开INT0中断
	in R24,0x3b
	ori R24,64
	out 0x3b,R24
	.dbline 141
; 		   DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 142
;            PORTC=0X38; 
	ldi R24,56
	out 0x15,R24
	.dbline 143
; 	   }
L48:
	.dbline 144
L46:
	.dbline 118
	rjmp L45
X6:
	.dbline -2
	.dbline 145
;     }
; }
L43:
	adiw R28,10
	.dbline 0 ; func end
	ret
	.dbsym l num 0 A[10:10]c
	.dbsym r keynum 20 c
	.dbsym r temp 22 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
_KeyDown::
	.blkb 1
	.dbsym e KeyDown _KeyDown c

⌨️ 快捷键说明

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