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

📄 kbscan.s

📁 用ICC写的ATMega8的4X4键盘驱动程序
💻 S
字号:
	.module kbscan.c
	.area lit(rom, con, rel)
_digital::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.byte 'w,124
	.byte 57,94
	.byte 'y,'q
	.dbfile H:\嵌入式开发\单片机\Proj\4x4KeyBoard\kbscan.c
	.dbsym e digital _digital A[16:16]kc
	.area text(rom, con, rel)
	.dbfile H:\嵌入式开发\单片机\Proj\4x4KeyBoard\kbscan.c
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 35
; /**************************************************************************
; Description:线翻转法键盘扫描程序,只检测和处理单键
; 
; 4*4键盘排列:
;    0   1   2   3
;  -----------------
; |  0   1   2   3  | 0
; |  4   5   6   7  | 1
; |  8   9   A   B  | 2
; |  C   D   E   F  | 3
;  -----------------
; 
; Write by:杨震禹
; Time:2007-1-5
; ***************************************************************************/
; #include <iom8v.h>
; #include <macros.h>
; 
; #define key_port PORTB         //定义键盘接口
; #define port_DDR DDRB
; #define port_PIN PINB
; typedef unsigned int UINT;
; typedef unsigned char UCHAR;
; 
; const UCHAR digital[16] = 
; {
;  0x3f, 0x6, 0x5b, 0x4f,  //0,1,2,3
;  0x66, 0x6d, 0x7d, 0x7,  //4,5,6,7
;  0x7f, 0x6f, 0x77, 0x7c,  //8,9,A,B
;  0x39, 0x5e, 0x79, 0x71   //C,D,E,F
; };
; 
; /*延时程序*/
; void delay_1ms(void)
; {//1ms延时函数
	.dbline 37
; 	UINT i;
; 	for(i=0; i<141; i++)
	clr R16
	clr R17
	rjmp L5
L2:
	.dbline 38
	.dbline 38
L3:
	.dbline 37
	subi R16,255  ; offset = 1
	sbci R17,255
L5:
	.dbline 37
	cpi R16,141
	ldi R30,0
	cpc R17,R30
	brlo L2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay _delay fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 42
; 	{}
; }
; 
; void delay(UINT n)
; {//延时n毫秒
	.dbline 44
; 	UINT i;
; 	for(i=0; i<n; i++)	//执行n次1毫秒延时
	clr R20
	clr R21
	rjmp L10
L7:
	.dbline 45
	rcall _delay_1ms
L8:
	.dbline 44
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 44
	cp R20,R22
	cpc R21,R23
	brlo L7
	.dbline -2
L6:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e scan_init _scan_init fV
	.even
_scan_init::
	.dbline -1
	.dbline 50
; 		delay_1ms();
; }
; 
; /*键盘扫描*/
; void scan_init(void)
; {//初始化键盘扫描端口
	.dbline 51
;  	key_port = 0xff;
	ldi R24,255
	out 0x18,R24
	.dbline 52
; 	port_DDR = 0x0f; //高四位输入,开上拉电阻
	ldi R24,15
	out 0x17,R24
	.dbline 53
; 	key_port = 0xf0; //低四位输出0
	ldi R24,240
	out 0x18,R24
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e scan_turn _scan_turn fV
	.even
_scan_turn::
	.dbline -1
	.dbline 57
; }
; 
; void scan_turn(void)
; {//端口输出翻转
	.dbline 58
; 	key_port |= 0x0f;
	in R24,0x18
	ori R24,15
	out 0x18,R24
	.dbline 59
; 	port_DDR = 0xf0;  //低四位输入,开上拉电阻
	ldi R24,240
	out 0x17,R24
	.dbline 60
; 	key_port &= 0x0f; //高四位输出0
	in R24,0x18
	andi R24,15
	out 0x18,R24
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e kbscan _kbscan fc
;            col -> R20
;            row -> R22
	.even
_kbscan::
	rcall push_gset4
	.dbline -1
	.dbline 64
; }
; 
; UCHAR kbscan(void)
; {
	.dbline 66
; 	UCHAR row, col; //行、列坐标
; 	row = 4;
	ldi R22,4
	.dbline 67
; 	col = 4;
	ldi R20,4
	.dbline 68
; 	scan_init();
	rcall _scan_init
	.dbline 69
; 	if((port_PIN&0xf0)!=0xf0) { //有键按下
	in R24,0x16
	andi R24,240
	cpi R24,240
	brne X3
	rjmp L14
X3:
	.dbline 69
	.dbline 70
; 		delay(5);   //防抖
	ldi R16,5
	ldi R17,0
	rcall _delay
	.dbline 71
; 		if((port_PIN&0xf0)!=0xf0) {
	in R24,0x16
	andi R24,240
	cpi R24,240
	brne X4
	rjmp L16
X4:
	.dbline 71
	.dbline 72
; 			row = (port_PIN&0xf0); //行值
	in R22,0x16
	andi R22,240
	.dbline 74
; 			
; 			scan_turn();   //翻转
	rcall _scan_turn
	.dbline 76
; 			
; 			if((port_PIN&0x0f)!=0x0f)
	in R24,0x16
	andi R24,15
	cpi R24,15
	breq L18
	.dbline 77
; 				col = (port_PIN&0x0f); //列值
	in R20,0x16
	andi R20,15
L18:
	.dbline 80
; 			
; 			/*行坐标*/
; 			switch(row)
	mov R10,R22
	clr R11
	movw R24,R10
	cpi R24,176
	ldi R30,0
	cpc R25,R30
	breq L25
	ldi R24,176
	cp R24,R10
	cpc R25,R11
	brlt L28
L27:
	movw R24,R10
	cpi R24,112
	ldi R30,0
	cpc R25,R30
	breq L26
	rjmp L20
L28:
	movw R24,R10
	cpi R24,208
	ldi R30,0
	cpc R25,R30
	breq L24
	cpi R24,208
	ldi R30,0
	cpc R25,R30
	brlt L20
L29:
	movw R24,R10
	cpi R24,224
	ldi R30,0
	cpc R25,R30
	breq L23
	rjmp L20
X0:
	.dbline 81
; 			{
L23:
	.dbline 82
; 			case 0xe0: row = 0;
	clr R22
	.dbline 83
; 				break;
	rjmp L21
L24:
	.dbline 84
; 			case 0xd0: row = 1;
	ldi R22,1
	.dbline 85
; 				break;
	rjmp L21
L25:
	.dbline 86
; 			case 0xb0: row = 2;
	ldi R22,2
	.dbline 87
; 				break;
	rjmp L21
L26:
	.dbline 88
; 			case 0x70: row = 3;
	ldi R22,3
	.dbline 89
; 				break;
	rjmp L21
L20:
	.dbline 90
; 			default: row=4; //未知数值
	ldi R22,4
	.dbline 91
; 			}
L21:
	.dbline 93
; 			/*列坐标*/
; 			switch(col)
	mov R10,R20
	clr R11
	movw R24,R10
	cpi R24,7
	ldi R30,0
	cpc R25,R30
	breq L36
	cpi R24,11
	ldi R30,0
	cpc R25,R30
	breq L35
	cpi R24,13
	ldi R30,0
	cpc R25,R30
	breq L34
	cpi R24,14
	ldi R30,0
	cpc R25,R30
	breq L33
	rjmp L30
X1:
	.dbline 94
; 			{
L33:
	.dbline 95
; 			case 0x0e: col = 0;
	clr R20
	.dbline 96
; 				break;
	rjmp L31
L34:
	.dbline 97
; 			case 0x0d: col = 1;
	ldi R20,1
	.dbline 98
; 				break;
	rjmp L31
L35:
	.dbline 99
; 			case 0x0b: col = 2;
	ldi R20,2
	.dbline 100
; 				break;
	rjmp L31
L36:
	.dbline 101
; 			case 0x07: col = 3;
	ldi R20,3
	.dbline 102
; 				break;
	rjmp L31
L30:
	.dbline 103
; 			default: col=4; //未知数值
	ldi R20,4
	.dbline 104
; 			}
L31:
	.dbline 105
; 		}
L16:
	.dbline 106
; 	}
L14:
	.dbline 107
; 	if((row!=4)&(col!=4))
	cpi R22,4
	breq L39
	ldi R24,1
	ldi R25,0
	movw R12,R24
	rjmp L40
L39:
	clr R12
	clr R13
L40:
	cpi R20,4
	breq L41
	ldi R24,1
	ldi R25,0
	movw R10,R24
	rjmp L42
L41:
	clr R10
	clr R11
L42:
	movw R2,R12
	and R2,R10
	and R3,R11
	tst R2
	brne X2
	tst R3
	breq L37
X2:
	.dbline 108
; 		return row*4+col;
	ldi R24,4
	mul R24,R22
	mov R16,R0
	add R16,R20
	rjmp L13
L37:
	.dbline 109
; 	else return 16; //错误返回
	ldi R16,16
	.dbline -2
L13:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r col 20 c
	.dbsym r row 22 c
	.dbend
	.dbfunc e main _main fV
;            key -> R20
	.even
_main::
	.dbline -1
	.dbline 114
; }
; 
; /*MAIN*/
; void main(void)
; {
	.dbline 116
;  	UCHAR key;
; 	DDRD = 0xff;
	ldi R24,255
	out 0x11,R24
	rjmp L45
L44:
	.dbline 117
;  	while(1){
	.dbline 118
; 		key = kbscan();
	rcall _kbscan
	mov R20,R16
	.dbline 119
; 		if(key!=16)
	cpi R16,16
	breq L47
	.dbline 120
; 			PORTD = ~digital[key];	//数码管输出相应数字
	ldi R24,<_digital
	ldi R25,>_digital
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	com R30
	out 0x12,R30
L47:
	.dbline 121
L45:
	.dbline 117
	rjmp L44
X5:
	.dbline -2
L43:
	.dbline 0 ; func end
	ret
	.dbsym r key 20 c
	.dbend

⌨️ 快捷键说明

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