📄 ad.lst
字号:
__text_start:
__start:
2A E5CF LDI R28,0x5F
2B E0D4 LDI R29,4
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51CE SUBI R28,0x1E
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 36E0 CPI R30,0x60
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A 940E 01A5 CALL _main
_exit:
4C CFFF RJMP _exit
_SEND:
i --> R10
x --> Y,+0
j --> R14
ads --> R12
dat --> R18
add --> Y,+7
4D 940E 01C4 CALL push_arg4
4F 940E 0223 CALL push_xgset00FC
51 9721 SBIW R28,1
FILE: D:\MYDOCU~1\MYMCUW~1\AVR\AD\display.c
(0001) #include "display.h"
(0002) //===================MAX7219的核心函数,接收单片机的数据=====================
(0003) void SEND(unsigned char add,unsigned char dat)//发送2个字节的子函数,第一个字节为地址,第二个字节为操作数
(0004) {
(0005) unsigned char ads,j,x;
(0006) unsigned int i;
(0007) i=0;
52 24AA CLR R10
53 24BB CLR R11
(0008) MAX7219_LOAD_0;//load=0
54 98C4 CBI 0x18,4
55 C01E RJMP 0x0074
(0009) while(i<16)
(0010) {
(0011) if (i<8){ads=add;}
56 01C5 MOVW R24,R10
57 3088 CPI R24,0x8
58 E0E0 LDI R30,0
59 079E CPC R25,R30
5A F410 BCC 0x005D
5B 80CF LDD R12,Y+7
5C C001 RJMP 0x005E
(0012) else {ads=dat;}
5D 2EC2 MOV R12,R18
(0013) for(j=8;j>=1;j--)
5E E088 LDI R24,0x8
5F 2EE8 MOV R14,R24
60 C00D RJMP 0x006E
(0014) {
(0015) x=ads&0x80;
61 2D8C MOV R24,R12
62 7880 ANDI R24,0x80
63 8388 STD Y+0,R24
(0016) if (x==0){MAX7219_DIN_0;}
64 2E08 MOV R0,R24
65 2388 TST R24
66 F411 BNE 0x0069
67 98C5 CBI 0x18,5
68 C001 RJMP 0x006A
(0017) else {MAX7219_DIN_1;}
69 9AC5 SBI 0x18,5
(0018) ads=ads<<1;
6A 0CCC LSL R12
(0019) MAX7219_CLK_1;//clk=1
6B 9AC7 SBI 0x18,7
(0020) MAX7219_CLK_0;//clk=0
6C 98C7 CBI 0x18,7
6D 94EA DEC R14
6E 2D8E MOV R24,R14
6F 3081 CPI R24,1
70 F780 BCC 0x0061
(0021) }
(0022) i=i+8;
71 01C5 MOVW R24,R10
72 9608 ADIW R24,0x8
73 015C MOVW R10,R24
74 01C5 MOVW R24,R10
75 3180 CPI R24,0x10
76 E0E0 LDI R30,0
77 079E CPC R25,R30
78 F2E8 BCS 0x0056
(0023) }
(0024) MAX7219_LOAD_1;//load=1
79 9AC4 SBI 0x18,4
7A 9621 ADIW R28,1
7B 940E 0218 CALL pop_xgset00FC
7D 9624 ADIW R28,4
7E 9508 RET
_SEG_LIGHT:
light --> R10
7F 92AA ST R10,-Y
80 0158 MOVW R10,R16
(0025) }
(0026) //=====================================
(0027)
(0028) //==============SEG亮度================
(0029) void SEG_LIGHT(unsigned light)
(0030) {
(0031) SEND(0x0a,light&0x0f);
81 2D2A MOV R18,R10
82 702F ANDI R18,0xF
83 7030 ANDI R19,0
84 E00A LDI R16,0xA
85 DFC7 RCALL _SEND
86 90A9 LD R10,Y+
87 9508 RET
(0032) }
(0033) //===================================
(0034)
(0035) //==============SEG开================
(0036) void SEG_OPEN(void)
(0037) {
(0038) SEND(0x0c,0x01);
_SEG_OPEN:
88 E021 LDI R18,1
89 E00C LDI R16,0xC
8A DFC2 RCALL _SEND
8B 9508 RET
(0039) }
(0040) //===================================
(0041)
(0042) //==============SEG关================
(0043) void SEG_CLOSE(void)
(0044) {
(0045) SEND(0x0c,0x00);
_SEG_CLOSE:
8C 2722 CLR R18
8D E00C LDI R16,0xC
8E DFBE RCALL _SEND
8F 9508 RET
_SEG_CLEAR:
part --> R10
90 92AA ST R10,-Y
91 92BA ST R11,-Y
92 2EA0 MOV R10,R16
(0046) }
(0047) //===================================
(0048)
(0049) //==============SEG清屏==============
(0050) void SEG_CLEAR(unsigned char part)
(0051) {
(0052) switch(part)
93 24BB CLR R11
94 20AA TST R10
95 F411 BNE 0x0098
96 20BB TST R11
97 F031 BEQ 0x009E
98 01C5 MOVW R24,R10
99 3081 CPI R24,1
9A E0E0 LDI R30,0
9B 079E CPC R25,R30
9C F071 BEQ 0x00AB
9D C01A RJMP 0x00B8
(0053) {
(0054) case 0://左
(0055) {
(0056) SEND(0x01,0x0f);
9E E02F LDI R18,0xF
9F E001 LDI R16,1
A0 DFAC RCALL _SEND
(0057) SEND(0x02,0x0f);
A1 E02F LDI R18,0xF
A2 E002 LDI R16,2
A3 DFA9 RCALL _SEND
(0058) SEND(0x03,0x0f);
A4 E02F LDI R18,0xF
A5 E003 LDI R16,3
A6 DFA6 RCALL _SEND
(0059) SEND(0x04,0x0f);
A7 E02F LDI R18,0xF
A8 E004 LDI R16,4
A9 DFA3 RCALL _SEND
(0060) }break;
AA C025 RJMP 0x00D0
(0061) case 1://右
(0062) {
(0063) SEND(0x05,0x0f);
AB E02F LDI R18,0xF
AC E005 LDI R16,5
AD DF9F RCALL _SEND
(0064) SEND(0x06,0x0f);
AE E02F LDI R18,0xF
AF E006 LDI R16,6
B0 DF9C RCALL _SEND
(0065) SEND(0x07,0x0f);
B1 E02F LDI R18,0xF
B2 E007 LDI R16,7
B3 DF99 RCALL _SEND
(0066) SEND(0x08,0x0f);
B4 E02F LDI R18,0xF
B5 E008 LDI R16,0x8
B6 DF96 RCALL _SEND
(0067) }break;
B7 C018 RJMP 0x00D0
(0068) default://全部
(0069) {
(0070) SEND(0x01,0x0f);
B8 E02F LDI R18,0xF
B9 E001 LDI R16,1
BA DF92 RCALL _SEND
(0071) SEND(0x02,0x0f);
BB E02F LDI R18,0xF
BC E002 LDI R16,2
BD DF8F RCALL _SEND
(0072) SEND(0x03,0x0f);
BE E02F LDI R18,0xF
BF E003 LDI R16,3
C0 DF8C RCALL _SEND
(0073) SEND(0x04,0x0f);
C1 E02F LDI R18,0xF
C2 E004 LDI R16,4
C3 DF89 RCALL _SEND
(0074) SEND(0x05,0x0f);
C4 E02F LDI R18,0xF
C5 E005 LDI R16,5
C6 DF86 RCALL _SEND
(0075) SEND(0x06,0x0f);
C7 E02F LDI R18,0xF
C8 E006 LDI R16,6
C9 DF83 RCALL _SEND
(0076) SEND(0x07,0x0f);
CA E02F LDI R18,0xF
CB E007 LDI R16,7
CC DF80 RCALL _SEND
(0077) SEND(0x08,0x0f);
CD E02F LDI R18,0xF
CE E008 LDI R16,0x8
CF DF7D RCALL _SEND
(0078) }break;
D0 90B9 LD R11,Y+
D1 90A9 LD R10,Y+
D2 9508 RET
(0079) }
(0080) }
(0081)
(0082) //==============SEG初始化=============
(0083) void SEG_INIT(void)
(0084) {
(0085) MAX7219_OUT_DDR|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT);
_SEG_INIT:
D3 B387 IN R24,0x17
D4 6B80 ORI R24,0xB0
D5 BB87 OUT 0x17,R24
(0086) MAX7219_OUT_PORT|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT);
D6 B388 IN R24,0x18
D7 6B80 ORI R24,0xB0
D8 BB88 OUT 0x18,R24
(0087) SEND(0x0c,0x01);
D9 E021 LDI R18,1
DA E00C LDI R16,0xC
DB DF71 RCALL _SEND
(0088) SEND(0x0b,0x07);
DC E027 LDI R18,7
DD E00B LDI R16,0xB
DE DF6E RCALL _SEND
(0089) SEND(0x0a,0x05);
DF E025 LDI R18,5
E0 E00A LDI R16,0xA
E1 DF6B RCALL _SEND
(0090) SEND(0x09,0xff);
E2 EF2F LDI R18,0xFF
E3 E009 LDI R16,0x9
E4 DF68 RCALL _SEND
(0091) SEG_CLEAR(3);
E5 E003 LDI R16,3
E6 DFA9 RCALL _SEG_CLEAR
E7 9508 RET
_SEG_L:
i --> R12
number --> R10
E8 940E 0225 CALL push_xgset003C
EA 0158 MOVW R10,R16
(0092) }
(0093)
(0094)
(0095) //=============SEG左四显示数字==============
(0096) void SEG_L(int number)
(0097) {
(0098) int i=4;
EB E084 LDI R24,4
EC E090 LDI R25,0
ED 016C MOVW R12,R24
(0099) SEND(0x01,0x0f); //先清除左四位,左四位黑屏
EE E02F LDI R18,0xF
EF E001 LDI R16,1
F0 DF5C RCALL _SEND
(0100) SEND(0x02,0x0f);
F1 E02F LDI R18,0xF
F2 E002 LDI R16,2
F3 DF59 RCALL _SEND
(0101) SEND(0x03,0x0f);
F4 E02F LDI R18,0xF
F5 E003 LDI R16,3
F6 DF56 RCALL _SEND
(0102) SEND(0x04,0x0f);
F7 E02F LDI R18,0xF
F8 E004 LDI R16,4
F9 DF53 RCALL _SEND
(0103)
(0104) if(number>9999)//要显示的数值超过4位,则显示4个H
FA E08F LDI R24,0xF
FB E297 LDI R25,0x27
FC 158A CP R24,R10
FD 059B CPC R25,R11
FE F46C BGE 0x010C
(0105) {
(0106) SEND(0x01,0x0c);
FF E02C LDI R18,0xC
100 E001 LDI R16,1
101 DF4B RCALL _SEND
(0107) SEND(0x02,0x0c);
102 E02C LDI R18,0xC
103 E002 LDI R16,2
104 DF48 RCALL _SEND
(0108) SEND(0x03,0x0c);
105 E02C LDI R18,0xC
106 E003 LDI R16,3
107 DF45 RCALL _SEND
(0109) SEND(0x04,0x0c);
108 E02C LDI R18,0xC
109 E004 LDI R16,4
10A DF42 RCALL _SEND
(0110) }
10B C01E RJMP 0x012A
(0111) else//小于四位可以显示
(0112) {
(0113) do
(0114) {
(0115) SEND(i,number%10);
10C E02A LDI R18,0xA
10D E030 LDI R19,0
10E 0185 MOVW R16,R10
10F 940E 01C9 CALL mod16s
111 2F20 MOV R18,R16
112 2D0C MOV R16,R12
113 DF39 RCALL _SEND
(0116) number=(number-number%10)/10;
114 E02A LDI R18,0xA
115 E030 LDI R19,0
116 0185 MOVW R16,R10
117 940E 01C9 CALL mod16s
119 0118 MOVW R2,R16
11A 0185 MOVW R16,R10
11B 1902 SUB R16,R2
11C 0913 SBC R17,R3
11D E02A LDI R18,0xA
11E E030 LDI R19,0
11F 940E 01CD CALL div16s
121 0158 MOVW R10,R16
(0117) i--;
122 01C6 MOVW R24,R12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -