📄 key.lst
字号:
__text_start:
__start:
0032 E5CF LDI R28,0x5F
0033 E0D4 LDI R29,4
0034 BFCD OUT 0x3D,R28
0035 BFDE OUT 0x3E,R29
0036 51C0 SUBI R28,0x10
0037 40D0 SBCI R29,0
0038 EA0A LDI R16,0xAA
0039 8308 STD Y+0,R16
003A 2400 CLR R0
003B E7E0 LDI R30,0x70
003C E0F0 LDI R31,0
003D E010 LDI R17,0
003E 37E0 CPI R30,0x70
003F 07F1 CPC R31,R17
0040 F011 BEQ 0x0043
0041 9201 ST R0,Z+
0042 CFFB RJMP 0x003E
0043 8300 STD Z+0,R16
0044 E5E4 LDI R30,0x54
0045 E0F0 LDI R31,0
0046 E6A0 LDI R26,0x60
0047 E0B0 LDI R27,0
0048 E010 LDI R17,0
0049 36E4 CPI R30,0x64
004A 07F1 CPC R31,R17
004B F021 BEQ 0x0050
004C 95C8 LPM
004D 9631 ADIW R30,1
004E 920D ST R0,X+
004F CFF9 RJMP 0x0049
0050 940E00ED CALL _main
_exit:
0052 CFFF RJMP _exit
FILE: F:\自编程序\M16\4-4keyboard\UART.C
(0001) #include <iom16v.h>
(0002) #pragma interrupt_handler USART_Recive_Complete_handler:12
(0003) #pragma interrupt_handler USART_Data_Register_Empty_handler:13
(0004) #pragma interrupt_handler USART_Transmit_Complete_handler:14
(0005) void USART_Init(void)
(0006) {
(0007) //{{WIZARD_MAP(UART)
(0008) // crystal: 8M
(0009) // Baud Rate: 9600
(0010) // Character Size: 8-bit
(0011) // Mode: Asynchronous
(0012) // Parity: Disabled
(0013) // Stop Bit: 1-bit
(0014) UBRRL = 0x33;
_USART_Init:
0053 E383 LDI R24,0x33
0054 B989 OUT 0x09,R24
(0015) UBRRH = 0x00;
0055 2422 CLR R2
0056 BC20 OUT 0x20,R2
(0016) UCSRA = 0x00;
0057 B82B OUT 0x0B,R2
(0017) UCSRC = 0x86;
0058 E886 LDI R24,0x86
0059 BD80 OUT 0x20,R24
(0018) UCSRB = 0x18;
005A E188 LDI R24,0x18
005B B98A OUT 0x0A,R24
(0019) //UCSRB|=0X80;//开接收结束中断
(0020) //UCSRB|=0X40;//开发送结束中断
(0021) //UCSRB|=0X20;//开数据寄存器空中断
(0022) }
005C 9508 RET
(0023) void USART_Transmit(unsigned char data)
(0024) {
(0025) /* 等待发送缓冲器为空 */
(0026) while ( !( UCSRA & (1<<UDRE)) );
_USART_Transmit:
data --> R16
005D 9B5D SBIS 0x0B,5
005E CFFE RJMP _USART_Transmit
(0027) /* 将数据放入缓冲器,发送数据 */
(0028) UDR = data;
005F B90C OUT 0x0C,R16
(0029) }
0060 9508 RET
(0030) unsigned char USART_Recive(void)
(0031) {
(0032) /* 等待接收数据*/
(0033) while ( !(UCSRA & (1<<RXC)) );
_USART_Recive:
0061 9B5F SBIS 0x0B,7
0062 CFFE RJMP _USART_Recive
(0034) /* 从缓冲器中获取并返回数据*/
(0035) return UDR;
0063 B10C IN R16,0x0C
0064 9508 RET
(0036) }
(0037) void USART_Recive_Complete_handler(void)
(0038) {
(0039)
(0040) }
_USART_Recive_Complete_handler:
0065 9518 RETI
(0041) void USART_Data_Register_Empty_handler(void)
(0042) {
(0043)
(0044) }void USART_Transmit_Complete_handler(void)
_USART_Data_Register_Empty_handler:
0066 9518 RETI
(0045) {
(0046)
(0047) }
_USART_Transmit_Complete_handler:
0067 9518 RETI
_INT0_TURNLOW_handler:
i --> R20
ScanCode --> R22
j --> R10
0068 940E0121 CALL push_lset
006A 940E011D CALL push_gset3
FILE: F:\自编程序\M16\4-4keyboard\key.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) //键盘接口
(0005) #define KEYDDR DDRB
(0006) #define KEYPORT PORTB
(0007) #define KEYPIN PINB
(0008) //键盘接口
(0009)
(0010) unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
(0011)
(0012) /**************INT0处理函数 start*******************/
(0013) /**************
(0014) 捕捉键盘输入中断进行处理
(0015) *******************/
(0016) #pragma interrupt_handler INT0_TURNLOW_handler:2
(0017) void INT0_TURNLOW_handler(void)
(0018) {
(0019) unsigned char i,j,ScanCode;
(0020) ScanCode=0x01;
006C E061 LDI R22,1
(0021) CLI();
006D 94F8 BCLR 7
(0022) for(i=0;i<4;i++)
006E 2744 CLR R20
006F C015 RJMP 0x0085
(0023) {
(0024) KEYPORT=ScanCode;for(j=0;j<10;j++);
0070 BB68 OUT 0x18,R22
0071 24AA CLR R10
0072 C001 RJMP 0x0074
0073 94A3 INC R10
0074 2D8A MOV R24,R10
0075 308A CPI R24,0xA
0076 F3E0 BCS 0x0073
(0025) if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
0077 B386 IN R24,0x16
0078 7F80 ANDI R24,0xF0
0079 F049 BEQ 0x0083
007A B326 IN R18,0x16
007B 2733 CLR R19
007C 7F20 ANDI R18,0xF0
007D 7030 ANDI R19,0
007E 2F06 MOV R16,R22
007F 2711 CLR R17
0080 D014 RCALL _keycode
0081 940E005D CALL _USART_Transmit
(0026) ScanCode<<=1;
0083 0F66 LSL R22
0084 9543 INC R20
0085 3044 CPI R20,4
0086 F348 BCS 0x0070
(0027) }
(0028) for(j=0;j<200;j++);//消抖
0087 24AA CLR R10
0088 C001 RJMP 0x008A
0089 94A3 INC R10
008A 2D8A MOV R24,R10
008B 3C88 CPI R24,0xC8
008C F3E0 BCS 0x0089
(0029) SEI();
008D 9478 BSET 7
(0030) KEYPORT=0X0F;
008E E08F LDI R24,0xF
008F BB88 OUT 0x18,R24
(0031) }
0090 940E00FF CALL pop_gset3
0092 940E0138 CALL pop_lset
0094 9518 RETI
_keycode:
temp --> R20
line --> R18
row --> R16
0095 940E0119 CALL push_gset2
(0032) /**************INT0处理函数 end*******************/
(0033) /**************解码函数 start*******************/
(0034) unsigned keycode(unsigned char row,unsigned char line)
(0035) {
(0036) unsigned char temp;
(0037) switch(row) //行值处理
0097 2F40 MOV R20,R16
0098 2755 CLR R21
0099 3041 CPI R20,1
009A E0E0 LDI R30,0
009B 075E CPC R21,R30
009C F069 BEQ 0x00AA
009D 3042 CPI R20,2
009E E0E0 LDI R30,0
009F 075E CPC R21,R30
00A0 F059 BEQ 0x00AC
00A1 3044 CPI R20,4
00A2 E0E0 LDI R30,0
00A3 075E CPC R21,R30
00A4 F049 BEQ 0x00AE
00A5 3048 CPI R20,0x8
00A6 E0E0 LDI R30,0
00A7 075E CPC R21,R30
00A8 F039 BEQ 0x00B0
00A9 C007 RJMP 0x00B1
(0038) {
(0039) case 0x01:temp=0x00;break;
00AA 2744 CLR R20
00AB C005 RJMP 0x00B1
(0040) case 0x02:temp=0x04;break;
00AC E044 LDI R20,4
00AD C003 RJMP 0x00B1
(0041) case 0x04:temp=0x08;break;
00AE E048 LDI R20,0x8
00AF C001 RJMP 0x00B1
(0042) case 0x08:temp=0x0c;break;
00B0 E04C LDI R20,0xC
(0043) }
(0044) switch(line) //列值处理
00B1 2F62 MOV R22,R18
00B2 2777 CLR R23
00B3 3260 CPI R22,0x20
00B4 E0E0 LDI R30,0
00B5 077E CPC R23,R30
00B6 F0C1 BEQ 0x00CF
00B7 E280 LDI R24,0x20
00B8 E090 LDI R25,0
00B9 1786 CP R24,R22
00BA 0797 CPC R25,R23
00BB F02C BLT 0x00C1
00BC 3160 CPI R22,0x10
00BD E0E0 LDI R30,0
00BE 077E CPC R23,R30
00BF F071 BEQ 0x00CE
00C0 C013 RJMP 0x00D4
00C1 3460 CPI R22,0x40
00C2 E0E0 LDI R30,0
00C3 077E CPC R23,R30
00C4 F061 BEQ 0x00D1
00C5 3460 CPI R22,0x40
00C6 E0E0 LDI R30,0
00C7 077E CPC R23,R30
00C8 F05C BLT 0x00D4
00C9 3860 CPI R22,0x80
00CA E0E0 LDI R30,0
00CB 077E CPC R23,R30
00CC F031 BEQ 0x00D3
00CD C006 RJMP 0x00D4
(0045) {
(0046) case 0x10:temp+=0x00;break;
00CE C005 RJMP 0x00D4
(0047) case 0x20:temp+=0x01;break;
00CF 9543 INC R20
00D0 C003 RJMP 0x00D4
(0048) case 0x40:temp+=0x02;break;
00D1 5F4E SUBI R20,0xFE
00D2 C001 RJMP 0x00D4
(0049) case 0x80:temp+=0x03;break;
00D3 5F4D SUBI R20,0xFD
(0050) }
(0051) return num[temp];
00D4 E680 LDI R24,0x60
00D5 E090 LDI R25,0
00D6 2FE4 MOV R30,R20
00D7 27FF CLR R31
00D8 0FE8 ADD R30,R24
00D9 1FF9 ADC R31,R25
00DA 8100 LDD R16,Z+0
00DB 2711 CLR R17
00DC 940E00FC CALL pop_gset2
00DE 9508 RET
(0052) }
(0053) /**************解码函数 end*******************/
(0054) /**************键盘初始化 stat*******************/
(0055) void KEY_INI(void)//高四位输出并拉高
(0056) {
(0057) KEYDDR = 0x0F;
_KEY_INI:
00DF E08F LDI R24,0xF
00E0 BB87 OUT 0x17,R24
(0058) KEYPORT = 0x0F;
00E1 BB88 OUT 0x18,R24
(0059)
(0060) /*************INT0初始化 start******************/
(0061) PORTD &= 0xFB;
00E2 B382 IN R24,0x12
00E3 7F8B ANDI R24,0xFB
00E4 BB82 OUT 0x12,R24
(0062) DDRD &= 0xFB;
00E5 B381 IN R24,0x11
00E6 7F8B ANDI R24,0xFB
00E7 BB81 OUT 0x11,R24
(0063) MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
00E8 E083 LDI R24,3
00E9 BF85 OUT 0x35,R24
(0064) GICR=(1<<INT0);
00EA E480 LDI R24,0x40
00EB BF8B OUT 0x3B,R24
(0065) /**************INT0初始化 end*******************/
(0066)
(0067) }
00EC 9508 RET
FILE: F:\自编程序\M16\4-4keyboard\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) void main(void)
(0004) {
(0005) unsigned char k;
(0006) CLI();
_main:
k --> Y+1
00ED 94F8 BCLR 7
(0007) PORTD = 0x00;
00EE 2422 CLR R2
00EF BA22 OUT 0x12,R2
(0008) DDRD = 0x00;
00F0 BA21 OUT 0x11,R2
(0009) USART_Init();
00F1 940E0053 CALL _USART_Init
(0010) KEY_INI();
00F3 940E00DF CALL _KEY_INI
(0011) SEI();
00F5 9478 BSET 7
(0012) USART_Transmit('t');
00F6 E704 LDI R16,0x74
00F7 E010 LDI R17,0
00F8 940E005D CALL _USART_Transmit
(0013) while(1)
00FA CFFF RJMP 0x00FA
(0014) {
(0015) }
(0016) }
FILE: <library>
00FB 9508 RET
pop_gset2:
00FC E0E2 LDI R30,2
00FD 940C0106 JMP pop
pop_gset3:
00FF E0E4 LDI R30,4
0100 940C0106 JMP pop
push_gset1:
0102 935A ST R21,-Y
0103 934A ST R20,-Y
0104 9508 RET
pop_gset1:
0105 E0E1 LDI R30,1
pop:
0106 9149 LD R20,Y+
0107 9159 LD R21,Y+
0108 FDE0 SBRC R30,0
0109 9508 RET
010A 9169 LD R22,Y+
010B 9179 LD R23,Y+
010C FDE1 SBRC R30,1
010D 9508 RET
010E 90A9 LD R10,Y+
010F 90B9 LD R11,Y+
0110 FDE2 SBRC R30,2
0111 9508 RET
0112 90C9 LD R12,Y+
0113 90D9 LD R13,Y+
0114 FDE3 SBRC R30,3
0115 9508 RET
0116 90E9 LD R14,Y+
0117 90F9 LD R15,Y+
0118 9508 RET
push_gset2:
0119 937A ST R23,-Y
011A 936A ST R22,-Y
011B 940C0102 JMP push_gset1
push_gset3:
011D 92BA ST R11,-Y
011E 92AA ST R10,-Y
011F 940C0119 JMP push_gset2
push_lset:
0121 93FA ST R31,-Y
0122 93EA ST R30,-Y
0123 93BA ST R27,-Y
0124 93AA ST R26,-Y
0125 939A ST R25,-Y
0126 938A ST R24,-Y
0127 933A ST R19,-Y
0128 932A ST R18,-Y
0129 931A ST R17,-Y
012A 930A ST R16,-Y
012B 929A ST R9,-Y
012C 928A ST R8,-Y
012D 927A ST R7,-Y
012E 926A ST R6,-Y
012F 925A ST R5,-Y
0130 924A ST R4,-Y
0131 923A ST R3,-Y
0132 922A ST R2,-Y
0133 921A ST R1,-Y
0134 920A ST R0,-Y
0135 B60F IN R0,0x3F
0136 920A ST R0,-Y
0137 9508 RET
pop_lset:
0138 9009 LD R0,Y+
0139 BE0F OUT 0x3F,R0
013A 9009 LD R0,Y+
013B 9019 LD R1,Y+
013C 9029 LD R2,Y+
013D 9039 LD R3,Y+
013E 9049 LD R4,Y+
013F 9059 LD R5,Y+
0140 9069 LD R6,Y+
0141 9079 LD R7,Y+
0142 9089 LD R8,Y+
0143 9099 LD R9,Y+
0144 9109 LD R16,Y+
0145 9119 LD R17,Y+
0146 9129 LD R18,Y+
0147 9139 LD R19,Y+
0148 9189 LD R24,Y+
0149 9199 LD R25,Y+
014A 91A9 LD R26,Y+
014B 91B9 LD R27,Y+
014C 91E9 LD R30,Y+
014D 91F9 LD R31,Y+
014E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -