📄 4x4key.lst
字号:
(0145)
(0146) if((KEY_IN&H1)==H1) return L4_H1;
00B8 B389 IN R24,0x19
00B9 7180 ANDI R24,0x10
00BA 3180 CPI R24,0x10
00BB F411 BNE 0x00BE
00BC E003 LDI R16,3
00BD C013 RJMP 0x00D1
(0147) if((KEY_IN&H2)==H2) return L4_H2;
00BE B389 IN R24,0x19
00BF 7280 ANDI R24,0x20
00C0 3280 CPI R24,0x20
00C1 F411 BNE 0x00C4
00C2 E007 LDI R16,7
00C3 C00D RJMP 0x00D1
(0148) if((KEY_IN&H3)==H3) return L4_H3;
00C4 B389 IN R24,0x19
00C5 7480 ANDI R24,0x40
00C6 3480 CPI R24,0x40
00C7 F411 BNE 0x00CA
00C8 E00B LDI R16,0xB
00C9 C007 RJMP 0x00D1
(0149) if((KEY_IN&H4)==H4) return L4_H4;
00CA B389 IN R24,0x19
00CB 7880 ANDI R24,0x80
00CC 3880 CPI R24,0x80
00CD F411 BNE 0x00D0
00CE E00F LDI R16,0xF
00CF C001 RJMP 0x00D1
(0150)
(0151) return ON_PUSH;
00D0 EF0F LDI R16,0xFF
00D1 9508 RET
_Read_Key:
00D2 940E0135 CALL push_gset1
(0152)
(0153) }
(0154)
(0155) //=======================================================================
(0156) void Read_Key(void)
(0157) {
(0158) switch(Key_State)
00D4 91400061 LDS R20,Key_State
00D6 2755 CLR R21
00D7 3040 CPI R20,0
00D8 0745 CPC R20,R21
00D9 F049 BEQ 0x00E3
00DA 3041 CPI R20,1
00DB E0E0 LDI R30,0
00DC 075E CPC R21,R30
00DD F071 BEQ 0x00EC
00DE 3042 CPI R20,2
00DF E0E0 LDI R30,0
00E0 075E CPC R21,R30
00E1 F0E1 BEQ 0x00FE
00E2 C021 RJMP 0x0104
(0159) {
(0160) case 0:
(0161) if(KEYDIN() != ON_PUSH)
00E3 DF80 RCALL _KEYDIN
00E4 3F0F CPI R16,0xFF
00E5 F0F1 BEQ 0x0104
(0162) {
(0163) Key_State++;
00E6 91800061 LDS R24,Key_State
00E8 5F8F SUBI R24,0xFF
00E9 93800061 STS Key_State,R24
(0164) }
(0165) break;
00EB C018 RJMP 0x0104
(0166) case 1:
(0167) if(KEYDIN() != ON_PUSH)
00EC DF77 RCALL _KEYDIN
00ED 3F0F CPI R16,0xFF
00EE F049 BEQ 0x00F8
(0168) {
(0169) Key_State++;
00EF 91800061 LDS R24,Key_State
00F1 5F8F SUBI R24,0xFF
00F2 93800061 STS Key_State,R24
(0170) Key_Value=KEYDIN();
00F4 DF6F RCALL _KEYDIN
00F5 93000060 STS Key_Value,R16
(0171) }
00F7 C00C RJMP 0x0104
(0172) else
(0173) {
(0174) Key_State--;
00F8 91800061 LDS R24,Key_State
00FA 5081 SUBI R24,1
00FB 93800061 STS Key_State,R24
(0175) }
(0176) break;
00FD C006 RJMP 0x0104
(0177) case 2:
(0178) if(KEYDIN() == ON_PUSH)
00FE DF65 RCALL _KEYDIN
00FF 3F0F CPI R16,0xFF
0100 F419 BNE 0x0104
(0179) {
(0180) Key_State=0;
0101 2422 CLR R2
0102 92200061 STS Key_State,R2
(0181) }
(0182) break;
0104 940E0138 CALL pop_gset1
0106 9508 RET
(0183) }
(0184)
(0185) }
(0186)
(0187) void main(void)
(0188) {
(0189) KEY_Init();
_main:
0107 DF43 RCALL _KEY_Init
(0190)
(0191) Key_State = 0;
0108 2422 CLR R2
0109 92200061 STS Key_State,R2
(0192) Key_Value = ON_PUSH;
010B EF8F LDI R24,0xFF
010C 93800060 STS Key_Value,R24
(0193)
(0194) Uart_Init(); //TART初始化
010E D00D RCALL _Uart_Init
(0195) SEI(); //全局中断使能
010F 9478 BSET 7
0110 C009 RJMP 0x011A
(0196)
(0197) while(1)
(0198) {
(0199) if(Key_Value != ON_PUSH)
0111 91800060 LDS R24,Key_Value
0113 3F8F CPI R24,0xFF
0114 F029 BEQ 0x011A
(0200) {
(0201) USART_TXD(Key_Value);
0115 2F08 MOV R16,R24
0116 D00E RCALL _USART_TXD
(0202) Key_Value = ON_PUSH;
0117 EF8F LDI R24,0xFF
0118 93800060 STS Key_Value,R24
011A CFF6 RJMP 0x0111
011B 9508 RET
(0203) }
(0204) }
(0205) }
(0206)
(0207) //===============================================================
(0208) void Uart_Init(void) //UART初始化
(0209) {
(0210)
(0211) //设置侦格式
(0212) //异步,8位数据,无奇偶校验,一个停止位,无倍速
(0213) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
_Uart_Init:
011C E886 LDI R24,0x86
011D BD80 OUT 0x20,R24
(0214)
(0215) //设置波特率
(0216) UBRRL= (F_osc/Baud_rate/16-1)%256;
011E E28F LDI R24,0x2F
011F B989 OUT 0x09,R24
(0217) UBRRH= (F_osc/Baud_rate/16-1)/256;
0120 2422 CLR R2
0121 BC20 OUT 0x20,R2
(0218)
(0219) //使能接收中断,使能接收,使能发送
(0220) UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
0122 E988 LDI R24,0x98
0123 B98A OUT 0x0A,R24
0124 9508 RET
(0221) }
(0222)
(0223)
(0224) //===============================================================
(0225) void USART_TXD(uint8 data) //发送采用查询方式
(0226) {
(0227) while( !(UCSRA & BIT(UDRE)) );
_USART_TXD:
data --> R16
0125 9B5D SBIS 0x0B,5
0126 CFFE RJMP _USART_TXD
(0228) UDR=data;
0127 B90C OUT 0x0C,R16
(0229) while( !(UCSRA & BIT(TXC )) );
0128 9B5E SBIS 0x0B,6
0129 CFFE RJMP 0x0128
(0230) UCSRA|=BIT(TXC);
012A 9A5E SBI 0x0B,6
012B 9508 RET
(0231) }
(0232)
(0233) //=======================================================================
(0234)
(0235) #pragma interrupt_handler USART_RXC:12
(0236) void USART_RXC(void)
(0237) {
FILE: <library>
_USART_RXC:
012C 9518 RETI
push_gset5:
012D 92FA ST R15,-Y
012E 92EA ST R14,-Y
push_gset4:
012F 92DA ST R13,-Y
0130 92CA ST R12,-Y
push_gset3:
0131 92BA ST R11,-Y
0132 92AA ST R10,-Y
push_gset2:
0133 937A ST R23,-Y
0134 936A ST R22,-Y
push_gset1:
0135 935A ST R21,-Y
0136 934A ST R20,-Y
0137 9508 RET
pop_gset1:
0138 E0E1 LDI R30,1
pop:
0139 9149 LD R20,Y+
013A 9159 LD R21,Y+
013B FDE0 SBRC R30,0
013C 9508 RET
013D 9169 LD R22,Y+
013E 9179 LD R23,Y+
013F FDE1 SBRC R30,1
0140 9508 RET
0141 90A9 LD R10,Y+
0142 90B9 LD R11,Y+
0143 FDE2 SBRC R30,2
0144 9508 RET
0145 90C9 LD R12,Y+
0146 90D9 LD R13,Y+
0147 FDE3 SBRC R30,3
0148 9508 RET
0149 90E9 LD R14,Y+
014A 90F9 LD R15,Y+
014B 9508 RET
push_lset:
014C 93FA ST R31,-Y
014D 93EA ST R30,-Y
014E 93BA ST R27,-Y
014F 93AA ST R26,-Y
0150 939A ST R25,-Y
0151 938A ST R24,-Y
0152 933A ST R19,-Y
0153 932A ST R18,-Y
0154 931A ST R17,-Y
0155 930A ST R16,-Y
0156 929A ST R9,-Y
0157 928A ST R8,-Y
0158 927A ST R7,-Y
0159 926A ST R6,-Y
015A 925A ST R5,-Y
015B 924A ST R4,-Y
015C 923A ST R3,-Y
015D 922A ST R2,-Y
015E 921A ST R1,-Y
015F 920A ST R0,-Y
0160 B60F IN R0,0x3F
0161 920A ST R0,-Y
0162 9508 RET
pop_lset:
0163 9009 LD R0,Y+
0164 BE0F OUT 0x3F,R0
0165 9009 LD R0,Y+
0166 9019 LD R1,Y+
0167 9029 LD R2,Y+
0168 9039 LD R3,Y+
0169 9049 LD R4,Y+
016A 9059 LD R5,Y+
016B 9069 LD R6,Y+
016C 9079 LD R7,Y+
016D 9089 LD R8,Y+
016E 9099 LD R9,Y+
016F 9109 LD R16,Y+
0170 9119 LD R17,Y+
0171 9129 LD R18,Y+
0172 9139 LD R19,Y+
0173 9189 LD R24,Y+
0174 9199 LD R25,Y+
0175 91A9 LD R26,Y+
0176 91B9 LD R27,Y+
0177 91E9 LD R30,Y+
0178 91F9 LD R31,Y+
0179 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -