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

📄 key.s

📁 键盘扫描及其LCD显示输出,有源程序与仿真文件,都测试通过.
💻 S
字号:
	.module key.c
	.area text(rom, con, rel)
	.dbfile F:\AVR练习\key_lcd\key.c
	.area lit(rom, con, rel)
_table::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.byte 'w,124
	.byte 57,94
	.byte 'O,'G
	.dbsym e table _table A[16:16]kc
_table1::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.dbsym e table1 _table1 A[10:10]kc
	.area text(rom, con, rel)
	.dbfile F:\AVR练习\key_lcd\key.c
	.dbfunc e key_read _key_read fc
;              i -> R16
	.even
_key_read::
	.dbline -1
	.dbline 21
; 
; #include <macros.h>
; #include "includes.h"
; //#pragma interrupt_handler icp_time1:6
; //#define BIT(x) (1<<(x))
; #define uchar unsigned char
; #define uint unsigned int
; const unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
;   0x77,0x7c,0x39,0x5e,79,71};//七段译码字形表
; const uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
; uchar ledbuff[6];//显示缓冲区
; uchar led[6];
; uint oldcount;
; uint newcount;
; /*
; 键盘扫描函数
;  读取当前键盘的状态
;  有按键按下返回相应按键值
;  无按键按下返回"0x00"
; */
; uchar key_read(){
	.dbline 23
;  uchar i;
;  DDRA = 0x00;/*获取列地址*/
	clr R2
	out 0x1a,R2
	.dbline 24
;  PORTA = 0x0F;
	ldi R24,15
	out 0x1b,R24
	.dbline 25
;  DDRA = 0xF0;
	ldi R24,240
	out 0x1a,R24
	.dbline 26
;  i = PINA;
	in R16,0x19
	.dbline 27
;  DDRA = 0x00;/*获取行地址*/
	out 0x1a,R2
	.dbline 28
;  PORTA = 0xF0;
	out 0x1b,R24
	.dbline 29
;  DDRA = 0x0F;
	ldi R24,15
	out 0x1a,R24
	.dbline 30
;  i&=PINA;
	in R2,0x19
	and R16,R2
	.dbline 32
;  
;  DDRA = 0x00;/*输出复位*/
	clr R2
	out 0x1a,R2
	.dbline 33
;  PORTA = 0xFF;
	ldi R24,255
	out 0x1b,R24
	.dbline 35
;  
;  switch (i) {/*将按键码转换成键值*/
	clr R17
	cpi R16,33
	ldi R30,0
	cpc R17,R30
	brne X1
	rjmp L13
X1:
	cpi R16,34
	ldi R30,0
	cpc R17,R30
	brne X2
	rjmp L14
X2:
	cpi R16,36
	ldi R30,0
	cpc R17,R30
	brne X3
	rjmp L15
X3:
	cpi R16,40
	ldi R30,0
	cpc R17,R30
	brne X4
	rjmp L16
X4:
	ldi R24,40
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L22
L21:
	cpi R16,17
	ldi R30,0
	cpc R17,R30
	brne X5
	rjmp L17
X5:
	cpi R16,18
	ldi R30,0
	cpc R17,R30
	brne X6
	rjmp L18
X6:
	cpi R16,20
	ldi R30,0
	cpc R17,R30
	brne X7
	rjmp L19
X7:
	cpi R16,24
	ldi R30,0
	cpc R17,R30
	brne X8
	rjmp L20
X8:
	rjmp L2
L22:
	cpi R16,65
	ldi R30,0
	cpc R17,R30
	breq L9
	cpi R16,66
	ldi R30,0
	cpc R17,R30
	breq L10
	cpi R16,68
	ldi R30,0
	cpc R17,R30
	breq L11
	cpi R16,72
	ldi R30,0
	cpc R17,R30
	breq L12
	cpi R16,65
	ldi R30,0
	cpc R17,R30
	brge X9
	rjmp L2
X9:
L23:
	cpi R16,129
	ldi R30,0
	cpc R17,R30
	breq L5
	cpi R16,130
	ldi R30,0
	cpc R17,R30
	breq L6
	cpi R16,132
	ldi R30,0
	cpc R17,R30
	breq L7
	cpi R16,136
	ldi R30,0
	cpc R17,R30
	breq L8
	rjmp L2
X0:
	.dbline 35
L5:
	.dbline 36
;   case  0x81: return 0x00;
	clr R16
	rjmp L1
L6:
	.dbline 37
;   case  0x82: return 'a';
	ldi R16,97
	rjmp L1
L7:
	.dbline 38
;   case  0x84: return 'b';
	ldi R16,98
	rjmp L1
L8:
	.dbline 39
;   case  0x88: return 'c';
	ldi R16,99
	rjmp L1
L9:
	.dbline 40
;   case  0x41: return '1';
	ldi R16,49
	rjmp L1
L10:
	.dbline 41
;   case  0x42: return 0x02;
	ldi R16,2
	rjmp L1
L11:
	.dbline 42
;   case  0x44: return 0x03;
	ldi R16,3
	rjmp L1
L12:
	.dbline 43
;   case  0x48: return 'd';
	ldi R16,100
	rjmp L1
L13:
	.dbline 44
;   case  0x21: return 0x04;
	ldi R16,4
	rjmp L1
L14:
	.dbline 45
;   case  0x22: return 0x05;
	ldi R16,5
	rjmp L1
L15:
	.dbline 46
;   case  0x24: return 0x06;
	ldi R16,6
	rjmp L1
L16:
	.dbline 47
;   case  0x28: return 'e';
	ldi R16,101
	rjmp L1
L17:
	.dbline 48
;   case  0x11: return 0x07;
	ldi R16,7
	rjmp L1
L18:
	.dbline 49
;   case  0x12: return 0x08;
	ldi R16,8
	rjmp L1
L19:
	.dbline 50
;   case  0x14: return 0x09;
	ldi R16,9
	rjmp L1
L20:
	.dbline 51
;   case  0x18: return 'f';
	ldi R16,102
	rjmp L1
L2:
	.dbline 52
;   default : return 0x00;
	clr R16
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R16,R17
	.even
_delay_ms::
	.dbline -1
	.dbline 60
; }
; }
; 
; /*****************************************
;                 延时1MS
; ******************************************/
; void delay_ms()
; {uint i;
	.dbline 61
;   for(i+0;i<1142;i++)
	rjmp L28
L25:
	.dbline 62
L26:
	.dbline 61
	subi R16,255  ; offset = 1
	sbci R17,255
L28:
	.dbline 61
	cpi R16,118
	ldi R30,4
	cpc R17,R30
	brlo L25
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay _delay fV
;              i -> R20
;              t -> R16,R17
	.even
_delay::
	rcall push_gset1
	.dbline -1
	.dbline 65
;   ;
;   }
; void delay(uint t)
; {uchar i;
	.dbline 66
;   for(i=0;i<t;i++)
	clr R20
	rjmp L33
L30:
	.dbline 67
L31:
	.dbline 66
	inc R20
L33:
	.dbline 66
	mov R2,R20
	clr R3
	cp R2,R16
	cpc R3,R17
	brlo L30
	.dbline -2
L29:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r t 16 i
	.dbend
	.dbfunc e init _init fV
	.even
_init::
	.dbline -1
	.dbline 74
;   ;
; }
; 
; /****************************************
;                 mcu初始化
; *****************************************/
; void init()
; { //DDRA=0x00;
	.dbline 75
;   DDRD=0xff;
	ldi R24,255
	out 0x11,R24
	.dbline 76
;   DDRB=0xff;
	out 0x17,R24
	.dbline 78
;  // PORTA=0xff;
;   PORTB=0xff;
	out 0x18,R24
	.dbline 79
;   PORTD=0xff;
	out 0x12,R24
	.dbline -2
L34:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              i -> <dead>
;          space -> R20,R21
;     x_position -> R20
;            key -> R10
	.even
_main::
	sbiw R28,2
	.dbline -1
	.dbline 83
;   
;   }
; void main()
;  { uchar key;
	.dbline 86
;    uchar i;
;    uchar x_position;
;     uchar *space = "                   ";
	ldi R20,<L36
	ldi R21,>L36
	.dbline 87
;     Init_LCD();   
	rcall _Init_LCD
	.dbline 90
;     //PORTD = 0xff; 
;     //DDRD =  0xf0;     
;     PORTA = 0xff;
	ldi R24,255
	out 0x1b,R24
	.dbline 91
;     DDRA  = 0xf8;
	ldi R24,248
	out 0x1a,R24
	.dbline 92
;     LCD_DisplayString(1,1,"key scan test");
	ldi R24,<L37
	ldi R25,>L37
	std y+1,R25
	std y+0,R24
	ldi R18,1
	ldi R16,1
	rcall _LCD_DisplayString
	.dbline 93
;     x_position = 2;
	ldi R20,2
	.dbline 94
;    init();
	rcall _init
	.dbline 95
;    for( ; ; )
L38:
	.dbline 96
;    { 
	.dbline 97
; 	 key=key_read();
	rcall _key_read
	mov R10,R16
	.dbline 99
; 	  //针对4X4的键盘         
;          switch(key)   
	mov R22,R10
	clr R23
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	brne X12
	rjmp L45
X12:
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	brne X13
	rjmp L46
X13:
	cpi R22,3
	ldi R30,0
	cpc R23,R30
	brne X14
	rjmp L47
X14:
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	brne X15
	rjmp L48
X15:
	cpi R22,5
	ldi R30,0
	cpc R23,R30
	brne X16
	rjmp L49
X16:
	cpi R22,6
	ldi R30,0
	cpc R23,R30
	brne X17
	rjmp L50
X17:
	cpi R22,7
	ldi R30,0
	cpc R23,R30
	brne X18
	rjmp L51
X18:
	cpi R22,8
	ldi R30,0
	cpc R23,R30
	brne X19
	rjmp L52
X19:
	cpi R22,9
	ldi R30,0
	cpc R23,R30
	brne X20
	rjmp L53
X20:
	cpi R22,10
	ldi R30,0
	cpc R23,R30
	brne X21
	rjmp L54
X21:
	cpi R22,11
	ldi R30,0
	cpc R23,R30
	brne X22
	rjmp L55
X22:
	cpi R22,12
	ldi R30,0
	cpc R23,R30
	brne X23
	rjmp L56
X23:
	rjmp L38
X10:
	.dbline 100
;          {  
L45:
	.dbline 102
;             case 1:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 103
;                 LCD_DisplayCharacter('1');          
	ldi R16,49
	rcall _LCD_DisplayCharacter
	.dbline 104
;                 break;
	rjmp L38
L46:
	.dbline 106
;             case 2:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 107
;                 LCD_DisplayCharacter('2');          
	ldi R16,50
	rcall _LCD_DisplayCharacter
	.dbline 108
;                 break;
	rjmp L38
L47:
	.dbline 110
;             case 3:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 111
;                 LCD_DisplayCharacter('3');          
	ldi R16,51
	rcall _LCD_DisplayCharacter
	.dbline 112
;                 break; 
	rjmp L38
L48:
	.dbline 114
;             case 4:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 115
;                 LCD_DisplayCharacter('4');          
	ldi R16,52
	rcall _LCD_DisplayCharacter
	.dbline 116
;                 break;
	rjmp L38
L49:
	.dbline 118
;             case 5:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 119
;                 LCD_DisplayCharacter('5');          
	ldi R16,53
	rcall _LCD_DisplayCharacter
	.dbline 120
;                 break;
	rjmp L38
L50:
	.dbline 122
;             case 6:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 123
;                 LCD_DisplayCharacter('6');          
	ldi R16,54
	rcall _LCD_DisplayCharacter
	.dbline 124
;                 break;
	rjmp L38
L51:
	.dbline 126
;             case 7:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 127
;                 LCD_DisplayCharacter('7');          
	ldi R16,55
	rcall _LCD_DisplayCharacter
	.dbline 128
;                 break;  
	rjmp L38
L52:
	.dbline 130
;             case 8:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 131
;                 LCD_DisplayCharacter('8');          
	ldi R16,56
	rcall _LCD_DisplayCharacter
	.dbline 132
;                 break;
	rjmp L38
L53:
	.dbline 134
;             case 9:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 135
;                 LCD_DisplayCharacter('9');          
	ldi R16,57
	rcall _LCD_DisplayCharacter
	.dbline 136
;                 break;            
	rjmp L38
L54:
	.dbline 138
;             case 10:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 139
;                 LCD_DisplayCharacter('*');          
	ldi R16,42
	rcall _LCD_DisplayCharacter
	.dbline 140
;                 break;
	rjmp L38
L55:
	.dbline 142
;             case 11:            
;                 LCD_Cursor(2,x_position);
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 143
;                 LCD_DisplayCharacter('0');          
	ldi R16,48
	rcall _LCD_DisplayCharacter
	.dbline 144
;                 break;
	rjmp L38
L56:
	.dbline 146
	mov R18,R20
	ldi R16,2
	rcall _LCD_Cursor
	.dbline 147
	ldi R16,35
	rcall _LCD_DisplayCharacter
	.dbline 148
	.dbline 149
	.dbline 152
	.dbline 95
	.dbline 95
	rjmp L38
X11:
	.dbline -2
L35:
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym l i 3 c
	.dbsym r space 20 pc
	.dbsym r x_position 20 c
	.dbsym r key 10 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\AVR练习\key_lcd\key.c
_newcount::
	.blkb 2
	.dbsym e newcount _newcount i
_oldcount::
	.blkb 2
	.dbsym e oldcount _oldcount i
_led::
	.blkb 6
	.dbsym e led _led A[6:6]c
_ledbuff::
	.blkb 6
	.dbsym e ledbuff _ledbuff A[6:6]c
	.area data(ram, con, rel)
	.dbfile F:\AVR练习\key_lcd\key.c
L37:
	.blkb 14
	.area idata
	.byte 'k,'e,'y,32,'s,'c,'a,'n,32,'t,'e,'s,'t,0
	.area data(ram, con, rel)
	.dbfile F:\AVR练习\key_lcd\key.c
L36:
	.blkb 20
	.area idata
	.byte 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
	.byte 32,32,32,0
	.area data(ram, con, rel)
	.dbfile F:\AVR练习\key_lcd\key.c

⌨️ 快捷键说明

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