📄 mkey.lst
字号:
__start:
__text_start:
0011 E5CF LDI R28,0x5F
0012 E0D2 LDI R29,2
0013 BFCD OUT P3D,R28
0014 BFDE OUT P3E,R29
0015 51C0 SUBI R28,0x10
0016 40D0 SBCI R29,0
0017 EA0A LDI R16,0xAA
0018 8308 STD R16,0+Y
0019 2400 CLR R0
001A E6E0 LDI R30,0x60
001B E0F0 LDI R31,0
001C E010 LDI R17,0
001D 36E0 CPI R30,0x60
001E 07F1 CPC R31,R17
001F F011 BEQ 0x0022
0020 9201 ST R0,Z+
0021 CFFB RJMP 0x001D
0022 8300 STD R16,0+Z
0023 E2E2 LDI R30,0x22
0024 E0F0 LDI R31,0
0025 E6A0 LDI R26,0x60
0026 E0B0 LDI R27,0
0027 E010 LDI R17,0
0028 32E2 CPI R30,0x22
0029 07F1 CPC R31,R17
002A F021 BEQ 0x002F
002B 95C8 LPM
002C 9631 ADIW R30,1
002D 920D ST R0,X+
002E CFF9 RJMP 0x0028
002F D0E3 RCALL _main
_exit:
0030 CFFF RJMP _exit
_delay:
i --> R20
j --> R22
ms --> R16
0031 D107 RCALL push_gset2
FILE: I:\AVR视频教程\视频教程\lesson5\mkey\mkey.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #pragma data:code
(0006) const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0007) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
(0008) void delay(uint ms)
(0009) {
(0010) uint i,j;
(0011) for(i=0;i<ms;i++)
0032 2744 CLR R20
0033 2755 CLR R21
0034 C00B RJMP 0x0040
(0012) {
(0013) for(j=0;j<1141;j++);
0035 2766 CLR R22
0036 2777 CLR R23
0037 C002 RJMP 0x003A
0038 5F6F SUBI R22,0xFF
0039 4F7F SBCI R23,0xFF
003A 3765 CPI R22,0x75
003B E0E4 LDI R30,4
003C 077E CPC R23,R30
003D F3D0 BCS 0x0038
003E 5F4F SUBI R20,0xFF
003F 4F5F SBCI R21,0xFF
0040 1740 CP R20,R16
0041 0751 CPC R21,R17
0042 F390 BCS 0x0035
(0014) }
(0015) }
0043 D0FB RCALL pop_gset2
0044 9508 RET
_show:
k --> R20
j --> R22
0045 D0F3 RCALL push_gset2
0046 2F42 MOV R20,R18
0047 2F60 MOV R22,R16
(0016) void show(uchar j,uchar k)
(0017) {
(0018) PORTA|=BIT(3);
0048 9ADB SBI P1B,3
(0019) PORTB=table[j];
0049 E080 LDI R24,0
004A E090 LDI R25,0
004B 2F06 MOV R16,R22
004C 2711 CLR R17
004D 0F00 LSL R16
004E 1F11 ROL R17
004F 0F08 ADD R16,R24
0050 1F19 ADC R17,R25
0051 D0F1 RCALL lpm16
0052 BB08 OUT P18,R16
(0020) PORTA&=~BIT(3);
0053 98DB CBI P1B,3
(0021)
(0022) PORTB=0XFF;
0054 EF8F LDI R24,0xFF
0055 BB88 OUT P18,R24
(0023) PORTB&=~BIT(k);
0056 E001 LDI R16,1
0057 2F14 MOV R17,R20
0058 D0F8 RCALL lsl8
0059 2E20 MOV R2,R16
005A 9420 COM R2
005B B238 IN R3,P18
005C 2032 AND R3,R2
005D BA38 OUT P18,R3
(0024) PORTA|=BIT(4);
005E 9ADC SBI P1B,4
(0025) PORTA&=~BIT(4);
005F 98DC CBI P1B,4
(0026) delay(1);
0060 E001 LDI R16,1
0061 E010 LDI R17,0
0062 DFCE RCALL _delay
(0027) }
0063 D0DB RCALL pop_gset2
0064 9508 RET
(0028) uchar key_press()
(0029) {
(0030) uchar i;
(0031) DDRD=0XFF;
_key_press:
i --> R16
0065 EF8F LDI R24,0xFF
0066 BB81 OUT P11,R24
(0032) PORTD=0XF0;
0067 EF80 LDI R24,0xF0
0068 BB82 OUT P12,R24
(0033)
(0034) DDRD=0X0F;
0069 E08F LDI R24,0xF
006A BB81 OUT P11,R24
(0035)
(0036) i=PIND;
006B B300 IN R16,P10
(0037) if(i==0XF0)
006C 3F00 CPI R16,0xF0
006D F421 BNE 0x0072
(0038) {
(0039) DDRD=0XFF;
006E EF8F LDI R24,0xFF
006F BB81 OUT P11,R24
(0040) return 0;
0070 2700 CLR R16
0071 C003 RJMP 0x0075
(0041) }
(0042) else
(0043) {
(0044) DDRD=0XFF;
0072 EF8F LDI R24,0xFF
0073 BB81 OUT P11,R24
(0045) return 1;
0074 E001 LDI R16,1
0075 9508 RET
_key_scan:
j --> R22
key --> R20
i --> R10
0076 D0C5 RCALL push_gset3
(0046) }
(0047) }
(0048)
(0049) uchar key_scan()
(0050) {
(0051) uchar key,i=0X7F,j;
0077 E78F LDI R24,0x7F
0078 2EA8 MOV R10,R24
(0052) delay(10);
0079 E00A LDI R16,0xA
007A E010 LDI R17,0
007B DFB5 RCALL _delay
(0053) if(key_press())
007C DFE8 RCALL _key_press
007D 2300 TST R16
007E F409 BNE 0x0080
007F C08F RJMP 0x010F
(0054) {
(0055) do
(0056) {
(0057) i=(i<<1|i>>7);
0080 2C2A MOV R2,R10
0081 9426 LSR R2
0082 9426 LSR R2
0083 9426 LSR R2
0084 9426 LSR R2
0085 9426 LSR R2
0086 9426 LSR R2
0087 9426 LSR R2
0088 2C3A MOV R3,R10
0089 0C33 LSL R3
008A 2832 OR R3,R2
008B 2CA3 MOV R10,R3
(0058) PORTD=i;
008C BA32 OUT P12,R3
(0059) DDRD=0X0F;
008D E08F LDI R24,0xF
008E BB81 OUT P11,R24
(0060)
(0061) key=PIND;
008F B340 IN R20,P10
(0062) j=key&0XF0;
0090 2F64 MOV R22,R20
0091 7F60 ANDI R22,0xF0
(0063)
(0064) }while(j==0XF0);
0092 3F60 CPI R22,0xF0
0093 F361 BEQ 0x0080
(0065)
(0066) while(key_press());
0094 DFD0 RCALL _key_press
0095 2300 TST R16
0096 F7E9 BNE 0x0094
(0067) switch(key)
0097 2F64 MOV R22,R20
0098 2777 CLR R23
0099 3B67 CPI R22,0xB7
009A E0E0 LDI R30,0
009B 077E CPC R23,R30
009C F409 BNE 0x009E
009D C06B RJMP 0x0109
009E 3B6B CPI R22,0xBB
009F E0E0 LDI R30,0
00A0 077E CPC R23,R30
00A1 F409 BNE 0x00A3
00A2 C05E RJMP 0x0101
00A3 3B6D CPI R22,0xBD
00A4 E0E0 LDI R30,0
00A5 077E CPC R23,R30
00A6 F409 BNE 0x00A8
00A7 C051 RJMP 0x00F9
00A8 3B6E CPI R22,0xBE
00A9 E0E0 LDI R30,0
00AA 077E CPC R23,R30
00AB F409 BNE 0x00AD
00AC C044 RJMP 0x00F1
00AD EB8E LDI R24,0xBE
00AE E090 LDI R25,0
00AF 1786 CP R24,R22
00B0 0797 CPC R25,R23
00B1 F0A4 BLT 0x00C6
00B2 3767 CPI R22,0x77
00B3 E0E0 LDI R30,0
00B4 077E CPC R23,R30
00B5 F409 BNE 0x00B7
00B6 C054 RJMP 0x010B
00B7 376B CPI R22,0x7B
00B8 E0E0 LDI R30,0
00B9 077E CPC R23,R30
00BA F409 BNE 0x00BC
00BB C047 RJMP 0x0103
00BC 376D CPI R22,0x7D
00BD E0E0 LDI R30,0
00BE 077E CPC R23,R30
00BF F409 BNE 0x00C1
00C0 C03A RJMP 0x00FB
00C1 376E CPI R22,0x7E
00C2 E0E0 LDI R30,0
00C3 077E CPC R23,R30
00C4 F171 BEQ 0x00F3
00C5 C047 RJMP 0x010D
00C6 3D67 CPI R22,0xD7
00C7 E0E0 LDI R30,0
00C8 077E CPC R23,R30
00C9 F409 BNE 0x00CB
00CA C03C RJMP 0x0107
00CB 3D6B CPI R22,0xDB
00CC E0E0 LDI R30,0
00CD 077E CPC R23,R30
00CE F181 BEQ 0x00FF
00CF 3D6D CPI R22,0xDD
00D0 E0E0 LDI R30,0
00D1 077E CPC R23,R30
00D2 F121 BEQ 0x00F7
00D3 3D6E CPI R22,0xDE
00D4 E0E0 LDI R30,0
00D5 077E CPC R23,R30
00D6 F0C1 BEQ 0x00EF
00D7 3D67 CPI R22,0xD7
00D8 E0E0 LDI R30,0
00D9 077E CPC R23,R30
00DA F40C BGE 0x00DC
00DB C031 RJMP 0x010D
00DC 3E67 CPI R22,0xE7
00DD E0E0 LDI R30,0
00DE 077E CPC R23,R30
00DF F129 BEQ 0x0105
00E0 3E6B CPI R22,0xEB
00E1 E0E0 LDI R30,0
00E2 077E CPC R23,R30
00E3 F0C9 BEQ 0x00FD
00E4 3E6D CPI R22,0xED
00E5 E0E0 LDI R30,0
00E6 077E CPC R23,R30
00E7 F069 BEQ 0x00F5
00E8 3E6E CPI R22,0xEE
00E9 E0E0 LDI R30,0
00EA 077E CPC R23,R30
00EB F009 BEQ 0x00ED
00EC C020 RJMP 0x010D
(0068) {
(0069) case 0xEE:
(0070) key=0x0;
00ED 2744 CLR R20
(0071) break;
00EE C021 RJMP 0x0110
(0072) case 0xDE:
(0073) key=0x1;
00EF E041 LDI R20,1
(0074) break;
00F0 C01F RJMP 0x0110
(0075) case 0xBE:
(0076) key=0x2;
00F1 E042 LDI R20,2
(0077) break;
00F2 C01D RJMP 0x0110
(0078) case 0x7E:
(0079) key=0x3;
00F3 E043 LDI R20,3
(0080) break;
00F4 C01B RJMP 0x0110
(0081) case 0xED:
(0082) key=0x4;
00F5 E044 LDI R20,4
(0083) break;
00F6 C019 RJMP 0x0110
(0084) case 0xDD:
(0085) key=0x5;
00F7 E045 LDI R20,5
(0086) break;
00F8 C017 RJMP 0x0110
(0087) case 0xBD:
(0088) key=0x6;
00F9 E046 LDI R20,6
(0089) break;
00FA C015 RJMP 0x0110
(0090) case 0x7D:
(0091) key=0x7;
00FB E047 LDI R20,7
(0092) break;
00FC C013 RJMP 0x0110
(0093) case 0xEB:
(0094) key=0x8;
00FD E048 LDI R20,0x8
(0095) break;
00FE C011 RJMP 0x0110
(0096) case 0xDB:
(0097) key=0x9;
00FF E049 LDI R20,0x9
(0098) break;
0100 C00F RJMP 0x0110
(0099) case 0xBB:
(0100) key=0xA;
0101 E04A LDI R20,0xA
(0101) break;
0102 C00D RJMP 0x0110
(0102) case 0x7B:
(0103) key=0xB;
0103 E04B LDI R20,0xB
(0104) break;
0104 C00B RJMP 0x0110
(0105) case 0xE7:
(0106) key=0xC;
0105 E04C LDI R20,0xC
(0107) break;
0106 C009 RJMP 0x0110
(0108) case 0xD7:
(0109) key=0xD;
0107 E04D LDI R20,0xD
(0110) break;
0108 C007 RJMP 0x0110
(0111) case 0xB7:
(0112) key=0xE;
0109 E04E LDI R20,0xE
(0113) break;
010A C005 RJMP 0x0110
(0114) case 0x77:
(0115) key=0xF;
010B E04F LDI R20,0xF
(0116) break;
010C C003 RJMP 0x0110
(0117) default:
(0118) key=16;
010D E140 LDI R20,0x10
(0119) }
(0120) }
010E C001 RJMP 0x0110
(0121) else
(0122) {
(0123) key=16;
010F E140 LDI R20,0x10
(0124) }
(0125) return key;
0110 2F04 MOV R16,R20
0111 D02F RCALL pop_gset3
0112 9508 RET
(0126) }
(0127) void main()
(0128) {
(0129) uchar l;
(0130) DDRA|=0X18;// 0001 1000
_main:
l --> R20
0113 B38A IN R24,P1A
0114 6188 ORI R24,0x18
0115 BB8A OUT P1A,R24
(0131) DDRB=0XFF;
0116 EF8F LDI R24,0xFF
0117 BB87 OUT P17,R24
0118 C007 RJMP 0x0120
(0132) while(1)
(0133) {
(0134) if(key_press())
0119 DF4B RCALL _key_press
011A 2300 TST R16
011B F021 BEQ 0x0120
(0135) {
(0136) l=key_scan();
011C DF59 RCALL _key_scan
011D 2F40 MOV R20,R16
(0137) show(l,0);
011E 2722 CLR R18
011F DF25 RCALL _show
0120 CFF8 RJMP 0x0119
(0138) }
(0139) }
(0140)
(0141) }FILE: <library>
0121 9508 RET
push_gset1:
0122 935A ST R21,-Y
0123 934A ST R20,-Y
0124 9508 RET
pop_gset1:
0125 E0E1 LDI R30,1
pop:
0126 9149 LD R20,Y+
0127 9159 LD R21,Y+
0128 FDE0 SBRC R30,0
0129 9508 RET
012A 9169 LD R22,Y+
012B 9179 LD R23,Y+
012C FDE1 SBRC R30,1
012D 9508 RET
012E 90A9 LD R10,Y+
012F 90B9 LD R11,Y+
0130 FDE2 SBRC R30,2
0131 9508 RET
0132 90C9 LD R12,Y+
0133 90D9 LD R13,Y+
0134 FDE3 SBRC R30,3
0135 9508 RET
0136 90E9 LD R14,Y+
0137 90F9 LD R15,Y+
0138 9508 RET
push_gset2:
0139 937A ST R23,-Y
013A 936A ST R22,-Y
013B CFE6 RJMP push_gset1
push_gset3:
013C 92BA ST R11,-Y
013D 92AA ST R10,-Y
013E CFFA RJMP push_gset2
pop_gset2:
013F E0E2 LDI R30,2
0140 CFE5 RJMP pop
pop_gset3:
0141 E0E4 LDI R30,4
0142 CFE3 RJMP pop
lpm16:
0143 93EA ST R30,-Y
0144 93FA ST R31,-Y
0145 920A ST R0,-Y
0146 2FE0 MOV R30,R16
0147 2FF1 MOV R31,R17
0148 95C8 LPM
0149 2D00 MOV R16,R0
014A 9631 ADIW R30,1
014B 95C8 LPM
014C 2D10 MOV R17,R0
014D 9009 LD R0,Y+
014E 91F9 LD R31,Y+
014F 91E9 LD R30,Y+
0150 9508 RET
lsl8:
0151 2311 TST R17
0152 F019 BEQ 0x0156
0153 0F00 LSL R16
0154 951A DEC R17
0155 CFFB RJMP lsl8
0156 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -