📄 3x3key.lst
字号:
__start:
__text_start:
0018 E5CF LDI R28,0x5F
0019 E0D4 LDI R29,4
001A BFCD OUT 0x3D,R28
001B BFDE OUT 0x3E,R29
001C 51C0 SUBI R28,0x10
001D 40D0 SBCI R29,0
001E EA0A LDI R16,0xAA
001F 8308 STD Y+0,R16
0020 2400 CLR R0
0021 E6E0 LDI R30,0x60
0022 E0F0 LDI R31,0
0023 E010 LDI R17,0
0024 36E0 CPI R30,0x60
0025 07F1 CPC R31,R17
0026 F011 BEQ 0x0029
0027 9201 ST R0,Z+
0028 CFFB RJMP 0x0024
0029 8300 STD Z+0,R16
002A E3E0 LDI R30,0x30
002B E0F0 LDI R31,0
002C E6A0 LDI R26,0x60
002D E0B0 LDI R27,0
002E E010 LDI R17,0
002F 33E0 CPI R30,0x30
0030 07F1 CPC R31,R17
0031 F021 BEQ 0x0036
0032 95C8 LPM
0033 9631 ADIW R30,1
0034 920D ST R0,X+
0035 CFF9 RJMP 0x002F
0036 D0B7 RCALL _main
_exit:
0037 CFFF RJMP _exit
_delay_us:
i --> R20
n --> R16
0038 D0EC RCALL push_gset1
FILE: F:\Learn\AVR\Pro_Mega8\KEY\3X3Key\Delay.h
(0001)
(0002) void delay_us(unsigned int n)
(0003) {
(0004) unsigned int i;
(0005) for(i=n;i>0;i--);
0039 01A8 MOVW R20,R16
003A C002 RJMP 0x003D
003B 5041 SUBI R20,1
003C 4050 SBCI R21,0
003D 3040 CPI R20,0
003E 0745 CPC R20,R21
003F F7D9 BNE 0x003B
(0006) }
0040 D0E7 RCALL pop_gset1
0041 9508 RET
(0007)
(0008) //延时1MS
(0009) void delay_1ms(void)
(0010) {
(0011) unsigned int i;
(0012) for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
i --> R16
0042 E001 LDI R16,1
0043 E010 LDI R17,0
0044 C002 RJMP 0x0047
0045 5F0F SUBI R16,0xFF
0046 4F1F SBCI R17,0xFF
0047 3706 CPI R16,0x76
0048 E0E4 LDI R30,4
0049 071E CPC R17,R30
004A F3D0 BCS 0x0045
(0013) ;
(0014) }
004B 9508 RET
_delay_ms:
i --> R20
n --> R22
004C D0EF RCALL push_gset2
004D 01B8 MOVW R22,R16
(0015)
(0016) //延时nMS
(0017) void delay_ms(unsigned int n)
(0018) {
(0019) unsigned int i=0;
004E 2744 CLR R20
004F 2755 CLR R21
0050 C003 RJMP 0x0054
(0020) while(i<n)
(0021) {
(0022) delay_1ms();
0051 DFF0 RCALL _delay_1ms
(0023) i++;
0052 5F4F SUBI R20,0xFF
0053 4F5F SBCI R21,0xFF
0054 1746 CP R20,R22
0055 0757 CPC R21,R23
0056 F3D0 BCS 0x0051
(0024) }
(0025) }
0057 D0C9 RCALL pop_gset2
0058 9508 RET
_ScanKey:
temp1 --> R22
key --> R20
temp --> R20
0059 D0E5 RCALL push_gset3
FILE: F:\Learn\AVR\Pro_Mega8\KEY\3X3Key\3X3Key.C
(0001) /******************************************/
(0002) //文件名:3X3Key.c
(0003) //功能: 键盘扫描的应用
(0004) //作者: young
(0005) //时间: 2006.11.6
(0006) //目标MCU:ATmega8
(0007) //晶振: 8MHZ
(0008) /******************************************/
(0009) #include <iom8v.h>
(0010) #include "Delay.h"
(0011)
(0012) //按键扫描函数,返回按键的值
(0013) unsigned char ScanKey(void)
(0014) {
(0015) unsigned char temp,temp1,key;
(0016) temp=PINC;
005A B343 IN R20,0x13
(0017) temp&=0x07;
005B 7047 ANDI R20,7
(0018) switch(temp) //判断行中哪条线有低电平
005C 2755 CLR R21
005D 3043 CPI R20,3
005E E0E0 LDI R30,0
005F 075E CPC R21,R30
0060 F409 BNE 0x0062
0061 C05F RJMP 0x00C1
0062 3045 CPI R20,5
0063 E0E0 LDI R30,0
0064 075E CPC R21,R30
0065 F179 BEQ 0x0095
0066 3046 CPI R20,6
0067 E0E0 LDI R30,0
0068 075E CPC R21,R30
0069 F009 BEQ 0x006B
006A C07F RJMP 0x00EA
(0019) {
(0020) case 0x06:
(0021) DDRC=0X07;
006B E087 LDI R24,7
006C BB84 OUT 0x14,R24
(0022) PORTC=0X38;
006D E388 LDI R24,0x38
006E BB85 OUT 0x15,R24
(0023) delay_us(1);
006F E001 LDI R16,1
0070 E010 LDI R17,0
0071 DFC6 RCALL _delay_us
(0024) temp1=PINC;
0072 B363 IN R22,0x13
(0025) temp1&=0x38;
0073 7368 ANDI R22,0x38
(0026) switch(temp1) //判断列中哪条线有低电平
0074 2F46 MOV R20,R22
0075 2755 CLR R21
0076 3248 CPI R20,0x28
0077 E0E0 LDI R30,0
0078 075E CPC R21,R30
0079 F089 BEQ 0x008B
007A E288 LDI R24,0x28
007B E090 LDI R25,0
007C 1784 CP R24,R20
007D 0795 CPC R25,R21
007E F02C BLT 0x0084
007F 3148 CPI R20,0x18
0080 E0E0 LDI R30,0
0081 075E CPC R21,R30
0082 F051 BEQ 0x008D
0083 C00B RJMP 0x008F
0084 3340 CPI R20,0x30
0085 E0E0 LDI R30,0
0086 075E CPC R21,R30
0087 F009 BEQ 0x0089
0088 C006 RJMP 0x008F
(0027) {
(0028) case 0x30: key=0x01; //得到键值
0089 E041 LDI R20,1
(0029) break;
008A C005 RJMP 0x0090
(0030) case 0x28: key=0x02;
008B E042 LDI R20,2
(0031) break;
008C C003 RJMP 0x0090
(0032) case 0x18: key=0x03;
008D E043 LDI R20,3
(0033) break;
008E C001 RJMP 0x0090
(0034) default: key=0;
008F 2744 CLR R20
(0035) break;
(0036) }
(0037) DDRC=0X38;
0090 E388 LDI R24,0x38
0091 BB84 OUT 0x14,R24
(0038) PORTC=0X07;
0092 E087 LDI R24,7
0093 BB85 OUT 0x15,R24
(0039) break;
0094 C056 RJMP 0x00EB
(0040)
(0041) case 0x05:
(0042) DDRC=0X07;
0095 E087 LDI R24,7
0096 BB84 OUT 0x14,R24
(0043) PORTC=0X38;
0097 E388 LDI R24,0x38
0098 BB85 OUT 0x15,R24
(0044) delay_us(1);
0099 E001 LDI R16,1
009A E010 LDI R17,0
009B DF9C RCALL _delay_us
(0045) temp1=PINC;
009C B363 IN R22,0x13
(0046) temp1&=0x38;
009D 7368 ANDI R22,0x38
(0047) switch(temp1)
009E 2EA6 MOV R10,R22
009F 24BB CLR R11
00A0 01C5 MOVW R24,R10
00A1 3288 CPI R24,0x28
00A2 E0E0 LDI R30,0
00A3 079E CPC R25,R30
00A4 F091 BEQ 0x00B7
00A5 E288 LDI R24,0x28
00A6 158A CP R24,R10
00A7 059B CPC R25,R11
00A8 F034 BLT 0x00AF
00A9 01C5 MOVW R24,R10
00AA 3188 CPI R24,0x18
00AB E0E0 LDI R30,0
00AC 079E CPC R25,R30
00AD F059 BEQ 0x00B9
00AE C00C RJMP 0x00BB
00AF 01C5 MOVW R24,R10
00B0 3380 CPI R24,0x30
00B1 E0E0 LDI R30,0
00B2 079E CPC R25,R30
00B3 F009 BEQ 0x00B5
00B4 C006 RJMP 0x00BB
(0048) {
(0049) case 0x30: key=0x04;
00B5 E044 LDI R20,4
(0050) break;
00B6 C005 RJMP 0x00BC
(0051) case 0x28: key=0x05;
00B7 E045 LDI R20,5
(0052) break;
00B8 C003 RJMP 0x00BC
(0053) case 0x18: key=0x06;
00B9 E046 LDI R20,6
(0054) break;
00BA C001 RJMP 0x00BC
(0055) default: key=0;
00BB 2744 CLR R20
(0056) break;
(0057) }
(0058) DDRC=0X38;
00BC E388 LDI R24,0x38
00BD BB84 OUT 0x14,R24
(0059) PORTC=0X07;
00BE E087 LDI R24,7
00BF BB85 OUT 0x15,R24
(0060) break;
00C0 C02A RJMP 0x00EB
(0061) case 0x03:
(0062) DDRC=0X07;
00C1 E087 LDI R24,7
00C2 BB84 OUT 0x14,R24
(0063) PORTC=0X38;
00C3 E388 LDI R24,0x38
00C4 BB85 OUT 0x15,R24
(0064) delay_us(1);
00C5 E001 LDI R16,1
00C6 E010 LDI R17,0
00C7 DF70 RCALL _delay_us
(0065) temp1=PINC;
00C8 B363 IN R22,0x13
(0066) temp1&=0x38;
00C9 7368 ANDI R22,0x38
(0067) switch(temp1)
00CA 2777 CLR R23
00CB 3268 CPI R22,0x28
00CC E0E0 LDI R30,0
00CD 077E CPC R23,R30
00CE F089 BEQ 0x00E0
00CF E288 LDI R24,0x28
00D0 E090 LDI R25,0
00D1 1786 CP R24,R22
00D2 0797 CPC R25,R23
00D3 F02C BLT 0x00D9
00D4 3168 CPI R22,0x18
00D5 E0E0 LDI R30,0
00D6 077E CPC R23,R30
00D7 F051 BEQ 0x00E2
00D8 C00B RJMP 0x00E4
00D9 3360 CPI R22,0x30
00DA E0E0 LDI R30,0
00DB 077E CPC R23,R30
00DC F009 BEQ 0x00DE
00DD C006 RJMP 0x00E4
(0068) {
(0069) case 0x30: key=0x07;
00DE E047 LDI R20,7
(0070) break;
00DF C005 RJMP 0x00E5
(0071) case 0x28: key=0x08;
00E0 E048 LDI R20,0x8
(0072) break;
00E1 C003 RJMP 0x00E5
(0073) case 0x18: key=0x09;
00E2 E049 LDI R20,0x9
(0074) break;
00E3 C001 RJMP 0x00E5
(0075) default: key=0;
00E4 2744 CLR R20
(0076) break;
(0077) }
(0078) DDRC=0X38;
00E5 E388 LDI R24,0x38
00E6 BB84 OUT 0x14,R24
(0079) PORTC=0X07;
00E7 E087 LDI R24,7
00E8 BB85 OUT 0x15,R24
(0080) break;
00E9 C001 RJMP 0x00EB
(0081) default:
(0082) key=0;
00EA 2744 CLR R20
(0083) break;
(0084) }
(0085) return (key);
00EB 2F04 MOV R16,R20
00EC D036 RCALL pop_gset3
00ED 9508 RET
_main:
num --> Y+0
keynum --> R20
temp --> R22
00EE 972A SBIW R28,0xA
(0086) }
(0087)
(0088) //主函数,扫描按键显示数据
(0089) void main()
(0090) {
(0091) unsigned char temp, keynum;
(0092) unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
00EF E286 LDI R24,0x26
00F0 E090 LDI R25,0
00F1 01FE MOVW R30,R28
00F2 E00A LDI R16,0xA
00F3 E010 LDI R17,0
00F4 93FA ST R31,-Y
00F5 93EA ST R30,-Y
00F6 939A ST R25,-Y
00F7 938A ST R24,-Y
00F8 D049 RCALL asgncblk
(0093) 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
(0094) //初始化端口
(0095) DDRB=0xFF; //设置B口为输出模式
00F9 EF8F LDI R24,0xFF
00FA BB87 OUT 0x17,R24
(0096) PORTB=0xFF; //置高电平
00FB BB88 OUT 0x18,R24
(0097) DDRC=0X38;
00FC E388 LDI R24,0x38
00FD BB84 OUT 0x14,R24
(0098) PORTC=0X07;
00FE E087 LDI R24,7
00FF BB85 OUT 0x15,R24
0100 C01D RJMP 0x011E
(0099)
(0100) while(1)
(0101) {
(0102) PORTB=0x40;
0101 E480 LDI R24,0x40
0102 BB88 OUT 0x18,R24
(0103) temp=PINC;
0103 B363 IN R22,0x13
(0104) temp&=0x7;
0104 7067 ANDI R22,7
(0105) if(temp==0x7)//检测是否有按键按下
0105 3067 CPI R22,7
0106 F409 BNE 0x0108
(0106) continue;
0107 C016 RJMP 0x011E
(0107) delay_ms(10);
0108 E00A LDI R16,0xA
0109 E010 LDI R17,0
010A DF41 RCALL _delay_ms
(0108) temp=PINC;
010B B363 IN R22,0x13
(0109) temp&=0x7;
010C 7067 ANDI R22,7
(0110) if(temp==0x7)//检测是否有按键按下
010D 3067 CPI R22,7
010E F409 BNE 0x0110
(0111) continue;
010F C00E RJMP 0x011E
(0112) keynum=ScanKey();
0110 DF48 RCALL _ScanKey
0111 2F40 MOV R20,R16
(0113) PORTB=num[keynum];
0112 01CE MOVW R24,R28
0113 2FE4 MOV R30,R20
0114 27FF CLR R31
0115 0FE8 ADD R30,R24
0116 1FF9 ADC R31,R25
0117 8020 LDD R2,Z+0
0118 BA28 OUT 0x18,R2
0119 C002 RJMP 0x011C
(0114) while(temp!=0x7)
(0115) {
(0116) temp=PINC;
011A B363 IN R22,0x13
(0117) temp&=0x7;
011B 7067 ANDI R22,7
011C 3067 CPI R22,7
011D F7E1 BNE 0x011A
011E CFE2 RJMP 0x0101
(0118) }
(0119) }
(0120) }
FILE: <library>
011F 962A ADIW R28,0xA
0120 9508 RET
pop_gset2:
0121 E0E2 LDI R30,2
0122 C006 RJMP pop
pop_gset3:
0123 E0E4 LDI R30,4
0124 C004 RJMP pop
push_gset1:
0125 935A ST R21,-Y
0126 934A ST R20,-Y
0127 9508 RET
pop_gset1:
0128 E0E1 LDI R30,1
pop:
0129 9149 LD R20,Y+
012A 9159 LD R21,Y+
012B FDE0 SBRC R30,0
012C 9508 RET
012D 9169 LD R22,Y+
012E 9179 LD R23,Y+
012F FDE1 SBRC R30,1
0130 9508 RET
0131 90A9 LD R10,Y+
0132 90B9 LD R11,Y+
0133 FDE2 SBRC R30,2
0134 9508 RET
0135 90C9 LD R12,Y+
0136 90D9 LD R13,Y+
0137 FDE3 SBRC R30,3
0138 9508 RET
0139 90E9 LD R14,Y+
013A 90F9 LD R15,Y+
013B 9508 RET
push_gset2:
013C 937A ST R23,-Y
013D 936A ST R22,-Y
013E CFE6 RJMP push_gset1
push_gset3:
013F 92BA ST R11,-Y
0140 92AA ST R10,-Y
0141 CFFA RJMP push_gset2
asgncblk:
0142 93AA ST R26,-Y
0143 93BA ST R27,-Y
0144 93EA ST R30,-Y
0145 93FA ST R31,-Y
0146 920A ST R0,-Y
0147 81AF LDD R26,Y+7
0148 85B8 LDD R27,Y+8
0149 81ED LDD R30,Y+5
014A 81FE LDD R31,Y+6
014B 3000 CPI R16,0
014C 0701 CPC R16,R17
014D F031 BEQ 0x0154
014E 95C8 LPM
014F 920D ST R0,X+
0150 9631 ADIW R30,1
0151 5001 SUBI R16,1
0152 4010 SBCI R17,0
0153 CFF7 RJMP 0x014B
0154 9009 LD R0,Y+
0155 91F9 LD R31,Y+
0156 91E9 LD R30,Y+
0157 91B9 LD R27,Y+
0158 91A9 LD R26,Y+
0159 9624 ADIW R28,4
015A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -