找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7677|回复: 18
打印 上一主题 下一主题
收起左侧

用增强51单片机做的8X24频谱显示

  [复制链接]
跳转到指定楼层
楼主
ID:262 发表于 2016-3-11 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的STC12C5A32S2,3.75点阵LED做显示,8X24频谱源代码下载: 8X24频谱显示程序.rar (64 KB, 下载次数: 96)



IMG_20151208_103513.jpg (52.47 KB, 下载次数: 0)


IMG_20151209_122951_副本.jpg (71.6 KB, 下载次数: 0)


IMG_20151209_123014_副本.jpg (42.07 KB, 下载次数: 0)


IMG_20151209_124908_副本.jpg (74.22 KB, 下载次数: 0)


IMG_20151209_123148.jpg (76.31 KB, 下载次数: 0)


IMG_20151209_123153_副本.jpg (75.23 KB, 下载次数: 0)


单片机部分.jpg (311.62 KB, 下载次数: 3)


原理图.jpg (210.34 KB, 下载次数: 1)



主程序:

  1. #include <STC12C5A60S2.h>
  2. #include<intrins.h>
  3. #define SAMPLE_NUM 128
  4. #define LOG 6
  5. #define TIME 2048           //中断
  6. #define FFT_OUT_MIN 0
  7. #define FFT_OUT_MAX        7       
  8. #define OFF L1=L2=L3=L4=L5=L6=L7=L8=L9=L10=L11=L12=L13=L14=L15=L16=L17=L18=L19=L20=L21=L22=L23=L24=1;
  9. #define ADC_POWER   0x80            //ADC power control bit
  10. #define ADC_FLAG    0x10            //ADC complete flag
  11. #define ADC_START   0x08            //ADC start control bit
  12. //#define ADC_SPEEDLL 0x00            //420 clocks
  13. //#define ADC_SPEEDL  0x20            //280 clocks
  14. #define ADC_SPEEDH  0x40            //140 clocks
  15. //#define ADC_SPEEDHH 0x60            //70 clocks
  16. //采样存储序列表
  17. unsigned char code BRTable[SAMPLE_NUM] ={0, 64, 32, 96, 16, 80, 48, 112,
  18. 8, 72, 40, 104, 24, 88, 56, 120,
  19. 4, 68, 36, 100, 20, 84, 52, 116,
  20. 12, 76, 44, 108, 28, 92, 60, 124,
  21. 2, 66, 34, 98, 18, 82, 50, 114,
  22. 10, 74, 42, 106, 26, 90, 58, 122,
  23. 6, 70, 38, 102, 22, 86, 54, 118,
  24. 14, 78, 46, 110, 30, 94, 62, 126,
  25. 1, 65, 33, 97, 17, 81, 49, 113,
  26. 9, 73, 41, 105, 25, 89, 57, 121,
  27. 5, 69, 37, 101, 21, 85, 53, 117,
  28. 13, 77, 45, 109, 29, 93, 61, 125,
  29. 3, 67, 35, 99, 19, 83, 51, 115,
  30. 11, 75, 43, 107, 27, 91, 59, 123,
  31. 7, 71, 39, 103, 23, 87, 55, 119,
  32. 15, 79, 47, 111, 31, 95, 63, 127};
  33. char code sin_tabb[SAMPLE_NUM] = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,

  34. 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,

  35. 108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30,

  36. -36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121,

  37. -123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,

  38. -98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6};                        
  39. char code cos_tabb[SAMPLE_NUM] = {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,

  40. 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59,

  41. -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -

  42. 126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80,

  43. -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70,

  44. 75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126};
  45. xdata unsigned char result[128];
  46. xdata unsigned char temp[128];
  47. xdata unsigned char num[128];
  48. unsigned char anum,timernum,timernum2,lednum3,Ltime,t;//用于分离
  49. unsigned char lednum[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
  50. int xdata FftReal[SAMPLE_NUM];
  51. int xdata FftImage[SAMPLE_NUM];

  52. unsigned char code musicdisplay[]={
  53.         0x00,0x00,
  54.         0xFE,0x40,0x30,0x40,0xFE,0x00, // -M-
  55.         0xFC,0x02,0x02,0x02,0xFC,0x00, // -U-
  56.         0x64,0x92,0x92,0x92,0x4C,0x00, // -S-
  57.         0x00,0x82,0xFE,0x82,0x00,0x00, // -I-
  58.         0x7C,0x82,0x82,0x82,0x44,0x00, // -C-
  59.         0x00,0x00,0x00,
  60.         0xFE,0x82,0x82,0x82,0x7C,0x00, // -D-
  61.         0x00,0x82,0xFE,0x82,0x00,0x00, // -I-
  62.         0x64,0x92,0x92,0x92,0x4C,0x00, // -S-
  63.         0xFE,0x90,0x90,0x90,0x60,0x00, // -P-
  64.         0xFE,0x02,0x02,0x02,0x02,0x00, // -L-
  65.         0x3E,0x48,0x88,0x48,0x3E,0x00, // -A-
  66.         0xC0,0x20,0x1E,0x20,0xC0,0x00, // -Y-
  67.         0x00,0x00,0x00,0x00,0x00,0x00,
  68.         0x00,0x00,0x00,0x00,0x00,0x00,
  69.         0x00,0x00,0x00,0x00,0x00,0x00,
  70.         0x00,0x00,0x00,0x00,0x00,0x00,
  71.         0x00,0x00,0x00,0x00,0x00,0x00};
  72. #define LED P2
  73. #define pwm 9
  74. ///////////           列扫描端口
  75. sbit L24=P4^7;
  76. sbit L23=P1^4;
  77. sbit L22=P1^5;
  78. sbit L21=P1^6;
  79. sbit L20=P1^7;
  80. sbit L19=P3^0;
  81. sbit L18=P3^1;
  82. sbit L17=P3^2;
  83. sbit L16=P3^3;
  84. sbit L15=P3^4;
  85. sbit L14=P3^5;
  86. sbit L13=P3^6;
  87. sbit L12=P3^7;
  88. sbit L11=P0^0;
  89. sbit L10=P0^1;
  90. sbit L9=P0^2;
  91. sbit L8=P0^3;
  92. sbit L7=P0^4;
  93. sbit L6=P0^5;
  94. sbit L5=P0^6;
  95. sbit L4=P0^7;
  96. sbit L3=P4^6;
  97. sbit L2=P4^5;
  98. sbit L1=P4^4;
  99. void delay(unsigned char a)
  100. {
  101.         unsigned int i;
  102.         while(--a)
  103.                 for(i=0;i<50;i++);                                    
  104. }
  105. void off()
  106. {
  107.         LED = 0x00;
  108.         OFF
  109. //        delay(10-pwm);
  110. }
  111. void display(unsigned char i,unsigned char dat)
  112. {
  113.         P2=dat;
  114.         switch(i)
  115.         {
  116.                 case 1:L1=0;break;
  117.                 case 2:L2=0;break;
  118.                 case 3:L3=0;break;
  119.                 case 4:L4=0;break;
  120.                 case 5:L5=0;break;
  121.                 case 6:L6=0;break;
  122.                 case 7:L7=0;break;
  123.                 case 8:L8=0;break;
  124.                 case 9:L9=0;break;
  125.                 case 10:L10=0;break;
  126.                 case 11:L11=0;break;
  127.                 case 12:L12=0;break;
  128.                 case 13:L13=0;break;
  129.                 case 14:L14=0;break;
  130.                 case 15:L15=0;break;
  131.                 case 16:L16=0;break;
  132.                 case 17:L17=0;break;
  133.                 case 18:L18=0;break;
  134.                 case 19:L19=0;break;
  135.                 case 20:L20=0;break;
  136.                 case 21:L21=0;break;
  137.                 case 22:L22=0;break;
  138.                 case 23:L23=0;break;
  139.                 case 24:L24=0;break;
  140.         }
  141.         delay(pwm);
  142.         off();
  143. }
  144. void show_musicdisplay()
  145. {
  146.         unsigned char a,b,c;
  147.         for(c=0;c<80;c++)
  148.                 for(b=12;b>0;b--)
  149.                            for(a=1;a<25;a++)
  150.                                 display(a,musicdisplay[a-1+c]);
  151. }           
  152. void FFT_process()                          //下落迟滞
  153. {
  154.         unsigned char i;
  155.         for(i=0;i<24;i++)
  156.         {       
  157.                 if(result[i] < temp[i])
  158.                 {
  159.                         num[i]++;
  160.                         if(num[i] == 1)
  161.                         {
  162.                                 if(temp[0]==0&&temp[1]==0&&temp[2]==0&&temp[3]==0&&temp[4]==0&&temp[5]==0&&temp[6]==0&&temp[7]==0&&temp[8]==0&&temp[9]==0&&temp[10]==0&&temp[11]==0&&temp[12]==0&&temp[13]==0&&temp[14]==0&&temp[15]==0&&temp[16]==0&&temp[17]==0&&temp[18]==0&&temp[19]==0&&temp[20]==0&&temp[21]==0&&temp[22]==0&&temp[23]==0&&temp[24]==0);
  163.                                 else
  164.                                 {
  165.                                         result[i] = --temp[i];
  166.                                         num[i] = 0;
  167.                                 }
  168.                         }
  169.                 }
  170.                 else
  171.                         num[i] = 0;               
  172.         }
  173. }
  174. void disp()
  175. {
  176. //        unsigned char i,j,buff;
  177.         timernum++;
  178.         if(timernum == 25)
  179.                 timernum = 1;
  180.            OFF
  181.         FFT_process();
  182.         /*for(i=0;i<16;i++)
  183.                 for(j=i+1;j<16;j++)
  184.                         if(result[j] > result[i])
  185.                         {
  186.                                 buff = result[i];
  187.                                 result[i] = result[j];
  188.                                 result[j] = buff;
  189.                         }*/                                          
  190.         switch(timernum)
  191.         {
  192.                 case 1:anum = result[0];L1=0;break;
  193.                 case 2:anum = result[1];L2=0;break;
  194.                 case 3:anum = result[2];L3=0;break;
  195.                 case 4:anum = result[3];L4=0;break;
  196.                 case 5:anum = result[4];L5=0;break;
  197.                 case 6:anum = result[5];L6=0;break;
  198.                 case 7:anum = result[6];L7=0;break;
  199.                 case 8:anum = result[7];L8=0;break;
  200.                 case 9:anum = result[8];L9=0;break;
  201.                 case 10:anum = result[9];L10=0;break;
  202.                 case 11:anum = result[10];L11=0;break;
  203.                 case 12:anum = result[11];L12=0;break;
  204.                 case 13:anum = result[12];L13=0;break;
  205.                 case 14:anum = result[13];L14=0;break;
  206.                 case 15:anum = result[14];L15=0;break;
  207.                 case 16:anum = result[15];L16=0;break;
  208.                 case 17:anum = result[16];L17=0;break;
  209.                 case 18:anum = result[17];L18=0;break;
  210.                 case 19:anum = result[18];L19=0;break;
  211.                 case 20:anum = result[19];L20=0;break;
  212.                 case 21:anum = result[20];L21=0;break;
  213.                 case 22:anum = result[21];L22=0;break;
  214.                 case 23:anum = result[22];L23=0;break;
  215.                 case 24:anum = result[23];L24=0;break;
  216.         }
  217.         if(anum >= 8)
  218.                 anum = FFT_OUT_MAX;
  219.         LED = lednum[anum];
  220. }
  221. void ADC_init()
  222. {
  223.         P1ASF = 0x01;                   //Open 8 channels ADC function
  224.     ADC_RES = 0;                    //Clear previous result
  225.         ADC_RESL= 0;
  226.     ADC_CONTR = ADC_POWER | ADC_SPEEDH;
  227.     delay(5);                       //ADC power-on and delay      
  228. }
  229. float ADC_read()
  230. {
  231. //delay(10);       
  232.     ADC_CONTR = ADC_POWER | ADC_SPEEDH  | ADC_START;
  233.     _nop_();                        //至少要延时4个时钟周期
  234.     _nop_();
  235.     _nop_();
  236.     _nop_();
  237.         _nop_();
  238.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  239.     ADC_CONTR &= ~ADC_FLAG;         //关闭ADC
  240.     return (ADC_RES*4+ADC_RESL);                 //Return ADC result
  241. }
  242. short sqrt_16(unsigned long M)   
  243. {
  244.     unsigned int N,i;
  245.     unsigned long tmp,ttp;
  246.     if( M == 0 )            
  247.         return 0;   
  248.     N = 0;  
  249.     tmp = (M >> 30);        
  250.     M <<= 2;
  251.     if( tmp > 1 )            
  252.     {
  253.         N++;               
  254.         tmp -= N;
  255.     }   
  256.     for( i=15; i>0; i-- )   
  257.     {
  258.         N <<= 1;                  
  259.         tmp <<= 2;
  260.         tmp += (M >> 30);         
  261.         ttp = N;
  262.         ttp = (ttp<<1)+1;        
  263.         M <<= 2;
  264.         if( tmp >= ttp )   
  265.         {
  266.             tmp -= ttp;
  267.             N ++;
  268.         }      
  269.     }   
  270.     return N;
  271. }
  272. void FFT()
  273. {
  274.     register unsigned char i,bb,j,k,p;
  275.     register short TR,TI,temp;
  276.     unsigned long ulReal,ulImage;                             
  277.         unsigned char max;
  278.                                                                   
  279.     for(i=0;i<SAMPLE_NUM;i++)         
  280.     {
  281.                 FftReal[BRTable[i]] = ADC_read();
  282.         FftImage[i] = 0;
  283.     }        

  284.     for(i=1;i<=LOG;i++)                        
  285.     {
  286.         bb=1;
  287.         bb <<= (i-1);                                      
  288.         for(j=0;j<=bb-1;j++)                           
  289.         {
  290.             p=1;
  291.             p <<= (LOG-i);           
  292.             p = p*j;
  293.             for(k=j;k<SAMPLE_NUM;k=k+2*bb)               
  294.             {
  295.                 TR=FftReal[k];TI=FftImage[k];temp=FftReal[k+bb];
  296.                 FftReal[k]=FftReal[k]+((FftReal[k+bb]*cos_tabb[p])>>7)+((FftImage[k+bb]*sin_tabb[p])>>7);
  297.                 FftImage[k]=FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7)+((FftImage[k+bb]*cos_tabb[p])>>7);
  298.                 FftReal[k+bb]=TR-((FftReal[k+bb]*cos_tabb[p])>>7)-((FftImage[k+bb]*sin_tabb[p])>>7);
  299.                 FftImage[k+bb]=TI+((temp*sin_tabb[p])>>7)-((FftImage[k+bb]*cos_tabb[p])>>7);
  300.                
  301.                 FftReal[k] >>= 1;            
  302.                 FftImage[k] >>= 1;
  303.                 FftReal[k+bb] >>= 1;                 
  304.                 FftImage[k+bb] >>= 1;                                                                              
  305.             }  
  306.         }
  307.     }

  308.    for(i=0;i<24;i++)
  309.     {  
  310.         ulReal = FftReal[i+1];
  311.         ulReal *= ulReal;
  312.         ulImage = FftImage[i+1];
  313.         ulImage *= ulImage;      
  314.         result[i] = sqrt_16(ulReal+ulImage);                                                                 
  315.                     
  316.     }
  317. /*        for(i=0;i<17;i++)
  318.     {
  319.                 while(result[i] > FFT_OUT_MAX)
  320.                 {
  321.                 for(i=0;i<17;i++)
  322.              {                        
  323.                         result[i] =result[i] -1;      
  324.                   }
  325.             }
  326.         }         */
  327.         while(result[i] == FFT_OUT_MIN)
  328.                 {
  329.                 for(i=0;i<24;i++)
  330.              {                        
  331.                         result[i] =result[i] +1;      
  332.                   }
  333.             }
  334.         for(i=0;i<24;i++)
  335.         {
  336.                 if(result[i] > FFT_OUT_MAX)
  337.                 {
  338.                         result[i] = FFT_OUT_MAX;      
  339.                         if(result[i] > max)
  340.                 max = result[i];
  341.                 }
  342.         }
  343.         //局部增益        */        /*                       
  344.                 /*if(max >= 4)               
  345.                 for(i=1;i<24;i++)
  346.                         if(result[i] >= 2)
  347.                                 result[i]+=1;          */
  348.                                                                  
  349. }            
  350. void init()
  351. {
  352.         P2M0=0XFF;
  353.         P2M1=0X00;
  354.         P3M0=0XFF;
  355.         P3M1=0X00;
  356.         P1M0=0XFE;
  357.         P1M1=0X01;
  358.         P4SW=0x70;

  359.         ADC_init();
  360.         //AUXR |= 0x80;                //定时器时钟1T模式
  361.         TMOD=0x01;
  362.         TH0=(65535-TIME)/256;
  363.         TL0=(65535-TIME)%256;
  364.     EA=1;
  365.         ET0=1;               
  366.         show_musicdisplay();  
  367.         TR0=1;
  368. }
  369. void main()
  370. {
  371.         init();
  372.     while(1)          
  373.         FFT();
  374. }
  375. void timer0() interrupt 1
  376. {
  377.         unsigned char i;
  378.         t++;
  379.         if(t == 24)
  380.         {
  381.                 for(i=0;i<24;i++)
  382.                         temp[i] = result[i];
  383.                 t = 0;
  384.         }                                  
  385.         disp();
  386.         TH0=(65535-TIME)/256;       
  387.         TL0=(65535-TIME)%256;
  388. }
复制代码

fft.h
  1. #ifndef _FFT_INCLUDED_
  2. #define _FFT_INCLUDED_

  3. struct compx
  4. {
  5.         float real;
  6.         float imag;
  7. };
  8. struct compx dd[65]; //FFT数据   
  9. data struct compx temp;  

  10. code float iw[64]=
  11. {
  12.         1.000,0,0.9952,-0.0980,0.9808,-0.1951,0.9569,-0.2903,0.9239,-0.3827,0.8819,-0.4714,0.8315,-0.5556,
  13.         0.7730,-0.6344,0.7071,-0.7071,0.6344,-0.7730,0.5556,-0.8315,0.4714,-0.8819,0.3827,-0.9239,0.2903,-0.9569,
  14.         0.1951,-0.9808,0.0980,-0.9952,0.0,-1.0000,-0.0980,-0.9952,-0.1951,-0.9808,-0.2903,0.9569,-0.3827,-0.9239,
  15.         -0.4714,-0.8819,-0.5556,-0.8315,-0.6344,-0.7730,-0.7071,-0.7071,-0.7730,-0.6344,-0.8315,-0.5556,-0.8819,-0.4714,
  16.         -0.9239,-0.3827,-0.9569,-0.2903,-0.9808,-0.1951,-0.9952,-0.0980
  17. };


  18. //复数乘法
  19. void ee(struct compx b1,uchar data b2)
  20. {
  21.         temp.real=b1.real*iw[2*b2]-b1.imag*iw[2*b2+1];
  22.         temp.imag=b1.real*iw[2*b2+1]+b1.imag*iw[2*b2];
  23. }
  24. //乘方函数  
  25. uint mypow(uchar data nbottom,uchar data ntop)
  26. {
  27.     uint data result=1;
  28.     uchar data t;   
  29.     for(t=0;t<ntop;t++)result*=nbottom;
  30.     return result;
  31. }
  32. //快速傅立叶变换  
  33. void fft(struct compx *xin,uchar data N)
  34. {
  35.         uchar data  fftnum,i,j,k,l,m,n,disbuff,dispos,dissec;
  36.         data struct compx t;
  37.         fftnum=N;                         //傅立叶变换点数
  38.         for(m=1;(fftnum=fftnum/2)!=1;m++);//求得M的值
  39.         for(k=0;k<=N-1;k++)               //码位倒置
  40.         {
  41.                 n=k;
  42.                 j=0;
  43.                 for(i=m;i>0;i--)             //倒置
  44.                 {
  45.                         j=j+((n%2)<<(i-1));
  46.                         n=n/2;
  47.                 }
  48.                 if(k<j){t=xin[1+j];xin[1+j]=xin[1+k];xin[1+k]=t;}//交换数据
  49.         }  
  50.         for(l=1;l<=m;l++)                //FFT运算
  51.         {
  52.                 disbuff=mypow(2,l);          //求得碟间距离
  53.                 dispos=disbuff/2;            //求得碟形两点之间的距离
  54.                 for(j=1;j<=dispos;j++)
  55.                         for(i=j;i<N;i=i+disbuff) //遍历M级所有的碟形
  56.                         {
  57.                                 dissec=i+dispos;     //求得第二点的位置
  58.                                 ee(xin[dissec],(uint)(j-1)*(uint)N/disbuff);//复数乘法
  59.                                 t=temp;
  60.                                 xin[dissec].real=xin[i].real-t.real;
  61.                                 xin[dissec].imag=xin[i].imag-t.imag;
  62.                                 xin[i].real=xin[i].real+t.real;
  63.                                 xin[i].imag=xin[i].imag+t.imag;
  64.                         }
  65.         }
  66. }


  67. //完成显示数据的转换工作,包括顶点下落速度控制以及顶点更新定格
  68. //对fft数据进行处理,得到各个频率段的电压幅值
  69. void processfft(void)
  70. {
  71.     uchar data pt=0,tmp;

  72.     for(pt=1;pt<65;pt++)
  73.     {
  74.         dd[pt].imag=0;                //清零虚部
  75.     }
  76.     fft(dd,64);                       //对当前数据进行傅立叶变换
  77.          
  78.     for(pt=1;pt<65;pt++)
  79.     {                                      
  80.         dd[pt].real=sqrt(dd[pt].real*dd[pt].real+dd[pt].imag*dd[pt].imag);//取均方根
  81.     }

  82.         if(Menu==1)
  83.         {
  84.                 for(pt=2;pt<34;pt+=2)         
  85.             {      
  86.                         for(tmp=(dd[pt].real/32)+1,LEDBuf[pt]=0xFF;tmp>=1;tmp--)//tmp>1;不保留最低位那一行常亮
  87.                         {
  88.                                  LEDBuf[pt]<<=1;                       
  89.                         }
  90.                        
  91.                         LEDBuf[pt]=~(LEDBuf[pt]);
  92.          
  93.                 }
  94.         }
  95.         else if(Menu==2)
  96.         {

  97.                 //下落感
  98.                 for(pt=2;pt<34;pt+=2)       
  99.             {      
  100.                         tmp=(dd[pt].real/32)+1;
  101.                         if(refreshflag[pt]<tmp)                            //刷新数据,取较大高度值 存储显示  
  102.                         {
  103.                                 for(LEDBuf[pt]=0xFF;tmp>1;tmp--)        //tmp>1;不保留  最低位那一行常亮;{}一次也不执行;
  104.                                 {
  105.                                          LEDBuf[pt]<<=1;       
  106.                                        
  107.                                 }
  108.                                 refreshflag[pt]=(dd[pt].real/32)+1;
  109.                         }
  110.                         else
  111.                         {
  112.                                  if(refreshflag[pt]>1)refreshflag[pt]--;                //顶端下落速度控制  改变值可以改变下降速度
  113.                                  for(LEDBuf[pt]=0xFF,tmp=refreshflag[pt];tmp>1;tmp--)   //tmp>1;不保留 最低位那一行常亮
  114.                                 {
  115.                                          LEDBuf[pt]<<=1;                                               
  116.                                 }
  117.                         }
  118.                 }
  119.         }
  120.         else if(Menu==0)
  121.         {

  122.                 //下落感频谱
  123.                 for(pt=2;pt<34;pt+=2)         
  124.             {      
  125.                         tmp=(dd[pt].real/32)+1;
  126.                         if(refreshflag[pt]<tmp)                          //刷新数据,取较大高度值 存储显示  
  127.                         {
  128.                                 for(LEDBuf[pt]=0xFF;tmp>=1;tmp--)//tmp>1;不保留  最低位那一行常亮;{}一次也不执行;
  129.                                 {
  130.                                          LEDBuf[pt]<<=1;       
  131.                                        
  132.                                 }
  133.                                 refreshflag[pt]=(dd[pt].real/32)+1;
  134.                        
  135.                         }
  136.                         else
  137.                         {
  138.                                  if(refreshflag[pt]>1)refreshflag[pt]--;                        
  139.                                  for(LEDBuf[pt]=0xFF,tmp=refreshflag[pt];tmp>=1;tmp--)       
  140.                                 {
  141.                                          LEDBuf[pt]<<=1;                                       
  142.                                 }
  143.                         }
  144.                         LEDBuf[pt]=~(LEDBuf[pt]);
  145.                 }
  146.         }
  147.        
  148. }  
  149. #endif      

复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72224 发表于 2016-3-18 11:50 | 只看该作者
谢谢分享,
回复

使用道具 举报

板凳
ID:79544 发表于 2016-3-19 15:15 | 只看该作者
楼主辛苦,谢谢分享!
回复

使用道具 举报

地板
ID:68727 发表于 2016-3-26 23:51 来自手机 | 只看该作者
好楼主牛X
回复

使用道具 举报

5#
ID:128101 发表于 2016-7-3 01:27 | 只看该作者
频谱显示 学习 学习 感谢分享。后续还有更完善的吗。向上 向下 波浪 向上带浮点 跳动等特效。看到有些音响有这样的效果功能,非常的动感显耀,真是羡慕,什么时候能自己也能摆弄上,那是件多开心的事情。
回复

使用道具 举报

6#
ID:74143 发表于 2016-7-7 16:28 | 只看该作者
楼主厉害
回复

使用道具 举报

7#
ID:137162 发表于 2016-8-19 20:34 | 只看该作者
感谢分享
回复

使用道具 举报

8#
ID:17396 发表于 2016-8-23 10:19 | 只看该作者
非常详细的分享,谢谢!
回复

使用道具 举报

9#
ID:137676 发表于 2016-9-6 23:21 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

10#
ID:136090 发表于 2016-9-7 20:29 | 只看该作者
楼主真利害,不过好像有人抄了你的东西在发表了。
回复

使用道具 举报

11#
ID:95809 发表于 2016-12-28 13:50 | 只看该作者
大哥,你真厉害。那是我15年在矿石收音机论坛发的帖子,抄就抄吧,你好歹加点自己的东西啊,原封不动就拿过来了,图片但是我的。现在还有人说别人抄你的,真服了。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

12#
ID:180805 发表于 2017-3-22 23:17 | 只看该作者
hahahh
回复

使用道具 举报

13#
ID:130231 发表于 2017-3-23 00:11 | 只看该作者
好资料!感谢你的分享
回复

使用道具 举报

14#
ID:288824 发表于 2018-3-9 10:58 | 只看该作者
bxyyhan 发表于 2016-12-28 13:50
大哥,你真厉害。那是我15年在矿石收音机论坛发的帖子,抄就抄吧,你好歹加点自己的东西啊,原封不动就拿过 ...

大神,为什么只有列扫描sbit定义????
没有行定义
回复

使用道具 举报

15#
ID:95809 发表于 2018-3-10 14:04 来自手机 | 只看该作者
w761231506 发表于 2018-3-9 10:58
大神,为什么只有列扫描sbit定义????
没有行定义

行定义在P2了,仔细看。
回复

使用道具 举报

16#
ID:93672 发表于 2018-11-19 08:59 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

17#
ID:244589 发表于 2018-11-19 17:32 | 只看该作者
bxyyhan 发表于 2016-12-28 13:50
大哥,你真厉害。那是我15年在矿石收音机论坛发的帖子,抄就抄吧,你好歹加点自己的东西啊,原封不动就拿过 ...

心疼您一下
回复

使用道具 举报

18#
ID:244589 发表于 2018-12-27 18:07 | 只看该作者
bxyyhan 发表于 2016-12-28 13:50
大哥,你真厉害。那是我15年在矿石收音机论坛发的帖子,抄就抄吧,你好歹加点自己的东西啊,原封不动就拿过 ...

版主,我想请教您一下,您用的点阵是‘12+12 ‘的双色点阵吗?可实际用到的只有单色是吧?是的话我就用单色点阵代替算了。
回复

使用道具 举报

19#
ID:337484 发表于 2019-1-24 12:02 | 只看该作者
谢谢分享!感谢。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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