📄 main.lst
字号:
(0084) #if KEY_USE_INT==0
(0085) Delay100us(1); //使用中断进行扫描不加延时
(0086) #endif
(0087) if(HAVE_KEY_DOWN)
0132 B389 IN R24,0x19
0133 708F ANDI R24,0xF
0134 308F CPI R24,0xF
0135 F409 BNE 0x0137
0136 C053 RJMP 0x018A
(0088) {
(0089)
(0090) #if BEEP_EN ==1
(0091) BEEP_PORT |= (1<<BEEP_BIT); //蜂鸣器响
0137 9A90 SBI 0x12,0
(0092) #endif
(0093)
(0094) temp_key = ( KEY_COL_ALL & KEY_PIN_COL ); //读取键值
0138 B369 IN R22,0x19
0139 706F ANDI R22,0xF
(0095)
(0096) switch(temp_key)
013A 2EA6 MOV R10,R22
013B 24BB CLR R11
013C 01C5 MOVW R24,R10
013D 3087 CPI R24,7
013E E0E0 LDI R30,0
013F 079E CPC R25,R30
0140 F099 BEQ 0x0154
0141 308B CPI R24,0xB
0142 E0E0 LDI R30,0
0143 079E CPC R25,R30
0144 F069 BEQ 0x0152
0145 308D CPI R24,0xD
0146 E0E0 LDI R30,0
0147 079E CPC R25,R30
0148 F039 BEQ 0x0150
0149 308E CPI R24,0xE
014A E0E0 LDI R30,0
014B 079E CPC R25,R30
014C F009 BEQ 0x014E
014D C007 RJMP 0x0155
(0097) {
(0098) case (KEY_COL_ALL&(~(1<<KEY_COL_0))):
(0099) key_i = 0;
014E 2744 CLR R20
(0100) break;
014F C005 RJMP 0x0155
(0101) case (KEY_COL_ALL&(~(1<<KEY_COL_1))):
(0102) key_i = 1;
0150 E041 LDI R20,1
(0103) break;
0151 C003 RJMP 0x0155
(0104) case (KEY_COL_ALL&(~(1<<KEY_COL_2))):
(0105) key_i = 2;
0152 E042 LDI R20,2
(0106) break;
0153 C001 RJMP 0x0155
(0107) case (KEY_COL_ALL&(~(1<<KEY_COL_3))):
(0108) key_i = 3;
0154 E043 LDI R20,3
(0109) break;
(0110)
(0111) // 扩展
(0112) #if PER_COL>4
(0113) case (KEY_COL_ALL&(~(1<<KEY_COL_4))):
(0114) key_i = 4;
(0115) break;
(0116) #endif
(0117) #if PER_COL>5
(0118) case (KEY_COL_ALL&(~(1<<KEY_COL_5))):
(0119) key_i = 5;
(0120) break;
(0121) #endif
(0122) #if PER_COL>6
(0123) case (KEY_COL_ALL&(~(1<<KEY_COL_6))):
(0124) key_i = 6;
(0125) break;
(0126) #endif
(0127) #if PER_COL>7
(0128) case (KEY_COL_ALL&(~(1<<KEY_COL_7))):
(0129) key_i = 7;
(0130) break;
(0131) #endif
(0132)
(0133) default:break;
(0134) }//end switch
(0135)
(0136) //翻转,与初始化恰好相反
(0137) KEY_DDR_ROW &=~ KEY_ROW_ALL; //行输入,并使能内部上拉
0155 B38A IN R24,0x1A
0156 708F ANDI R24,0xF
0157 BB8A OUT 0x1A,R24
(0138) KEY_PORT_ROW |= KEY_ROW_ALL;
0158 B38B IN R24,0x1B
0159 6F80 ORI R24,0xF0
015A BB8B OUT 0x1B,R24
(0139) KEY_DDR_COL |= KEY_COL_ALL; //列输出,低
015B B38A IN R24,0x1A
015C 608F ORI R24,0xF
015D BB8A OUT 0x1A,R24
(0140) KEY_PORT_COL &=~ KEY_COL_ALL;
015E B38B IN R24,0x1B
015F 7F80 ANDI R24,0xF0
0160 BB8B OUT 0x1B,R24
(0141)
(0142) NOP(); //等待啊你家安稳定,此步骤不能少
0161 0000 NOP
(0143)
(0144) temp_key = ( KEY_ROW_ALL & KEY_PIN_ROW ); //读取翻转后键值
0162 B369 IN R22,0x19
0163 7F60 ANDI R22,0xF0
(0145)
(0146) switch(temp_key)
0164 2777 CLR R23
0165 3B60 CPI R22,0xB0
0166 E0E0 LDI R30,0
0167 077E CPC R23,R30
0168 F0C9 BEQ 0x0182
0169 EB80 LDI R24,0xB0
016A E090 LDI R25,0
016B 1786 CP R24,R22
016C 0797 CPC R25,R23
016D F02C BLT 0x0173
016E 3760 CPI R22,0x70
016F E0E0 LDI R30,0
0170 077E CPC R23,R30
0171 F091 BEQ 0x0184
0172 C012 RJMP 0x0185
0173 3D60 CPI R22,0xD0
0174 E0E0 LDI R30,0
0175 077E CPC R23,R30
0176 F049 BEQ 0x0180
0177 3D60 CPI R22,0xD0
0178 E0E0 LDI R30,0
0179 077E CPC R23,R30
017A F054 BLT 0x0185
017B 3E60 CPI R22,0xE0
017C E0E0 LDI R30,0
017D 077E CPC R23,R30
017E F031 BEQ 0x0185
017F C005 RJMP 0x0185
(0147) {
(0148) case (KEY_ROW_ALL&(~(1<<KEY_ROW_0))):
(0149) // key_i += 0; //加零,直接省掉
(0150) break;
(0151) case (KEY_ROW_ALL&(~(1<<KEY_ROW_1))):
(0152) key_i += PER_POW;
0180 5F4C SUBI R20,0xFC
(0153) break;
0181 C003 RJMP 0x0185
(0154) case (KEY_ROW_ALL&(~(1<<KEY_ROW_2))):
(0155) key_i += PER_POW*2;
0182 5F48 SUBI R20,0xF8
(0156) break;
0183 C001 RJMP 0x0185
(0157) case (KEY_ROW_ALL&(~(1<<KEY_ROW_3))):
(0158) key_i += PER_POW*3;
0184 5F44 SUBI R20,0xF4
(0159) break;
(0160)
(0161) // 扩展 PER_POW 最大值为8
(0162) #if PER_POW>4
(0163) case (KEY_ROW_ALL&(~(1<<KEY_ROW_4))):
(0164) key_i += PER_POW*4;
(0165) break;
(0166) #endif
(0167) #if PER_POW>5
(0168) case (KEY_ROW_ALL&(~(1<<KEY_ROW_5))):
(0169) key_i += PER_POW*5;
(0170) break;
(0171) #endif
(0172) #if PER_POW>6
(0173) case (KEY_ROW_ALL&(~(1<<KEY_ROW_6))):
(0174) key_i += PER_POW*6;
(0175) break;
(0176) #endif
(0177) #if PER_POW>7
(0178) case (KEY_ROW_ALL&(~(1<<KEY_ROW_7))):
(0179) key_i += PER_POW*7;
(0180) break;
(0181) #endif
(0182)
(0183) default:break;
(0184) }//end switch
(0185)
(0186) //检测按键抬起
(0187) #if WAIT_KEY_UP==1
(0188) while((KEY_ROW_ALL & KEY_PIN_ROW)!=KEY_ROW_ALL)
0185 B389 IN R24,0x19
0186 7F80 ANDI R24,0xF0
0187 3F80 CPI R24,0xF0
0188 F7E1 BNE 0x0185
(0189) ;
(0190) #endif
(0191)
(0192) key_board_int(); //恢复键盘IO口的初时状态
0189 DF90 RCALL _key_board_int
(0193)
(0194) }//end if have key
(0195) return key_board_table[key_i]; //返回键值
018A E685 LDI R24,0x65
018B E090 LDI R25,0
018C 2FE4 MOV R30,R20
018D 27FF CLR R31
018E 0FE8 ADD R30,R24
018F 1FF9 ADC R31,R25
0190 9104 LPM R16,0(Z)
0191 C001 RJMP 0x0193
(0196) }
(0197) else
(0198) return 0xFF;
0192 EF0F LDI R16,0xFF
0193 940E01E1 CALL pop_gset3
0195 9508 RET
FILE: D:\avrvi\democode\key_4\source\main.c
(0001) /************************************************************
(0002) 文 件:main.c
(0003) 用 途:演示矩阵键盘的库函数和七段数码管的库函数的使用
(0004) Target : M16
(0005) Crystal: 1.0000Mhz
(0006) 说 明:标有[]的为与key_3中不同的地方
(0007) 创 建:2008.2.20
(0008) 修 改:2008.2.20
(0009) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0010) ************************************************************/
(0011)
(0012) #include "config.h"
(0013)
(0014) void main(void)
(0015) {
(0016) uint8 i=0;
_main:
i --> R20
0196 2744 CLR R20
(0017)
(0018) key_board_int(); //矩阵按键初始化
0197 940E011A CALL _key_board_int
(0019) Seg7_Led_Init(); //七段数码管显示初始化
0199 940E0089 CALL _Seg7_Led_Init
(0020)
(0021) key_int_init(); //中断初始化 []
019B 940E0114 CALL _key_int_init
(0022) SEI(); //开全局中断 []
019D 9478 BSET 7
019E C024 RJMP 0x01C3
(0023)
(0024) while(1)
(0025) {
(0026) if(KEY_FLAG) //如果有键按下,此变量在key_board.c中定义,并会在中断中改变 []
019F 90200060 LDS R2,KEY_FLAG
01A1 2022 TST R2
01A2 F0F1 BEQ 0x01C1
(0027) {
(0028) KEY_FLAG = 0; // []
01A3 2422 CLR R2
01A4 92200060 STS KEY_FLAG,R2
(0029)
(0030) if(key!=0xFF) //key为在key_board.c中定义的全局变量
01A6 91800061 LDS R24,key
01A8 3F8F CPI R24,0xFF
01A9 F0B9 BEQ 0x01C1
(0031) {
(0032) for(i=3;i!=0;i--) //左移位显示
01AA E043 LDI R20,3
01AB C00F RJMP 0x01BB
(0033) {
(0034) Seg7_Led_Buf[i]=Seg7_Led_Buf[i-1];
01AC E681 LDI R24,0x61
01AD E090 LDI R25,0
01AE 2FE4 MOV R30,R20
01AF 27FF CLR R31
01B0 0FE8 ADD R30,R24
01B1 1FF9 ADC R31,R25
01B2 8020 LDD R2,Z+0
01B3 E682 LDI R24,0x62
01B4 E090 LDI R25,0
01B5 2FE4 MOV R30,R20
01B6 27FF CLR R31
01B7 0FE8 ADD R30,R24
01B8 1FF9 ADC R31,R25
01B9 8220 STD Z+0,R2
01BA 954A DEC R20
01BB 2344 TST R20
01BC F779 BNE 0x01AC
(0035) }
(0036) Seg7_Led_Buf[0]=key;
01BD 90200061 LDS R2,key
01BF 92200062 STS Seg7_Led_Buf,R2
(0037) }
(0038)
(0039) /*
(0040) if(key!=0xFF) //0xFF为无效按键
(0041) {
(0042) switch(key) //判断按键进行相关操作
(0043) {
(0044) case 'A':
(0045) PORTA ^=(1<<PA0);
(0046) break;
(0047) case 'B':
(0048) PORTA ^=(1<<PA1);
(0049) break;
(0050) case 'C':
(0051) PORTA ^=(1<<PA2);
(0052) break;
(0053) case 'D':
(0054) PORTA ^=(1<<PA3);
(0055) break;
(0056) default:
(0057) break;
(0058) } //end switch
(0059) }//end if(key!=0xFF)
(0060) */
(0061)
(0062) }//end if(HAVE_KEY_DOWN)
(0063) //Delay100us(10);
(0064)
(0065) Seg7_Led_Update(); //按键显示
FILE: <library>
01C1 940E009D CALL _Seg7_Led_Update
01C3 CFDB RJMP 0x019F
01C4 9508 RET
mod16u:
01C5 9468 BSET 6
01C6 C001 RJMP xdiv16u
div16u:
01C7 94E8 BCLR 6
xdiv16u:
01C8 92EA ST R14,-Y
01C9 92FA ST R15,-Y
01CA 938A ST R24,-Y
01CB 24EE CLR R14
01CC 24FF CLR R15
01CD E180 LDI R24,0x10
01CE 0F00 LSL R16
01CF 1F11 ROL R17
01D0 1CEE ROL R14
01D1 1CFF ROL R15
01D2 16E2 CP R14,R18
01D3 06F3 CPC R15,R19
01D4 F018 BCS 0x01D8
01D5 1AE2 SUB R14,R18
01D6 0AF3 SBC R15,R19
01D7 9503 INC R16
01D8 958A DEC R24
01D9 F7A1 BNE 0x01CE
01DA F416 BRTC 0x01DD
01DB 2D0E MOV R16,R14
01DC 2D1F MOV R17,R15
01DD 9189 LD R24,Y+
01DE 90F9 LD R15,Y+
01DF 90E9 LD R14,Y+
01E0 9508 RET
pop_gset3:
01E1 E0E4 LDI R30,4
01E2 940C01F0 JMP pop
push_gset5:
01E4 92FA ST R15,-Y
01E5 92EA ST R14,-Y
push_gset4:
01E6 92DA ST R13,-Y
01E7 92CA ST R12,-Y
push_gset3:
01E8 92BA ST R11,-Y
01E9 92AA ST R10,-Y
push_gset2:
01EA 937A ST R23,-Y
01EB 936A ST R22,-Y
push_gset1:
01EC 935A ST R21,-Y
01ED 934A ST R20,-Y
01EE 9508 RET
pop_gset1:
01EF E0E1 LDI R30,1
pop:
01F0 9149 LD R20,Y+
01F1 9159 LD R21,Y+
01F2 FDE0 SBRC R30,0
01F3 9508 RET
01F4 9169 LD R22,Y+
01F5 9179 LD R23,Y+
01F6 FDE1 SBRC R30,1
01F7 9508 RET
01F8 90A9 LD R10,Y+
01F9 90B9 LD R11,Y+
01FA FDE2 SBRC R30,2
01FB 9508 RET
01FC 90C9 LD R12,Y+
01FD 90D9 LD R13,Y+
01FE FDE3 SBRC R30,3
01FF 9508 RET
0200 90E9 LD R14,Y+
0201 90F9 LD R15,Y+
0202 9508 RET
push_lset:
0203 93FA ST R31,-Y
0204 93EA ST R30,-Y
0205 93BA ST R27,-Y
0206 93AA ST R26,-Y
0207 939A ST R25,-Y
0208 938A ST R24,-Y
0209 933A ST R19,-Y
020A 932A ST R18,-Y
020B 931A ST R17,-Y
020C 930A ST R16,-Y
020D 929A ST R9,-Y
020E 928A ST R8,-Y
020F 927A ST R7,-Y
0210 926A ST R6,-Y
0211 925A ST R5,-Y
0212 924A ST R4,-Y
0213 923A ST R3,-Y
0214 922A ST R2,-Y
0215 921A ST R1,-Y
0216 920A ST R0,-Y
0217 B60F IN R0,0x3F
0218 920A ST R0,-Y
0219 9508 RET
pop_lset:
021A 9009 LD R0,Y+
021B BE0F OUT 0x3F,R0
021C 9009 LD R0,Y+
021D 9019 LD R1,Y+
021E 9029 LD R2,Y+
021F 9039 LD R3,Y+
0220 9049 LD R4,Y+
0221 9059 LD R5,Y+
0222 9069 LD R6,Y+
0223 9079 LD R7,Y+
0224 9089 LD R8,Y+
0225 9099 LD R9,Y+
0226 9109 LD R16,Y+
0227 9119 LD R17,Y+
0228 9129 LD R18,Y+
0229 9139 LD R19,Y+
022A 9189 LD R24,Y+
022B 9199 LD R25,Y+
022C 91A9 LD R26,Y+
022D 91B9 LD R27,Y+
022E 91E9 LD R30,Y+
022F 91F9 LD R31,Y+
0230 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -