找回密码
 立即注册
查看: 716|回复: 2

请教下关于STC8H1K08内存问题

[复制链接]

2

主题

2

回帖

26

积分

新手上路

积分
26
发表于 2024-7-12 15:30:49 | 显示全部楼层 |阅读模式
以下是我的源代码,
现在的应用要求是一个幻彩灯,一路遥控,两路按键,一路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)
void  delay_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[num];
        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[num];
//         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);
    }
}

void  delay_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;
    // }
  }
}




回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:365
  • 最近打卡:2025-05-02 00:20:03

6

主题

319

回帖

2206

积分

金牌会员

积分
2206
发表于 2024-7-12 16:38:36 | 显示全部楼层
本帖最后由 网老四 于 2024-7-12 16:43 编辑

你用库函数写程序,如果没有去掉未用到的函数,自然编译后会占用很多存储空间.检查下list文件,看到底程序空间如何分配的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6845

积分

论坛元老

积分
6845
发表于 2024-7-12 17:48:26 | 显示全部楼层
WS2812彩灯控制可参考这个帖子里面的例子:
SPI DMA 输出控制WS2812三基色彩灯程序,不加反相器,STC8/STC32
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6104
(出处: 国芯技术交流网站)
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 05:26 , Processed in 0.203507 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表