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

📄 keyboard.s

📁 一个关于AVR单片机的例程
💻 S
字号:
	.module keyboard.c
	.area text(rom, con, rel)
	.dbfile D:\桌面\教程\keyboard\keyboard.c
	.dbfunc e key_scan _key_scan fc
;            key -> R20
;           temp -> R22
	.even
_key_scan::
	xcall push_gset2
	.dbline -1
	.dbline 16
; /**************************************
; ** Filename: keyboard.c
; ** Describe: 矩阵键盘程序
; ** Author : 古欣 www.avrvi.com
; ** Time  :   2007-2-15
; **************************************/
; 
; #include "config.h"
; 
; /**************************************
; ** 说明:线翻转法进行键盘扫描
; ** 输出:获得高低位的扫描值
; ** 有键时需要耗时 14ms
; **************************************/
; unsigned char key_scan(void)
; {
	.dbline 17
;  unsigned char temp=0,key=0;
	clr R22
	.dbline 17
	clr R20
	.dbline 18
;  KEY_DDR  = 0xF0;  //高四位输出0,键按下,则对应的值为0
	ldi R24,240
	out 0x1a,R24
	.dbline 19
;  KEY_PORT = 0x0F;  //低四位输入,内部电阻上拉,没有键按下时为高
	ldi R24,15
	out 0x1b,R24
	.dbline 20
;  temp = KEY_PIN&0x0F;//与掉高四位
	in R22,0x19
	andi R22,15
	.dbline 21
;  if(temp==0x0F)
	cpi R22,15
	brne L2
	.dbline 22
;  {
	.dbline 23
;   return 0; // 无按键返回
	clr R16
	xjmp L1
L2:
	.dbline 26
;  }
;  else
;  {
	.dbline 27
;   delay_ms(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 28
;   temp = KEY_PIN&0x0F; //延时去抖后再检测
	in R22,0x19
	andi R22,15
	.dbline 29
;   if(temp==0x0F)
	cpi R22,15
	brne L4
	.dbline 30
;     return 0;
	clr R16
	xjmp L1
L4:
	.dbline 32
;   else
;     key=temp; 
	mov R20,R22
	.dbline 33
;  }
	.dbline 35
;  //翻转
;  KEY_DDR  = 0x0F;  //低四位输出0,键按下,则对应的值为0
	ldi R24,15
	out 0x1a,R24
	.dbline 36
;  KEY_PORT = 0xF0;  //高四位输入,内部电阻上拉,没有键按下时为高
	ldi R24,240
	out 0x1b,R24
	.dbline 37
;  delay_ms(3);     //延时等待稳定
	ldi R16,3
	ldi R17,0
	xcall _delay_ms
	.dbline 39
;  
;  temp = KEY_PIN&0xF0;//与掉低四位
	in R22,0x19
	andi R22,240
	.dbline 40
;  if(temp==0xF0)
	cpi R22,240
	brne L6
	.dbline 41
;  {
	.dbline 42
;   return 0; // 无按键返回
	clr R16
	xjmp L1
L6:
	.dbline 45
;  }
;  else   //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
;  {
	.dbline 46
;     key |= temp; //高低位的键值进入KEY
	or R20,R22
	.dbline 47
;  }
	.dbline 48
;  KEY_DDR = 0x00;/*输出复位*/
	clr R2
	out 0x1a,R2
	.dbline 49
;  KEY_PORT = 0xFF;
	ldi R24,255
	out 0x1b,R24
	.dbline 51
; 
;  return key;
	mov R16,R20
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r key 20 c
	.dbsym r temp 22 c
	.dbend
	.dbfunc e get_key _get_key fc
;              i -> R20
	.even
_get_key::
	xcall push_gset1
	.dbline -1
	.dbline 61
; }
; 
; 
; /**************************************
; ** 说明:获得键盘的值  
; ** 内部调用函数key_scan
; ** 输出:实际键值
; **************************************/
; unsigned char get_key(void)
; {
	.dbline 62
;  unsigned char i=0;
	clr R20
	.dbline 63
;  i=key_scan();
	xcall _key_scan
	mov R20,R16
	.dbline 64
;  switch (i) {/*将按键码转换成键值*/
	clr R21
	cpi R20,183
	ldi R30,0
	cpc R21,R30
	brne X2
	xjmp L24
X2:
	cpi R20,187
	ldi R30,0
	cpc R21,R30
	brne X3
	xjmp L23
X3:
	cpi R20,189
	ldi R30,0
	cpc R21,R30
	brne X4
	xjmp L22
X4:
	cpi R20,190
	ldi R30,0
	cpc R21,R30
	brne X5
	xjmp L21
X5:
	ldi R24,190
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L30
L29:
	cpi R20,0
	cpc R20,R21
	brne X6
	xjmp L12
X6:
X0:
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge X7
	xjmp L9
X7:
L31:
	cpi R20,119
	ldi R30,0
	cpc R21,R30
	brne X8
	xjmp L28
X8:
	cpi R20,123
	ldi R30,0
	cpc R21,R30
	brne X9
	xjmp L27
X9:
	cpi R20,125
	ldi R30,0
	cpc R21,R30
	brne X10
	xjmp L26
X10:
	cpi R20,126
	ldi R30,0
	cpc R21,R30
	brne X11
	xjmp L25
X11:
	xjmp L9
L30:
	cpi R20,215
	ldi R30,0
	cpc R21,R30
	breq L20
	cpi R20,219
	ldi R30,0
	cpc R21,R30
	breq L19
	cpi R20,221
	ldi R30,0
	cpc R21,R30
	breq L18
	cpi R20,222
	ldi R30,0
	cpc R21,R30
	breq L17
	cpi R20,215
	ldi R30,0
	cpc R21,R30
	brge X12
	xjmp L9
X12:
L32:
	cpi R20,231
	ldi R30,0
	cpc R21,R30
	breq L16
	cpi R20,235
	ldi R30,0
	cpc R21,R30
	breq L15
	cpi R20,237
	ldi R30,0
	cpc R21,R30
	breq L14
	cpi R20,238
	ldi R30,0
	cpc R21,R30
	breq L13
	xjmp L9
X1:
	.dbline 64
L12:
	.dbline 65
;   case  0x00: return 0x00;
	clr R16
	xjmp L8
L13:
	.dbline 66
;   case  0xEE: return '1';
	ldi R16,49
	xjmp L8
L14:
	.dbline 67
;   case  0xED: return '2';
	ldi R16,50
	xjmp L8
L15:
	.dbline 68
;   case  0xEB: return '3';
	ldi R16,51
	xjmp L8
L16:
	.dbline 69
;   case  0xE7: return 'A';
	ldi R16,65
	xjmp L8
L17:
	.dbline 70
;   case  0xDE: return '4';
	ldi R16,52
	xjmp L8
L18:
	.dbline 71
;   case  0xDD: return '5';
	ldi R16,53
	xjmp L8
L19:
	.dbline 72
;   case  0xDB: return '6';
	ldi R16,54
	xjmp L8
L20:
	.dbline 73
;   case  0xD7: return 'B';
	ldi R16,66
	xjmp L8
L21:
	.dbline 74
;   case  0xBE: return '7';
	ldi R16,55
	xjmp L8
L22:
	.dbline 75
;   case  0xBD: return '8';
	ldi R16,56
	xjmp L8
L23:
	.dbline 76
;   case  0xBB: return '9';
	ldi R16,57
	xjmp L8
L24:
	.dbline 77
;   case  0xB7: return 'C';
	ldi R16,67
	xjmp L8
L25:
	.dbline 78
;   case  0x7E: return '*';
	ldi R16,42
	xjmp L8
L26:
	.dbline 79
;   case  0x7D: return '0';
	ldi R16,48
	xjmp L8
L27:
	.dbline 80
;   case  0x7B: return '#';
	ldi R16,35
	xjmp L8
L28:
	.dbline 81
;   case  0x77: return 'D';
	ldi R16,68
	xjmp L8
L9:
	.dbline 82
;   default : return 0x00;
	clr R16
	.dbline -2
L8:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend

⌨️ 快捷键说明

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