请教下关于STC8H1K08内存问题
以下是我的源代码,现在的应用要求是一个幻彩灯,一路遥控,两路按键,一路ADC,其余就是想有30种左右的幻彩效果,
结果我完善了所有逻辑功能开始写幻彩,一个程序就8000了,咱么这个这么占内存吗?
以下是我源代码:#define RGB_PIN P3_5//RGB灯的引脚
#define RGB_NUMLEDS 30 //RGB灯的个数
#define RGB_PIN_MODE {P3M1&=~0x20;P3M0|=0x20;}//推挽输出
#define PWM_DUTY_MAX 1000//PWM最大占空比值
#define IR_REC_PIN P3_6
#define IR_REC_PIN_MODE {P3M1|=0x40;P3M0&=~0x40;}//P3_6高阻输入
#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#define ws2812b_IO P1_1//RGB灯的引脚
#define ws2812b_IO1 P3_5//RGB灯的引脚
#define WS_NUM 30 //RGB灯的个数
#include "lib/ADC.h"
//#include "lib/UART.h"
#include "lib/rgb.h"
#include "lib/ir.h"
//#include "lib/delay.h"
uint8 MOD = 1;
uint8 ZXBL = 1;
uint8 LED_SL = 30;
uint8 IR_KEY = 0;
uint8 ON_OFF = 0;
uint8 B_100us = 0;
uint8 GM_ADC = 0;
uint8 i;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
void WS2812_bit(bit data_bit);
void SendData(u8 dat);
void Init_GPIO();
void WS2812_rand_color(u8 R, u8 G, u8 B);
void WS2812_WriteReset(void);
void reset(void);
void DisP_Color(u32 dat);
void delay_ms(u8 ms);
void Breathing_lamp_Alternate(unsigned int time);
void Breathing_lamp_Red(unsigned int time);
unsigned char LED_DAT;
#define bit0 (LED_DAT & 0x01)
#define bit1 (LED_DAT & 0x02)
#define bit2 (LED_DAT & 0x04)
#define bit3 (LED_DAT & 0x08)
#define bit4 (LED_DAT & 0x10)
#define bit5 (LED_DAT & 0x20)
#define bit6 (LED_DAT & 0x40)
#define bit7 (LED_DAT & 0x80)
voiddelay_ms(u8 ms);
void Timer0Init(void) //100微秒@24.000MHz
{
AUXR &= 0x7f; //定时器时钟12T模式
TMOD &= 0xf0; //设置定时器模式
TL0 = 0x38; //设定定时初值
TH0 = 0xff; //设定定时初值
}
void EX_1(void) interrupt 2 using 3{
if(P3_3){
delay(30);
if(P3_3){
MOD = MOD + 1;
if(MOD >= 4){
MOD = 0;
}
}
}
ZXBL = 0;
}
void EX_0(void) interrupt 0 using 1{
if(P3_2){
delay(30);
if(P3_2){
MOD = MOD + 1;
if(MOD >= 4){
MOD = 0;
}
}
}
ZXBL = 0;
}
void T_IRQ0(void) interrupt 1 using 2{
ir_rec_callback();//红外接收回调函数
if(ir_rx_available()){
IR_KEY = ir_rx_ircode();
B_100us = 1;
}
}
void setup()
{
}
void Breathing_lamp_Red(unsigned int time)
{
u8 j, x, num, move;
u32 colors[] = {0xFF00FF,0xFF8000}; // 红色
u32 color0, color1;
u8 brightness = 0;
for (num = 0; num < 1; num++)
{
color0 = colors;
for (x = 0; x < 127; x++)
{
brightness = (brightness + 1) % 128;
color1 = color0;
for (j = 0; j < WS_NUM; j++)
{
if (brightness <= 64)
{
color1 &= 0x00FFFFFF;
color1 |= brightness << 24;
}
else
{
color1 &= 0xFFFFFF00;
color1 |= (128 - brightness) << 24;
}
DisP_Color(color1);
}
reset();
delay_ms(time);
}
for (x = 0; x < 127; x++)
{
brightness = (brightness + 1) % 128;
color1 = color0;
for (j = 0; j < WS_NUM; j++)
{
if (brightness <= 64)
{
color0 &= 0x00FFFFFF;
color0 |= brightness << 24;
}
else
{
color0 &= 0xFFFFFF00;
color0 |= (128 - brightness) << 24;
}
DisP_Color(color0);
}
reset();
delay_ms(time);
}
}
}
void WS2812_bit(bit data_bit)
{
if(data_bit)//0.85,0.4us
{
ws2812b_IO=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
ws2812b_IO=0;
}
else//0.4,0.85
{
ws2812b_IO=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
ws2812b_IO=0;
_nop_();_nop_();_nop_();_nop_();
}
}
//*******************发送数据**********************//
void SendData(u8 dat)
{
LED_DAT = dat;
WS2812_bit(bit7);
WS2812_bit(bit6);
WS2812_bit(bit5);
WS2812_bit(bit4);
WS2812_bit(bit3);
WS2812_bit(bit2);
WS2812_bit(bit1);
WS2812_bit(bit0);
}
// IO初始化
//==================================
void Init_GPIO()
{
//P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
//P2M0 = 0x00; P2M1 = 0x00;
//P3M0 = 0x00; P3M1 = 0x00;
//P4M0 = 0x00; P4M1 = 0x00;
// P5M0 = 0x00; P5M1 = 0x00;
// P6M0 = 0x00; P6M1 = 0x00;
// P7M0 = 0x00; P7M1 = 0x00;
adc_init(ADC_P10, ADC_SYSclk_DIV_2, ADC_9BIT);//ADC初始化,三个参数ADC引脚,时钟分频双数2-32,输出值位数12BIT最大分率-12位的ADC输出12位,10位的输出10位
// //uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 9600, TIM_1);//初始化串口
IT0 = 0;
EX0 = 1;
// EA = 1;
IT1 = 0;
EX1 = 1;
// EA = 1;
Timer0Init();
// EA = 1; // 控制总中断
ET0 = 1; // 控制定时器中断
TR0 = 1;// 定时器0开始计时
rgb_init();
ir_rx_init();//红外接收初始化
P3M1&=~0x80;P3M0|=0x80;//推挽输出
// P1M1&=~0x01;P1M0&=~0x01;//双向IO口
P3M1&=~0x04;P3M0&=~0x04;//双向IO口
P3M1&=~0x08;P3M0&=~0x08;//双向IO口
}
//发送24位数据分开解析,封装此函数,能更容易移植改变灯的颜色直接根据RGB值设置就好
//数据格式:G7-G0;R7-R0;B7-B0; 高位先发安装GRB顺序发送
//=================================================================================
void WS2812_rand_color(u8 R,u8 G,u8 B)
{
SendData(G);
SendData(R);
SendData(B);
}
//========================================================================
//WS2812的复位
//========================================================================
void WS2812_WriteReset(void)
{
ws2812b_IO = 0;
delay_ms(2);
}
void reset(void) //复位
{
WS2812_WriteReset();
}
void DisP_Color(u32 dat)
{
WS2812_rand_color(dat>>8,dat,dat>>16);
}
//呼吸
// void Breathing_lamp_Alternate(unsigned int time)
// {
// u8 j, x, num, move;
// u32 colors[] = {0xFF0000, 0xFF8000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, 0x8000FF}; // 7种颜色值,红、橙、黄、绿、青、蓝、紫
// u32 color0, color1;
// ws2812b_IO =P1_1;//RGB灯的引脚
// for (num = 0; num < 7; num++)
// {
// color0 = colors;
// for (x = 0; x < 127; x++)
// {
// color1 = color0;
// for (j = 0; j < WS_NUM; j++)
// {
// DisP_Color(color1);
// }
// color0 += 0x000200;
// reset();
// delay_ms(time);
// }
// for (x = 0; x < 127; x++)
// {
// color1 = color0;
// for (j = 0; j < WS_NUM; j++)
// {
// DisP_Color(color1);
// }
// color0 -= 0x000200;
// reset();
// delay_ms(time);
// }
// }
// }
void Running_lamp(unsigned int time)
{
u8 i, j;
u32 color = 0xFF0000; // 初始颜色为红色
for (i = 0; i < WS_NUM; i++)
{
for (j = 0; j < WS_NUM; j++)
{
if (j == i)
{
DisP_Color(color);
}
else
{
DisP_Color(0x000000); // 关闭其他灯
}
}
reset();
delay_ms(time);
}
}
voiddelay_ms(u8 ms)
{
u16 i;
do
{
i = sys_clk / 10000;
while(--i);
}while(--ms);
}
void main(void)
{
Init_GPIO(); //IO口设置为准双向口
//setup();
while(1){
//loop();
if(MOD=1)
{
Breathing_lamp_Red(5); //R呼吸灯
delay_ms(1000);
}
if(MOD=2)
{
Running_lamp(5); //R呼吸灯
delay_ms(1000);
}
// switch (MOD)
// {
// case 0:
// Breathing_lamp_Red(5); //R呼吸灯
// break;
// case 1:
// Breathing_lamp_Alternate(5); //呼吸灯
// break;
// case 2:
// for (i = (0); i < (LED_SL); i = i + 1) {
// rgb_show(i,0,0,255);//第几个灯显示RGB
// }
// break;
// case 3:
// for (i = (0); i < (LED_SL); i = i + 1) {
// rgb_show(i,255,0,0);//第几个灯显示RGB
// }
// break;
// default:
// for (i = (0); i < (LED_SL); i = i + 1) {
// rgb_show(i,0,0,0);//第几个灯显示RGB
// }
// break;
// }
}
}
本帖最后由 网老四 于 2024-7-12 16:43 编辑
你用库函数写程序,如果没有去掉未用到的函数,自然编译后会占用很多存储空间.检查下list文件,看到底程序空间如何分配的 WS2812彩灯控制可参考这个帖子里面的例子:
SPI DMA 输出控制WS2812三基色彩灯程序,不加反相器,STC8/STC32
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6104
(出处: 国芯技术交流网站)
页:
[1]