📄 lesson5.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 51C0 SUBI R28,0x10
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 00D6 CALL _main
_exit:
5D CFFF RJMP _exit
_delay:
i --> R20
j --> R22
ms --> R16
5E 940E 00E5 CALL push_xgsetF000
FILE: G:\学习\avr\天祥电子AVR视频教程\chengxu\lesson5\lesson5.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 00EA JMP pop_xgsetF000
_show:
k --> R10
j --> R12
73 92AA ST R10,-Y
74 92CA ST R12,-Y
75 2EA2 MOV R10,R18
76 2EC0 MOV R12,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 2DEC MOV R30,R12
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) PORTB&=~BIT(k);
86 E001 LDI R16,1
87 2D1A MOV R17,R10
88 940E 00EF CALL lsl8
8A 2E20 MOV R2,R16
8B 9420 COM R2
8C B238 IN R3,0x18
8D 2032 AND R3,R2
8E BA38 OUT 0x18,R3
(0023) PORTA|=BIT(4);
8F 9ADC SBI 0x1B,4
(0024) PORTA&=~BIT(4);
90 98DC CBI 0x1B,4
(0025) delay(1);
91 E001 LDI R16,1
92 E010 LDI R17,0
93 DFCA RCALL _delay
94 90C9 LD R12,Y+
95 90A9 LD R10,Y+
96 9508 RET
(0026) }
(0027)
(0028) uchar key_press()
(0029) {
(0030) uchar j;
(0031) DDRD|=0X0F;
_key_press:
j --> R16
97 B381 IN R24,0x11
98 608F ORI R24,0xF
99 BB81 OUT 0x11,R24
(0032) PORTD|=0X0F;
9A B382 IN R24,0x12
9B 608F ORI R24,0xF
9C BB82 OUT 0x12,R24
(0033)
(0034) DDRD&=0XF0;
9D B381 IN R24,0x11
9E 7F80 ANDI R24,0xF0
9F BB81 OUT 0x11,R24
(0035)
(0036) j=PIND;
A0 B300 IN R16,0x10
(0037) j=j&0X0F;//00001111
A1 700F ANDI R16,0xF
(0038) if(j==0X0F)
A2 300F CPI R16,0xF
A3 F411 BNE 0x00A6
(0039) {
(0040) return 0;
A4 2700 CLR R16
A5 C001 RJMP 0x00A7
(0041) }
(0042) else
(0043) {
(0044) return 1;
A6 E001 LDI R16,1
A7 9508 RET
_key_scan:
key --> R20
A8 940E 00E5 CALL push_xgsetF000
(0045) }
(0046)
(0047) }
(0048)
(0049) uchar key_scan()
(0050) {
(0051) uchar key;
(0052) delay(10);
AA E00A LDI R16,0xA
AB E010 LDI R17,0
AC DFB1 RCALL _delay
(0053) if(key_press())
AD DFE9 RCALL _key_press
AE 2300 TST R16
AF F111 BEQ 0x00D2
(0054) {
(0055) key=PIND;
B0 B340 IN R20,0x10
(0056) key&=0X0F;
B1 704F ANDI R20,0xF
(0057) switch(key)
B2 2F64 MOV R22,R20
B3 2777 CLR R23
B4 3067 CPI R22,7
B5 E0E0 LDI R30,0
B6 077E CPC R23,R30
B7 F099 BEQ 0x00CB
B8 306B CPI R22,0xB
B9 E0E0 LDI R30,0
BA 077E CPC R23,R30
BB F069 BEQ 0x00C9
BC 306D CPI R22,0xD
BD E0E0 LDI R30,0
BE 077E CPC R23,R30
BF F039 BEQ 0x00C7
C0 306E CPI R22,0xE
C1 E0E0 LDI R30,0
C2 077E CPC R23,R30
C3 F009 BEQ 0x00C5
C4 C008 RJMP 0x00CD
(0058) {
(0059) case 0X0E:
(0060) key=1;
C5 E041 LDI R20,1
(0061) break;
C6 C007 RJMP 0x00CE
(0062) case 0X0D:
(0063) key=2;
C7 E042 LDI R20,2
(0064) break;
C8 C005 RJMP 0x00CE
(0065) case 0X0B:
(0066) key=3;
C9 E043 LDI R20,3
(0067) break;
CA C003 RJMP 0x00CE
(0068) case 0X07:
(0069) key=4;
CB E044 LDI R20,4
(0070) break;
CC C001 RJMP 0x00CE
(0071) default:
(0072) key=16;
CD E140 LDI R20,0x10
(0073) }
(0074) while(key_press());
CE DFC8 RCALL _key_press
CF 2300 TST R16
D0 F7E9 BNE 0x00CE
(0075) }
D1 C001 RJMP 0x00D3
(0076) else
(0077) {
(0078) key=16;
D2 E140 LDI R20,0x10
(0079) }
(0080) return key;
D3 2F04 MOV R16,R20
D4 940C 00EA JMP pop_xgsetF000
(0081) }
(0082) void main()
(0083) {
(0084) uchar i,l;
(0085) DDRA=0X18;//0001 1000
_main:
l --> R10
i --> R10
D6 E188 LDI R24,0x18
D7 BB8A OUT 0x1A,R24
(0086) DDRB=0XFF;
D8 EF8F LDI R24,0xFF
D9 BB87 OUT 0x17,R24
DA C008 RJMP 0x00E3
(0087) while(1)
(0088) {
(0089) i=key_press();
DB DFBB RCALL _key_press
DC 2EA0 MOV R10,R16
(0090) if(i)
DD 2300 TST R16
DE F021 BEQ 0x00E3
(0091) {
(0092) l=key_scan();
DF DFC8 RCALL _key_scan
E0 2EA0 MOV R10,R16
(0093) show(l,0);
FILE: <library>
E1 2722 CLR R18
E2 DF90 RCALL _show
E3 CFF7 RJMP 0x00DB
E4 9508 RET
push_xgsetF000:
E5 937A ST R23,-Y
E6 936A ST R22,-Y
E7 935A ST R21,-Y
E8 934A ST R20,-Y
E9 9508 RET
pop_xgsetF000:
EA 9149 LD R20,Y+
EB 9159 LD R21,Y+
EC 9169 LD R22,Y+
ED 9179 LD R23,Y+
EE 9508 RET
lsl8:
EF 2311 TST R17
F0 F019 BEQ 0x00F4
F1 0F00 LSL R16
F2 951A DEC R17
F3 CFFB RJMP lsl8
F4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -