📄 mykey.lst
字号:
__start:
__text_start:
3B E5CF LDI R28,0x5F
3C E0D4 LDI R29,4
3D BFCD OUT 0x3D,R28
3E BFDE OUT 0x3E,R29
3F 51CE SUBI R28,0x1E
40 40D0 SBCI R29,0
41 EA0A LDI R16,0xAA
42 8308 STD Y+0,R16
43 2400 CLR R0
44 E6E0 LDI R30,0x60
45 E0F0 LDI R31,0
46 E010 LDI R17,0
47 36E0 CPI R30,0x60
48 07F1 CPC R31,R17
49 F011 BEQ 0x004C
4A 9201 ST R0,Z+
4B CFFB RJMP 0x0047
4C 8300 STD Z+0,R16
4D E7E6 LDI R30,0x76
4E E0F0 LDI R31,0
4F E6A0 LDI R26,0x60
50 E0B0 LDI R27,0
51 E010 LDI R17,0
52 E000 LDI R16,0
53 BF0B OUT 0x3B,R16
54 37E6 CPI R30,0x76
55 07F1 CPC R31,R17
56 F021 BEQ 0x005B
57 95C8 LPM
58 9631 ADIW R30,1
59 920D ST R0,X+
5A CFF9 RJMP 0x0054
5B 940E 0117 CALL _main
_exit:
5D CFFF RJMP _exit
_delay:
i --> R20
j --> R22
ms --> R16
5E 940E 0127 CALL push_xgsetF000
FILE: G:\学习\avr\天祥电子AVR视频教程\chengxu\mykey\mykey.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,0};
(0008) void delay(uint ms)
(0009) {
(0010) uint i,j;
(0011) for(i=0;i<ms;i++)
60 2744 CLR R20
61 2755 CLR R21
62 C00B RJMP 0x006E
(0012) {
(0013) for(j=0;j<1141;j++);
63 2766 CLR R22
64 2777 CLR R23
65 C002 RJMP 0x0068
66 5F6F SUBI R22,0xFF
67 4F7F SBCI R23,0xFF
68 3765 CPI R22,0x75
69 E0E4 LDI R30,4
6A 077E CPC R23,R30
6B F3D0 BCS 0x0066
6C 5F4F SUBI R20,0xFF
6D 4F5F SBCI R21,0xFF
6E 1740 CP R20,R16
6F 0751 CPC R21,R17
70 F390 BCS 0x0063
71 940C 012C JMP pop_xgsetF000
_show:
k --> R22
j --> R20
73 934A ST R20,-Y
74 936A ST R22,-Y
75 2F62 MOV R22,R18
76 2F40 MOV R20,R16
(0014) }
(0015) }
(0016) void show(uchar j,uchar k)
(0017) {
(0018) PORTA|=BIT(3);
77 9ADB SBI 0x1B,3
(0019) PORTB=table[j];
78 E584 LDI R24,0x54
79 E090 LDI R25,0
7A 2FE4 MOV R30,R20
7B 27FF CLR R31
7C 0FEE LSL R30
7D 1FFF ROL R31
7E 0FE8 ADD R30,R24
7F 1FF9 ADC R31,R25
80 9025 LPM R2,Z+
81 9034 LPM R3,0(Z)
82 BA28 OUT 0x18,R2
(0020) PORTA&=~BIT(3);
83 98DB CBI 0x1B,3
(0021) PORTB=0XFF;
84 EF8F LDI R24,0xFF
85 BB88 OUT 0x18,R24
(0022) PORTA|=BIT(4);
86 9ADC SBI 0x1B,4
(0023) if(j==1)
87 3041 CPI R20,1
88 F499 BNE 0x009C
(0024) for(k=5;k>0;k--)
89 E065 LDI R22,5
8A C00D RJMP 0x0098
(0025) {
(0026)
(0027) PORTB&=~BIT(k);
8B E001 LDI R16,1
8C 2F16 MOV R17,R22
8D 940E 0131 CALL lsl8
8F 2E20 MOV R2,R16
90 9420 COM R2
91 B238 IN R3,0x18
92 2032 AND R3,R2
93 BA38 OUT 0x18,R3
(0028) delay(300);
94 E20C LDI R16,0x2C
95 E011 LDI R17,1
96 DFC7 RCALL _delay
97 956A DEC R22
98 E080 LDI R24,0
99 1786 CP R24,R22
9A F380 BCS 0x008B
9B C02C RJMP 0x00C8
(0029) }
(0030) else if(j==2)
9C 3042 CPI R20,2
9D F491 BNE 0x00B0
(0031) for(k=1;k<6;k++)
9E E061 LDI R22,1
9F C00D RJMP 0x00AD
(0032) {
(0033)
(0034) PORTB&=~BIT(k);
A0 E001 LDI R16,1
A1 2F16 MOV R17,R22
A2 940E 0131 CALL lsl8
A4 2E20 MOV R2,R16
A5 9420 COM R2
A6 B238 IN R3,0x18
A7 2032 AND R3,R2
A8 BA38 OUT 0x18,R3
(0035) delay(300);
A9 E20C LDI R16,0x2C
AA E011 LDI R17,1
AB DFB2 RCALL _delay
AC 9563 INC R22
AD 3066 CPI R22,6
AE F388 BCS 0x00A0
AF C018 RJMP 0x00C8
(0036) }
(0037) else if(j==3)
B0 3043 CPI R20,3
B1 F4B1 BNE 0x00C8
(0038) for(k=1;k<6;k++)
B2 E061 LDI R22,1
B3 C012 RJMP 0x00C6
(0039) {
(0040)
(0041) PORTB&=~BIT(j);
B4 E001 LDI R16,1
B5 2F14 MOV R17,R20
B6 940E 0131 CALL lsl8
B8 2E20 MOV R2,R16
B9 9420 COM R2
BA B238 IN R3,0x18
BB 2032 AND R3,R2
BC BA38 OUT 0x18,R3
(0042) delay(300);
BD E20C LDI R16,0x2C
BE E011 LDI R17,1
BF DF9E RCALL _delay
(0043) PORTB=0xff;
C0 EF8F LDI R24,0xFF
C1 BB88 OUT 0x18,R24
(0044) delay(200);
C2 EC08 LDI R16,0xC8
C3 E010 LDI R17,0
C4 DF99 RCALL _delay
C5 9563 INC R22
C6 3066 CPI R22,6
C7 F360 BCS 0x00B4
(0045) }
(0046)
(0047) PORTB=0XFF;
C8 EF8F LDI R24,0xFF
C9 BB88 OUT 0x18,R24
(0048) PORTB=~BIT(j);
CA E001 LDI R16,1
CB 2F14 MOV R17,R20
CC 940E 0131 CALL lsl8
CE 2E20 MOV R2,R16
CF 9420 COM R2
D0 BA28 OUT 0x18,R2
(0049) PORTA&=~BIT(4);
D1 98DC CBI 0x1B,4
(0050) delay(1);
D2 E001 LDI R16,1
D3 E010 LDI R17,0
D4 DF89 RCALL _delay
D5 9169 LD R22,Y+
D6 9149 LD R20,Y+
D7 9508 RET
(0051) }
(0052)
(0053) uchar key_press()
(0054) {
(0055) uchar j;
(0056) DDRD|=0X0F;
_key_press:
j --> R16
D8 B381 IN R24,0x11
D9 608F ORI R24,0xF
DA BB81 OUT 0x11,R24
(0057) PORTD|=0X0F;
DB B382 IN R24,0x12
DC 608F ORI R24,0xF
DD BB82 OUT 0x12,R24
(0058)
(0059) DDRD&=0XF0;
DE B381 IN R24,0x11
DF 7F80 ANDI R24,0xF0
E0 BB81 OUT 0x11,R24
(0060)
(0061) j=PIND;
E1 B300 IN R16,0x10
(0062) j=j&0X0F;//00001111
E2 700F ANDI R16,0xF
(0063) if(j==0X0F)
E3 300F CPI R16,0xF
E4 F411 BNE 0x00E7
(0064) {
(0065) return 0;
E5 2700 CLR R16
E6 C001 RJMP 0x00E8
(0066) }
(0067) else
(0068) {
(0069) return 1;
E7 E001 LDI R16,1
E8 9508 RET
_key_scan:
key --> R20
E9 940E 0127 CALL push_xgsetF000
(0070) }
(0071)
(0072) }
(0073)
(0074) uchar key_scan()
(0075) {
(0076) uchar key;
(0077) delay(10);
EB E00A LDI R16,0xA
EC E010 LDI R17,0
ED DF70 RCALL _delay
(0078) if(key_press())
EE DFE9 RCALL _key_press
EF 2300 TST R16
F0 F111 BEQ 0x0113
(0079) {
(0080) key=PIND;
F1 B340 IN R20,0x10
(0081) key&=0X0F;
F2 704F ANDI R20,0xF
(0082) switch(key)
F3 2F64 MOV R22,R20
F4 2777 CLR R23
F5 3067 CPI R22,7
F6 E0E0 LDI R30,0
F7 077E CPC R23,R30
F8 F099 BEQ 0x010C
F9 306B CPI R22,0xB
FA E0E0 LDI R30,0
FB 077E CPC R23,R30
FC F069 BEQ 0x010A
FD 306D CPI R22,0xD
FE E0E0 LDI R30,0
FF 077E CPC R23,R30
100 F039 BEQ 0x0108
101 306E CPI R22,0xE
102 E0E0 LDI R30,0
103 077E CPC R23,R30
104 F009 BEQ 0x0106
105 C008 RJMP 0x010E
(0083) {
(0084) case 0X0E:
(0085) key=1;
106 E041 LDI R20,1
(0086) break;
107 C007 RJMP 0x010F
(0087) case 0X0D:
(0088) key=2;
108 E042 LDI R20,2
(0089) break;
109 C005 RJMP 0x010F
(0090) case 0X0B:
(0091) key=3;
10A E043 LDI R20,3
(0092) break;
10B C003 RJMP 0x010F
(0093) case 0X07:
(0094) key=4;
10C E044 LDI R20,4
(0095) break;
10D C001 RJMP 0x010F
(0096) default:
(0097) key=16;
10E E140 LDI R20,0x10
(0098) }
(0099) while(key_press());
10F DFC8 RCALL _key_press
110 2300 TST R16
111 F7E9 BNE 0x010F
(0100) }
112 C001 RJMP 0x0114
(0101) else
(0102) {
(0103) key=16;
113 E140 LDI R20,0x10
(0104) }
(0105) return key;
114 2F04 MOV R16,R20
115 940C 012C JMP pop_xgsetF000
(0106) }
(0107) void main()
(0108) {
(0109) uchar i,l;
(0110) DDRA=0X18;//0001 1000
_main:
l --> R20
i --> R10
117 E188 LDI R24,0x18
118 BB8A OUT 0x1A,R24
(0111) DDRB=0XFF;
119 EF8F LDI R24,0xFF
11A BB87 OUT 0x17,R24
11B C009 RJMP 0x0125
(0112) while(1)
(0113) {
(0114) i=key_press();
11C DFBB RCALL _key_press
11D 2EA0 MOV R10,R16
(0115) if(i)
11E 2300 TST R16
11F F029 BEQ 0x0125
(0116) {
(0117) l=key_scan();
120 DFC8 RCALL _key_scan
121 2F40 MOV R20,R16
(0118) show(l-1,0);
FILE: <library>
122 2722 CLR R18
123 5001 SUBI R16,1
124 DF4E RCALL _show
125 CFF6 RJMP 0x011C
126 9508 RET
push_xgsetF000:
127 937A ST R23,-Y
128 936A ST R22,-Y
129 935A ST R21,-Y
12A 934A ST R20,-Y
12B 9508 RET
pop_xgsetF000:
12C 9149 LD R20,Y+
12D 9159 LD R21,Y+
12E 9169 LD R22,Y+
12F 9179 LD R23,Y+
130 9508 RET
lsl8:
131 2311 TST R17
132 F019 BEQ 0x0136
133 0F00 LSL R16
134 951A DEC R17
135 CFFB RJMP lsl8
136 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -