📄 3x3key.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 + -