📄 key.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 + -