久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3487|回復: 6
收起左側

為什么這個單片機程序會占用這么大RAM?

[復制鏈接]
ID:805132 發表于 2020-7-21 17:03 | 顯示全部樓層 |閱讀模式
程序如下,我使用的單片機有64字節RAM,這個程序卻需要133字節RAM,求解是程序本身這么大還是在哪里出了問題?
2.png
  1. #include <reg51.h>
  2. #include "intrins.h"
  3. #define unchar unsigned char
  4. #define unint unsigned int
  5. #define White 0xFFFFFF  
  6. #define Black 0x000000  
  7. #define Red 0x00fe00  
  8. #define Blue 0x0000fe  
  9. #define Green 0xfe0000  
  10. #define nWs 20
  11. #define NOP()_nop_;
  12. unsigned long idata WsDat[nWs];
  13. unint Mod;
  14. sbit Din = P2^3;   
  15. sbit key = P2^0;

  16. void delay(unint z)  //1ms
  17. {
  18.         unchar a,b;
  19.         while(z--)
  20.         for(b=118;b>0;b--)
  21.         for(a=18;a>0;a--)
  22.         ;
  23. }
  24. void h_dat0()
  25. {
  26.         Din = 1;_nop_;              
  27.         Din = 0;_nop_;_nop_; _nop_;                                                               
  28. }

  29. void h_dat1()
  30. {
  31.         Din = 1;_nop_;_nop_;_nop_;                                                                                                      
  32.         Din = 0;_nop_;               
  33. }

  34. void Reset(void)
  35. {
  36.   Din = 0;
  37.   delay(1);      
  38. }

  39. //發送一個字節
  40. void Send_Data(unsigned long LED_DAT)
  41. {
  42.         unsigned char t;
  43.         
  44.         for(t=0;t<24;t++)
  45.         {
  46.                 if(0x800000 == (LED_DAT & 0x800000) )
  47.                 {
  48.                 h_dat1();
  49.                 }
  50.                 else
  51.                 {
  52.                 h_dat0();
  53.                 }
  54.                 LED_DAT<<=1;
  55.         }
  56. }
  57. //發送所有字節
  58. void WS_SetAll()
  59. {
  60.         unsigned char j;
  61.         
  62.          for(j=0;j<nWs;j++)
  63.         {
  64.                 Send_Data(WsDat[j]);
  65.         }
  66.         Reset();
  67. }

  68. //求絕對值
  69. unsigned char abs0(int num)
  70. {
  71.         if(num<0)
  72.            num = -num;
  73.         return (unsigned char) num;
  74. }
  75. //顏色漸變算法
  76. unsigned long ColorToColor(unsigned long color0, unsigned long color1)
  77. {
  78.         unsigned char  Red0, Green0, Blue0;  
  79.         unsigned char  Red1, Green1, Blue1;  
  80.         int                          RedMinus, GreenMinus, BlueMinus;        
  81.         unsigned char  NStep;                                                         
  82.         float                  RedStep, GreenStep, BlueStep;               
  83.         unsigned long  color;                                                        
  84.         unsigned char i;
  85.         

  86.         Red0   = color0>>8;
  87.         Green0 = color0>>16;
  88.         Blue0  = color0;
  89.         
  90.         Red1   = color1>>8;
  91.         Green1 = color1>>16;
  92.         Blue1  = color1;
  93.         
  94.         RedMinus   = Red1 - Red0;
  95.         GreenMinus = Green1 - Green0;
  96.         BlueMinus  = Blue1 - Blue0;
  97.         
  98.         if( abs0(RedMinus) > abs0(GreenMinus) )
  99.                 NStep=abs0(RedMinus);
  100.         else
  101.                 NStep=abs0(GreenMinus);
  102.         if( NStep < abs0(BlueMinus) )
  103.                 NStep=abs0(BlueMinus);
  104.         
  105.         RedStep   = (float)RedMinus   / NStep;
  106.         GreenStep = (float)GreenMinus / NStep;
  107.         BlueStep  = (float)BlueMinus  / NStep;
  108.         
  109.         for(i=0;i<NStep;i++)
  110.         {
  111.                 Red1   = Red0   + (int)(RedStep   * i);
  112.                 Green1 = Green0 + (int)(GreenStep * i);
  113.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  114.                
  115.                 color  = (((unsigned long)Green1<<16)&0XFF0000) | ((Red1<<8)&0XFF00) | Blue1&0XFF;        
  116.                 WsDat[i] = color;
  117.                 WS_SetAll();                                
  118.                 delay(20);                                                
  119.         }

  120.         
  121.         return color;
  122. }


  123. void main()
  124. {   

  125.         while(1)
  126.         {
  127.         
  128.         ColorToColor(Red,Green);
  129.         }
  130.                         
  131. }
復制代碼



回復

使用道具 舉報

ID:452950 發表于 2020-7-21 22:40 | 顯示全部樓層
#define nWs 20
unsigned long idata WsDat[nWs];
你看嘛,一個long是4字節,這里有20個就80字節了
回復

使用道具 舉報

ID:401564 發表于 2020-7-22 00:53 | 顯示全部樓層
數據太大了
White 0xFFFFFF,這可是一個24位的數據,參與運算的話,就要用一個32位就是4個字節的空間
盡量使用占用空間小的數據類型
回復

使用道具 舉報

ID:478073 發表于 2020-7-22 08:23 | 顯示全部樓層
回復

使用道具 舉報

ID:298123 發表于 2020-7-22 11:15 | 顯示全部樓層
unsigned long idata WsDat[nWs];
回復

使用道具 舉報

ID:805132 發表于 2020-7-22 14:31 | 顯示全部樓層
懂了,long變量占用太多字節
回復

使用道具 舉報

ID:808700 發表于 2020-7-28 16:53 | 顯示全部樓層
你設的都是長整形啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲网址 | 日日夜夜草 | 欧美视频偷拍 | 一a一片一级一片啪啪 | 视频一区二区在线观看 | 手机av在线| 一级做受毛片免费大片 | 色资源av| 国产精品国产成人国产三级 | 日韩一区二区三区在线观看 | 久久国产精品网 | 91久久精品视频 | 亚洲精品小视频在线观看 | 亚洲在线一区二区 | 美日韩免费| 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 久久精品亚洲国产 | 成人国产午夜在线观看 | 精品九九久久 | 欧美高清免费 | 综合一区 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 亚洲不卡在线观看 | 欧美一区二区视频 | 中文字幕视频在线 | 在线播放精品视频 | 国产第一页在线观看 | 亚洲精品电影在线观看 | 欧美国产日韩在线观看成人 | 日日操操操 | 97久久久 | 91亚洲精选 | 国产精品中文字幕在线 | 成人在线观看免费视频 | 久在草 | 亚洲精品久久久一区二区三区 | 97色在线视频 | 久久久精品一区 | 一区二区三区在线观看免费视频 | 天堂一区二区三区 | 精品在线一区二区三区 |