📄 keyscan.lst
字号:
C8 6388 ORI R24,0x38
C9 BB85 OUT 0x15,R24
CA 98AC CBI 0x15,4
CB 0000 NOP
(0242) if (!READ_PINX)
CC 9B99 SBIS 0x13,1
CD C002 RJMP 0x00D0
CE E021 LDI R18,1
CF C001 RJMP 0x00D1
D0 2722 CLR R18
D1 2322 TST R18
D2 F411 BNE 0x00D5
(0243) {
(0244) chTempKeyCode = 0x01;
D3 E001 LDI R16,1
(0245) }
D4 C008 RJMP 0x00DD
(0246) else if (!READ_PINY)
D5 9B9A SBIS 0x13,2
D6 C002 RJMP 0x00D9
D7 E021 LDI R18,1
D8 C001 RJMP 0x00DA
D9 2722 CLR R18
DA 2322 TST R18
DB F409 BNE 0x00DD
(0247) {
(0248) chTempKeyCode = 0x04;
DC E004 LDI R16,4
(0249) }
(0250)
(0251) CLR_C;
DD B385 IN R24,0x15
DE 6388 ORI R24,0x38
DF BB85 OUT 0x15,R24
E0 98AD CBI 0x15,5
E1 0000 NOP
(0252) if (!READ_PINX)
E2 9B99 SBIS 0x13,1
E3 C002 RJMP 0x00E6
E4 E021 LDI R18,1
E5 C001 RJMP 0x00E7
E6 2722 CLR R18
E7 2322 TST R18
E8 F411 BNE 0x00EB
(0253) {
(0254) chTempKeyCode = 0x02;
E9 E002 LDI R16,2
(0255) }
EA C008 RJMP 0x00F3
(0256) else if (!READ_PINY)
EB 9B9A SBIS 0x13,2
EC C002 RJMP 0x00EF
ED E021 LDI R18,1
EE C001 RJMP 0x00F0
EF 2722 CLR R18
F0 2322 TST R18
F1 F409 BNE 0x00F3
(0257) {
(0258) chTempKeyCode = 0x05;
F2 E005 LDI R16,5
(0259) }
(0260)
(0261) return chTempKeyCode;
F3 9508 RET
(0262) }
(0263) ////////////////////////////////////////////////////////////////////////////
(0264) UINT8 Key_Scan_New(void)
(0265) {
(0266) UINT8 chTempKeyCode = KEY_NULL; //为按键的编码设初值
(0267)
(0268)
(0269) //先对21-25按钮进行扫描
(0270) DDRC &= ~(BIT(1) | BIT(2) | BIT(3) |
_Key_Scan_New:
F4 B384 IN R24,0x14
F5 7C81 ANDI R24,0xC1
F6 BB84 OUT 0x14,R24
(0271) BIT(4) | BIT(5)); //把端口pc1-pc5都置为输入
(0272)
(0273) PORTC |= BIT(1) | BIT(2) | BIT(3) |
F7 B385 IN R24,0x15
F8 638E ORI R24,0x3E
F9 BB85 OUT 0x15,R24
(0274) BIT(4) | BIT(5); //全部端口拉高
(0275) NOP();
FA 0000 NOP
(0276) NOP();
FB 0000 NOP
(0277)
(0278)
(0279) if (!(PINC & (BIT(1)))) //读取pc1端口,如果返回值是0则表明按键被按下,
FC 9999 SBIC 0x13,1
FD C002 RJMP 0x0100
(0280) //则返回按键的值
(0281) {
(0282) chTempKeyCode = 21;
(0283) return chTempKeyCode;
FE E105 LDI R16,0x15
FF C0B1 RJMP 0x01B1
(0284) }
(0285) else if (!(PINC & (BIT(2)))) //读取pc2端口,如果返回值是0则表明按键被按下,
100 999A SBIC 0x13,2
101 C002 RJMP 0x0104
(0286) //则返回按键的值,下面以此类推。
(0287) {
(0288) chTempKeyCode = 22;
(0289) return chTempKeyCode;
102 E106 LDI R16,0x16
103 C0AD RJMP 0x01B1
(0290) }
(0291) else if (!(PINC & (BIT(3))))
104 999B SBIC 0x13,3
105 C002 RJMP 0x0108
(0292) {
(0293) chTempKeyCode = 23;
(0294) return chTempKeyCode;
106 E107 LDI R16,0x17
107 C0A9 RJMP 0x01B1
(0295) }
(0296) else if (!(PINC & (BIT(4))))
108 999C SBIC 0x13,4
109 C002 RJMP 0x010C
(0297) {
(0298) chTempKeyCode = 24;
(0299) return chTempKeyCode;
10A E108 LDI R16,0x18
10B C0A5 RJMP 0x01B1
(0300) }
(0301) else if (!(PINC & (BIT(5))))
10C 999D SBIC 0x13,5
10D C002 RJMP 0x0110
(0302) {
(0303) chTempKeyCode = 25;
(0304) return chTempKeyCode;
10E E109 LDI R16,0x19
10F C0A1 RJMP 0x01B1
(0305) }
(0306)
(0307) //////////////////////////////////////////////////////////////
(0308) //对1-4按钮进行扫描
(0309) DDRC &= ~(BIT(2) | BIT(3) |
110 B384 IN R24,0x14
111 7C83 ANDI R24,0xC3
112 BB84 OUT 0x14,R24
(0310) BIT(4) | BIT(5)); //把端口pc2-pc5设置为输入
(0311) DDRC |= BIT(1); //把pc1端口设为输出
113 9AA1 SBI 0x14,1
(0312)
(0313) PORTC |= BIT(1) | BIT(2) | BIT(3) |
114 B385 IN R24,0x15
115 638E ORI R24,0x3E
116 BB85 OUT 0x15,R24
(0314) BIT(4) | BIT(5);
(0315)
(0316) PORTC &=~ BIT(1); //把pc1端口拉低
117 98A9 CBI 0x15,1
(0317) NOP();
118 0000 NOP
(0318) NOP();
119 0000 NOP
(0319)
(0320)
(0321) if (!(PINC & (BIT(2)))) //读取pc2端口,如果返回值是0则表明按键被按下,
11A 999A SBIC 0x13,2
11B C002 RJMP 0x011E
(0322) //则返回按键的值
(0323) //以下依次对pc3、pc4、pc5逐个读取值,如果返回值为0
(0324) //则返回相应按键值
(0325) {
(0326) chTempKeyCode = 1;
(0327) return chTempKeyCode;
11C E001 LDI R16,1
11D C093 RJMP 0x01B1
(0328) }
(0329) else if (!(PINC & (BIT(3))))
11E 999B SBIC 0x13,3
11F C002 RJMP 0x0122
(0330) {
(0331) chTempKeyCode = 2;
(0332) return chTempKeyCode;
120 E002 LDI R16,2
121 C08F RJMP 0x01B1
(0333) }
(0334) else if (!(PINC & (BIT(4))))
122 999C SBIC 0x13,4
123 C002 RJMP 0x0126
(0335) {
(0336) chTempKeyCode = 3;
(0337) return chTempKeyCode;
124 E003 LDI R16,3
125 C08B RJMP 0x01B1
(0338) }
(0339) else if (!(PINC & (BIT(5))))
126 999D SBIC 0x13,5
127 C002 RJMP 0x012A
(0340) {
(0341) chTempKeyCode = 4;
(0342) return chTempKeyCode;
128 E004 LDI R16,4
129 C087 RJMP 0x01B1
(0343) }
(0344)
(0345)
(0346) //////////////////////////////////////////////////////////////
(0347)
(0348) //对6-7按钮进行扫描
(0349) DDRC &= ~(BIT(1) | BIT(3) |
12A B384 IN R24,0x14
12B 7C85 ANDI R24,0xC5
12C BB84 OUT 0x14,R24
(0350) BIT(4) | BIT(5));//把端口pc1,pc3-pc5设置为输入
(0351)
(0352) DDRC |= BIT(2);//把pc2端口设为输出
12D 9AA2 SBI 0x14,2
(0353)
(0354) PORTC |= BIT(1) | BIT(2) | BIT(3) |
12E B385 IN R24,0x15
12F 638E ORI R24,0x3E
130 BB85 OUT 0x15,R24
(0355) BIT(4) | BIT(5);
(0356)
(0357) PORTC &= ~BIT(2); //把pc2端口拉低
131 98AA CBI 0x15,2
(0358) NOP();
132 0000 NOP
(0359) NOP();
133 0000 NOP
(0360)
(0361)
(0362) if (!(PINC & (BIT(3)))) //读取pc3端口,如果返回值是0则表明按键被按下,
134 999B SBIC 0x13,3
135 C002 RJMP 0x0138
(0363) //则返回按键的值
(0364) //以下依次对pc4、pc5逐个读取值,如果返回值为0
(0365) //则返回相应按键值
(0366) {
(0367) chTempKeyCode = 6;
(0368) return chTempKeyCode;
136 E006 LDI R16,6
137 C079 RJMP 0x01B1
(0369) }
(0370) else if (!(PINC & (BIT(4))))
138 999C SBIC 0x13,4
139 C002 RJMP 0x013C
(0371) {
(0372) chTempKeyCode = 7;
(0373) return chTempKeyCode;
13A E007 LDI R16,7
13B C075 RJMP 0x01B1
(0374) }
(0375) else if (!(PINC & (BIT(5))))
13C 999D SBIC 0x13,5
13D C002 RJMP 0x0140
(0376) {
(0377) chTempKeyCode = 8;
(0378) return chTempKeyCode;
13E E008 LDI R16,0x8
13F C071 RJMP 0x01B1
(0379) }
(0380)
(0381) //////////////////////////////////////////////////////////////
(0382)
(0383) //对11-12按钮进行扫描
(0384) DDRC &= ~(BIT(2) | BIT(1) |
140 B384 IN R24,0x14
141 7C89 ANDI R24,0xC9
142 BB84 OUT 0x14,R24
(0385) BIT(4) | BIT(5));//把端口pc1-pc2,pc4-pc5设置为输入
(0386)
(0387) DDRC |= BIT(3);//把pc3端口设为输出
143 9AA3 SBI 0x14,3
(0388)
(0389) PORTC |= BIT(1) | BIT(2) | BIT(3) |
144 B385 IN R24,0x15
145 638E ORI R24,0x3E
146 BB85 OUT 0x15,R24
(0390) BIT(4) | BIT(5);
(0391)
(0392) PORTC &= ~BIT(3);//把pc2端口拉低
147 98AB CBI 0x15,3
(0393) NOP();
148 0000 NOP
(0394) NOP();
149 0000 NOP
(0395)
(0396) if (!(PINC & (BIT(4)))) //读取pc4端口,如果返回值是0则表明按键被按下,
14A 999C SBIC 0x13,4
14B C002 RJMP 0x014E
(0397) //则返回按键的值
(0398)
(0399) {
(0400) chTempKeyCode = 11;
(0401) return chTempKeyCode;
14C E00B LDI R16,0xB
14D C063 RJMP 0x01B1
(0402) }
(0403) else if (!(PINC & (BIT(5))))//读取pc5端口,如果返回值是0则表明按键被按下,
14E 999D SBIC 0x13,5
14F C002 RJMP 0x0152
(0404) //则返回按键的值
(0405) {
(0406) chTempKeyCode = 12;
(0407) return chTempKeyCode;
150 E00C LDI R16,0xC
151 C05F RJMP 0x01B1
(0408) }
(0409) ////////////////////////////////////////////////////////////////
(0410) //对16按钮进行扫描
(0411) DDRC &= ~(BIT(2) | BIT(1) |
152 B384 IN R24,0x14
153 7D81 ANDI R24,0xD1
154 BB84 OUT 0x14,R24
(0412) BIT(3) | BIT(5));//把端口pc1-pc3、pc5设置为输入
(0413)
(0414) DDRC |= BIT(4); //把pc4端口设为输出
155 9AA4 SBI 0x14,4
(0415)
(0416) PORTC |= BIT(1) | BIT(2) | BIT(3) |
156 B385 IN R24,0x15
157 638E ORI R24,0x3E
158 BB85 OUT 0x15,R24
(0417) BIT(4) | BIT(5);
(0418)
(0419) PORTC &=~ BIT(4); //把pc4端口拉低
159 98AC CBI 0x15,4
(0420) NOP();
15A 0000 NOP
(0421) NOP();
15B 0000 NOP
(0422)
(0423)
(0424) if (!(PINC & (BIT(5))))
15C 999D SBIC 0x13,5
15D C002 RJMP 0x0160
(0425) {
(0426) chTempKeyCode = 16;
(0427) return chTempKeyCode; //读取pc5端口,如果返回值是0则表明按键被按下,
15E E100 LDI R16,0x10
15F C051 RJMP 0x01B1
(0428) //则返回按键的值
(0429) }
(0430)
(0431)
(0432) //////////////////////////////////////////////////////////////
(0433) //对20-17按钮进行扫描
(0434) DDRC &= ~(BIT(2) | BIT(3) |
160 B384 IN R24,0x14
161 7E81 ANDI R24,0xE1
162 BB84 OUT 0x14,R24
(0435) BIT(4) | BIT(1)); //把端口pc1-pc4设置为输入
(0436)
(0437) DDRC |= BIT(5); //把pc5端口设为输出
163 9AA5 SBI 0x14,5
(0438)
(0439) PORTC |= BIT(1) | BIT(2) | BIT(3) |
164 B385 IN R24,0x15
165 638E ORI R24,0x3E
166 BB85 OUT 0x15,R24
(0440) BIT(4) | BIT(5);
(0441)
(0442) PORTC &= ~BIT(5); //把pc5端口拉低
167 98AD CBI 0x15,5
(0443) NOP();
168 0000 NOP
(0444) NOP();
169 0000 NOP
(0445)
(0446)
(0447)
(0448) if (!(PINC & (BIT(4)))) //读取pc4端口,如果返回值是0则表明按键被按下,
16A 999C SBIC 0x13,4
16B C002 RJMP 0x016E
(0449) //则返回按键的值
(0450) //以下依次对pc3-pc1逐个读取值,如果返回值为0
(0451) //则返回相应按键值
(0452) {
(0453) chTempKeyCode = 20;
(0454) return chTempKeyCode;
16C E104 LDI R16,0x14
16D C043 RJMP 0x01B1
(0455) }
(0456) else if (!(PINC & (BIT(3))))
16E 999B SBIC 0x13,3
16F C002 RJMP 0x0172
(0457) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -