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