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

📄 3x3key.s

📁 protues_atmeg8学习之:按键篇源代码
💻 S
字号:
	.module _3X3Key.C
	.area text(rom, con, rel)
	.dbfile F:\Learn\AVR\Pro_Mega8\KEY\3X3Key/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
; /******************************************/
; //文件名:3X3Key.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 "Delay.h"
	.dbline 12
; 
; //按键扫描函数,返回按键的值
	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 ScanKey(void)
; {
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 temp,temp1,key;
;     temp=PINC;
;     temp&=0x07;
;     switch(temp) //判断行中哪条线有低电平
	.dbline 19
;     {
	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
; 	case 0x06:  
	cp R20,R22
	cpc R21,R23
	brlo L12
	.dbline -2
	.dbline 25
;         DDRC=0X07;
;         PORTC=0X38;
; 	    delay_us(1);
;         temp1=PINC;
; 		temp1&=0x38;
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\KEY\3X3Key\3X3Key.C
	.dbfunc e ScanKey _ScanKey fc
;          temp1 -> R22
;            key -> R20
;           temp -> R20
	.even
_ScanKey::
	rcall push_gset3
	.dbline -1
	.dbline 14
	.dbline 16
	in R20,0x13
	.dbline 17
	andi R20,7
	.dbline 18
	clr R21
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	brne X5
	rjmp L37
X5:
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L28
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	breq L19
	rjmp L16
X1:
	.dbline 19
L19:
	.dbline 21
	ldi R24,7
	out 0x14,R24
	.dbline 22
	ldi R24,56
	out 0x15,R24
	.dbline 23
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 24
	in R22,0x13
	.dbline 25
	andi R22,56
	.dbline 26
;         switch(temp1) //判断列中哪条线有低电平
	mov R20,R22
	clr R21
	cpi R20,40
	ldi R30,0
	cpc R21,R30
	breq L24
	ldi R24,40
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L27
L26:
	cpi R20,24
	ldi R30,0
	cpc R21,R30
	breq L25
	rjmp L20
L27:
	cpi R20,48
	ldi R30,0
	cpc R21,R30
	breq L23
	rjmp L20
X2:
	.dbline 27
; 		{
L23:
	.dbline 28
; 		    case 0x30: key=0x01;  //得到键值
	ldi R20,1
	.dbline 29
; 		        break;
	rjmp L21
L24:
	.dbline 30
; 		    case 0x28: key=0x02; 
	ldi R20,2
	.dbline 31
; 		        break;
	rjmp L21
L25:
	.dbline 32
; 			case 0x18: key=0x03; 
	ldi R20,3
	.dbline 33
; 		        break;							
	rjmp L21
L20:
	.dbline 34
; 			default:   key=0;
	clr R20
	.dbline 35
; 		        break;
L21:
	.dbline 37
; 		}
; 		DDRC=0X38;
	ldi R24,56
	out 0x14,R24
	.dbline 38
; 		PORTC=0X07;
	ldi R24,7
	out 0x15,R24
	.dbline 39
;         break;
	rjmp L17
L28:
	.dbline 42
; 			   
;     case 0x05:
; 	    DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 43
;         PORTC=0X38;
	ldi R24,56
	out 0x15,R24
	.dbline 44
; 	    delay_us(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 45
;         temp1=PINC;
	in R22,0x13
	.dbline 46
; 		temp1&=0x38;
	andi R22,56
	.dbline 47
; 		switch(temp1)
	mov R10,R22
	clr R11
	movw R24,R10
	cpi R24,40
	ldi R30,0
	cpc R25,R30
	breq L33
	ldi R24,40
	cp R24,R10
	cpc R25,R11
	brlt L36
L35:
	movw R24,R10
	cpi R24,24
	ldi R30,0
	cpc R25,R30
	breq L34
	rjmp L29
L36:
	movw R24,R10
	cpi R24,48
	ldi R30,0
	cpc R25,R30
	breq L32
	rjmp L29
X3:
	.dbline 48
; 		{
L32:
	.dbline 49
; 	    case 0x30: key=0x04; 
	ldi R20,4
	.dbline 50
; 		    break;
	rjmp L30
L33:
	.dbline 51
; 		case 0x28: key=0x05; 
	ldi R20,5
	.dbline 52
; 		    break;
	rjmp L30
L34:
	.dbline 53
; 		case 0x18: key=0x06; 
	ldi R20,6
	.dbline 54
; 		    break;
	rjmp L30
L29:
	.dbline 55
; 		default:   key=0;
	clr R20
	.dbline 56
; 		    break;
L30:
	.dbline 58
; 		}
; 		DDRC=0X38;
	ldi R24,56
	out 0x14,R24
	.dbline 59
; 		PORTC=0X07;
	ldi R24,7
	out 0x15,R24
	.dbline 60
;         break;
	rjmp L17
L37:
	.dbline 62
;     case 0x03:  
; 	    DDRC=0X07;
	ldi R24,7
	out 0x14,R24
	.dbline 63
;         PORTC=0X38;
	ldi R24,56
	out 0x15,R24
	.dbline 64
; 		delay_us(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_us
	.dbline 65
;         temp1=PINC;
	in R22,0x13
	.dbline 66
; 		temp1&=0x38;
	andi R22,56
	.dbline 67
;         switch(temp1)
	clr R23
	cpi R22,40
	ldi R30,0
	cpc R23,R30
	breq L42
	ldi R24,40
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brlt L45
L44:
	cpi R22,24
	ldi R30,0
	cpc R23,R30
	breq L43
	rjmp L38
L45:
	cpi R22,48
	ldi R30,0
	cpc R23,R30
	breq L41
	rjmp L38
X4:
	.dbline 68
; 		{
L41:
	.dbline 69
; 		case 0x30: key=0x07; 
	ldi R20,7
	.dbline 70
;             break;
	rjmp L39
L42:
	.dbline 71
; 	    case 0x28: key=0x08; 
	ldi R20,8
	.dbline 72
; 		    break;
	rjmp L39
L43:
	.dbline 73
; 		case 0x18: key=0x09; 
	ldi R20,9
	.dbline 74
; 		    break;
	rjmp L39
L38:
	.dbline 75
; 		default:   key=0;
	clr R20
	.dbline 76
; 		    break;
L39:
	.dbline 78
; 	    }
; 		DDRC=0X38;
	ldi R24,56
	out 0x14,R24
	.dbline 79
; 		PORTC=0X07;
	ldi R24,7
	out 0x15,R24
	.dbline 80
;         break;
	rjmp L17
L16:
	.dbline 82
;     default:
;         key=0;
	clr R20
	.dbline 83
;         break;   
L17:
	.dbline 85
;     }
;     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 lit(rom, con, rel)
L47:
	.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\KEY\3X3Key\3X3Key.C
	.dbfunc e main _main fV
;            num -> y+0
;         keynum -> R20
;           temp -> R22
	.even
_main::
	sbiw R28,10
	.dbline -1
	.dbline 90
; }
; 
; //主函数,扫描按键显示数据
; void main()
; {
	.dbline 92
;     unsigned char temp, keynum;
; 	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
	ldi R24,<L47
	ldi R25,>L47
	movw R30,R28
	ldi R16,10
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 95
; 	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
; 	//初始化端口
; 	DDRB=0xFF;	  //设置B口为输出模式
	ldi R24,255
	out 0x17,R24
	.dbline 96
; 	PORTB=0xFF;	  //置高电平	
	out 0x18,R24
	.dbline 97
;     DDRC=0X38;
	ldi R24,56
	out 0x14,R24
	.dbline 98
;     PORTC=0X07; 
	ldi R24,7
	out 0x15,R24
	rjmp L49
L48:
	.dbline 101
;  
;     while(1)
;     { 
	.dbline 102
; 	   PORTB=0x40;
	ldi R24,64
	out 0x18,R24
	.dbline 103
;        temp=PINC;
	in R22,0x13
	.dbline 104
;        temp&=0x7;
	andi R22,7
	.dbline 105
;        if(temp==0x7)//检测是否有按键按下       
	cpi R22,7
	brne L51
	.dbline 106
; 	       continue;
	rjmp L49
L51:
	.dbline 107
; 	   delay_ms(10);
	ldi R16,10
	ldi R17,0
	rcall _delay_ms
	.dbline 108
; 	   temp=PINC;
	in R22,0x13
	.dbline 109
;        temp&=0x7;
	andi R22,7
	.dbline 110
;        if(temp==0x7)//检测是否有按键按下       
	cpi R22,7
	brne L53
	.dbline 111
; 	       continue;
	rjmp L49
L53:
	.dbline 112
;        keynum=ScanKey();
	rcall _ScanKey
	mov R20,R16
	.dbline 113
;        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 L56
L55:
	.dbline 115
	.dbline 116
	in R22,0x13
	.dbline 117
	andi R22,7
	.dbline 118
L56:
	.dbline 114
	cpi R22,7
	brne L55
	.dbline 119
L49:
	.dbline 100
	rjmp L48
X6:
	.dbline -2
	.dbline 120
; 	   while(temp!=0x7) 
; 	   {
; 	       temp=PINC;
;            temp&=0x7;
; 	   }
;     }
; }
L46:
	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

⌨️ 快捷键说明

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