📄 dac_tlc5615.lst
字号:
111 C007 RJMP 0x0119
(0115) case 0xde:return 13; //按键D
112 E00D LDI R16,0xD
113 C005 RJMP 0x0119
(0116) case 0xbe:return 14; //按键E
114 E00E LDI R16,0xE
115 C003 RJMP 0x0119
(0117) case 0x7e:return 15; //按键F
116 E00F LDI R16,0xF
117 C001 RJMP 0x0119
(0118) default: return 16; //无按键按下
118 E100 LDI R16,0x10
119 9159 LD R21,Y+
11A 9149 LD R20,Y+
11B 9508 RET
_Display_One_SMG:
data --> R12
bit --> R10
11C 940E 01D0 CALL push_xgset003C
11E 2EC2 MOV R12,R18
11F 2EA0 MOV R10,R16
(0119) }
(0120) }
(0121) /*******************************************************/
(0122) /****** 函数名称: Display_One_SMG() ******/
(0123) /****** 功 能: 显示指定内容在指定位 ******/
(0124) /****** 参 数: bit--位(1-8), ******/
(0125) /****** data--显示内容(0-15,16为全灭)****/
(0126) /****** 返回值 : 无 ******/
(0127) /*******************************************************/
(0128) void Display_One_SMG(unsigned char bit,unsigned char data)
(0129) {
(0130) SMG=SMG_Conver[data]; //送显示数据
120 E584 LDI R24,0x54
121 E090 LDI R25,0
122 2DEC MOV R30,R12
123 27FF CLR R31
124 0FE8 ADD R30,R24
125 1FF9 ADC R31,R25
126 9024 LPM R2,0(Z)
127 BA28 OUT 0x18,R2
(0131) Open_SMG_DATA; //锁存数据
128 9ADB SBI 0x1B,3
(0132) Close_SMG_DATA;
129 98DB CBI 0x1B,3
(0133) SMG=~BIT(bit); //送位数据
12A E001 LDI R16,1
12B 2D1A MOV R17,R10
12C 940E 01D5 CALL lsl8
12E 2E20 MOV R2,R16
12F 9420 COM R2
130 BA28 OUT 0x18,R2
(0134) Open_SMG_BIT; //锁存数据
131 9ADA SBI 0x1B,2
(0135) Close_SMG_BIT;
132 98DA CBI 0x1B,2
(0136) delay_nms(2);
133 E002 LDI R16,2
134 E010 LDI R17,0
135 DF2C RCALL _delay_nms
136 940C 01C5 JMP pop_xgset003C
_Display_One_SMG_Point:
bit --> R10
138 92AA ST R10,-Y
139 92BA ST R11,-Y
13A 2EA0 MOV R10,R16
(0137) }
(0138) /*******************************************************/
(0139) /****** 函数名称: Display_One_SMG_Point() ******/
(0140) /****** 功 能: 显示小数点在指定位 ******/
(0141) /****** 返回值 : 无 ******/
(0142) /*******************************************************/
(0143) void Display_One_SMG_Point(unsigned char bit)
(0144) {
(0145) SMG=0x80; //送显示数据
13B E880 LDI R24,0x80
13C BB88 OUT 0x18,R24
(0146) Open_SMG_DATA; //锁存数据
13D 9ADB SBI 0x1B,3
(0147) Close_SMG_DATA;
13E 98DB CBI 0x1B,3
(0148) SMG=~BIT(bit); //送位数据
13F E001 LDI R16,1
140 2D1A MOV R17,R10
141 940E 01D5 CALL lsl8
143 2E20 MOV R2,R16
144 9420 COM R2
145 BA28 OUT 0x18,R2
(0149) Open_SMG_BIT; //锁存数据
146 9ADA SBI 0x1B,2
(0150) Close_SMG_BIT;
147 98DA CBI 0x1B,2
(0151) delay_nms(2);
148 E002 LDI R16,2
149 E010 LDI R17,0
14A DF17 RCALL _delay_nms
14B 90B9 LD R11,Y+
14C 90A9 LD R10,Y+
14D 9508 RET
(0152) }
(0153) /*******************************************************/
(0154) /****** 函数名称: En_Led() ******/
(0155) /****** 功 能: 使能LED功能 ******/
(0156) /****** 参 数: 无 ******/
(0157) /****** 返回值 : 无 ******/
(0158) /*******************************************************/
(0159) void En_Led(void)
(0160) {
(0161) DDRB=0xff; //设置输出
_En_Led:
14E EF8F LDI R24,0xFF
14F BB87 OUT 0x17,R24
(0162) PORTB=0xff; //输出高电平
150 BB88 OUT 0x18,R24
(0163) Open_LED; //打开LED功能
151 9ADC SBI 0x1B,4
152 9508 RET
(0164) }
(0165) /*******************************************************/
(0166) /****** 函数名称: Un_Led() ******/
(0167) /****** 功 能: 关闭LED功能 ******/
(0168) /****** 参 数: 无 ******/
(0169) /****** 返回值 : 无 ******/
(0170) /*******************************************************/
(0171) void Un_Led(void)
(0172) {
(0173) DDRB=0xff; //设置输出
_Un_Led:
153 EF8F LDI R24,0xFF
154 BB87 OUT 0x17,R24
(0174) PORTB=0xff; //输出高电平
155 BB88 OUT 0x18,R24
(0175) Open_LED; //打开LED功能
156 9ADC SBI 0x1B,4
(0176) Close_LED; //关闭LED功能
157 98DC CBI 0x1B,4
158 9508 RET
(0177) }
(0178) /*******************************************************/
(0179) /****** 函数名称: Clear_SMG() ******/
(0180) /****** 功 能: 关闭数码管功能 ******/
(0181) /****** 参 数: 无 ******/
(0182) /****** 返回值 : 无 ******/
(0183) /*******************************************************/
(0184) void Clear_SMG(void)
(0185) {
(0186) DDRB=0xff; //设置输出
_Clear_SMG:
159 EF8F LDI R24,0xFF
15A BB87 OUT 0x17,R24
(0187) PORTB=0x00; //输出高电平
15B 2422 CLR R2
15C BA28 OUT 0x18,R2
(0188) Open_SMG_DATA; //锁存数据
15D 9ADB SBI 0x1B,3
(0189) Close_SMG_DATA;
15E 98DB CBI 0x1B,3
(0190) Open_SMG_BIT;
15F 9ADA SBI 0x1B,2
(0191) Close_SMG_BIT;
160 98DA CBI 0x1B,2
161 9508 RET
(0192) }
(0193) /*******************************************************/
(0194) /****** 函数名称: Spi_Init() ******/
(0195) /****** 功 能: 初始化SPI接口 ******/
(0196) /****** 参 数: 无 ******/
(0197) /****** 返回值 : 无 ******/
(0198) /*******************************************************/
(0199) void Spi_Init(void)
(0200) {
(0201) unsigned char i;
(0202) DDRB|=0xb0; //MISO输入MOSI,SCK,SS输出
_Spi_Init:
i --> R16
162 B387 IN R24,0x17
163 6B80 ORI R24,0xB0
164 BB87 OUT 0x17,R24
(0203) DDRB&=~0x40;
165 98BE CBI 0x17,6
(0204) PORTB|=0x40; //MISO上拉有效
166 9AC6 SBI 0x18,6
(0205) SPSR=0x01; //SPI允许,主机模式,高位在先,极性00,1/2系统时钟速率
167 E081 LDI R24,1
168 B98E OUT 0x0E,R24
(0206) SPCR=0x50;
169 E580 LDI R24,0x50
16A B98D OUT 0x0D,R24
(0207) i=SPSR;
16B B10E IN R16,0x0E
(0208) i=SPDR; //清空SPI,和中断标志,使SPI空闲
16C B10F IN R16,0x0F
16D 9508 RET
(0209) }
(0210) /*******************************************************/
(0211) /****** 函数名称: PutSPIchar() ******/
(0212) /****** 功 能: 用SPI发送数据 ******/
(0213) /****** 参 数: data--待发的数据 ******/
(0214) /****** 返回值 : 无 ******/
(0215) /*******************************************************/
(0216) void PutSPIchar(char data)
(0217) {
(0218) SPDR=data;
_PutSPIchar:
data --> R16
16E B90F OUT 0x0F,R16
(0219) while(!(SPSR&(1<<SPIF))); //等待发送完毕
16F 9B77 SBIS 0x0E,7
170 CFFE RJMP 0x016F
171 9508 RET
(0220) }
(0221) /*******************************************************/
(0222) /****** 函数名称: CPU_Init() ******/
(0223) /****** 功 能: 初始化CPU端口 ******/
(0224) /****** 参 数: 无 ******/
(0225) /****** 返回值 : 无 ******/
(0226) /*******************************************************/
(0227) void CPU_Init(void)
(0228) {
(0229) PORTB=0xff;
_CPU_Init:
172 EF8F LDI R24,0xFF
173 BB88 OUT 0x18,R24
(0230) DDRB=0xff;
174 BB87 OUT 0x17,R24
(0231) PORTA=0x80;
175 E880 LDI R24,0x80
176 BB8B OUT 0x1B,R24
(0232) DDRA=0xdc;
177 ED8C LDI R24,0xDC
178 BB8A OUT 0x1A,R24
(0233) DDRB=0x00;
179 2422 CLR R2
17A BA27 OUT 0x17,R2
(0234) PORTC=0xff;
17B EF8F LDI R24,0xFF
17C BB85 OUT 0x15,R24
(0235) DDRC=0x00;
17D BA24 OUT 0x14,R2
(0236) PORTD=0xff;
17E BB82 OUT 0x12,R24
(0237) DDRD=0x00;
17F BA21 OUT 0x11,R2
(0238) Un_Led();
180 DFD2 RCALL _Un_Led
(0239) Clear_SMG();
181 DFD7 RCALL _Clear_SMG
182 9508 RET
FILE: D:\8_DAC_TLC5615\DAC_TLC5615.c
(0001) /////////////////////////////////////////////////////////////
(0002) // 文件:DAC_TLC5615.C //
(0003) // 环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4 //
(0004) // 硬件:ATMEGA16芯片 //
(0005) // 日期:2007年5月28日 //
(0006) // 功能:DA输出模拟电压控制LED亮度渐变 //
(0007) // 备注: //
(0008) /////////////////////////////////////////////////////////////
(0009) #include <iom16v.h> //包含单片机型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include "delay.h" //包含延时头文件
(0012) #include "AVR_XQV12.h" //包含通用函数及宏定义头文件
(0013)
(0014) /*******************************************************/
(0015) /****** 函数名称: main() ******/
(0016) /****** 功 能: DA输出模拟电压控制LED亮度渐变 ******/
(0017) /****** 参 数: 无 ******/
(0018) /****** 返回值 : 无 ******/
(0019) /*******************************************************/
(0020) void main(void)
(0021) {
(0022) unsigned int i;
(0023) CPU_Init(); //初始化单片机
_main:
i --> R20
183 DFEE RCALL _CPU_Init
(0024) Spi_Init(); //初始化SPI接口
184 DFDD RCALL _Spi_Init
185 C03D RJMP 0x01C3
(0025) while(1) //无限循环
(0026) {
(0027) for(i=280;i<1024;i++) //电压逐渐变高
186 E148 LDI R20,0x18
187 E051 LDI R21,1
188 C017 RJMP 0x01A0
(0028) {
(0029) Clr_CS5615; //片选TLC5615
189 98DF CBI 0x1B,7
(0030) PutSPIchar((unsigned char)((i&0x03c0)>>6));//发送数据
18A E026 LDI R18,6
18B E030 LDI R19,0
18C 018A MOVW R16,R20
18D 7C00 ANDI R16,0xC0
18E 7013 ANDI R17,3
18F 940E 01DB CALL lsr16
191 DFDC RCALL _PutSPIchar
(0031) PutSPIchar((unsigned char)((i&0x003f)<<2));
192 2F04 MOV R16,R20
193 730F ANDI R16,0x3F
194 7010 ANDI R17,0
195 0F00 LSL R16
196 1F11 ROL R17
197 0F00 LSL R16
198 1F11 ROL R17
199 DFD4 RCALL _PutSPIchar
(0032) Set_CS5615; //释放TLC5615
19A 9ADF SBI 0x1B,7
(0033) delay_nms(2); //延时
19B E002 LDI R16,2
19C E010 LDI R17,0
19D DEC4 RCALL _delay_nms
19E 5F4F SUBI R20,0xFF
19F 4F5F SBCI R21,0xFF
1A0 3040 CPI R20,0
1A1 E0E4 LDI R30,4
1A2 075E CPC R21,R30
1A3 F328 BCS 0x0189
(0034) }
(0035) for(i=1023;i>280;i--) //电压逐渐变低
1A4 EF4F LDI R20,0xFF
1A5 E053 LDI R21,3
1A6 C017 RJMP 0x01BE
(0036) {
(0037) Clr_CS5615; //片选TLC5615
1A7 98DF CBI 0x1B,7
(0038) PutSPIchar((unsigned char)((i&0x03c0)>>6));//发送数据
1A8 E026 LDI R18,6
1A9 E030 LDI R19,0
1AA 018A MOVW R16,R20
1AB 7C00 ANDI R16,0xC0
1AC 7013 ANDI R17,3
1AD 940E 01DB CALL lsr16
1AF DFBE RCALL _PutSPIchar
(0039) PutSPIchar((unsigned char)((i&0x003f)<<2));
1B0 2F04 MOV R16,R20
1B1 730F ANDI R16,0x3F
1B2 7010 ANDI R17,0
1B3 0F00 LSL R16
1B4 1F11 ROL R17
1B5 0F00 LSL R16
1B6 1F11 ROL R17
1B7 DFB6 RCALL _PutSPIchar
(0040) Set_CS5615; //释放TLC5615
1B8 9ADF SBI 0x1B,7
(0041) delay_nms(2); //延时
FILE: <library>
1B9 E002 LDI R16,2
1BA E010 LDI R17,0
1BB DEA6 RCALL _delay_nms
1BC 5041 SUBI R20,1
1BD 4050 SBCI R21,0
1BE E188 LDI R24,0x18
1BF E091 LDI R25,1
1C0 1784 CP R24,R20
1C1 0795 CPC R25,R21
1C2 F320 BCS 0x01A7
1C3 CFC2 RJMP 0x0186
1C4 9508 RET
pop_xgset003C:
1C5 90A9 LD R10,Y+
1C6 90B9 LD R11,Y+
1C7 90C9 LD R12,Y+
1C8 90D9 LD R13,Y+
1C9 9508 RET
push_xgsetF0FC:
1CA 937A ST R23,-Y
1CB 936A ST R22,-Y
push_xgset30FC:
1CC 935A ST R21,-Y
1CD 934A ST R20,-Y
push_xgset00FC:
1CE 92FA ST R15,-Y
1CF 92EA ST R14,-Y
push_xgset003C:
1D0 92DA ST R13,-Y
1D1 92CA ST R12,-Y
1D2 92BA ST R11,-Y
1D3 92AA ST R10,-Y
1D4 9508 RET
lsl8:
1D5 2311 TST R17
1D6 F019 BEQ 0x01DA
1D7 0F00 LSL R16
1D8 951A DEC R17
1D9 CFFB RJMP lsl8
1DA 9508 RET
lsr16:
1DB 2322 TST R18
1DC F021 BEQ 0x01E1
1DD 9516 LSR R17
1DE 9507 ROR R16
1DF 952A DEC R18
1E0 CFFA RJMP lsr16
1E1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -