切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 17520阅读
  • 7回复

[另类]用STM32驱动一个32x32全彩LED点阵屏32768色显示(附上代码) [复制链接]

上一主题 下一主题
离线7426笨蛋
 

发帖
1433
M币
229
专家
3
粉丝
47
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2015-12-20
手上有两片32x32的全彩点阵屏,恒流驱动的。本来打算用FPGA驱动一下的,一直没动手,没想到刚想动手时候卡壳了。于是就想先用STM32先驱动,后面再用Verilog写调试就轻松一点了。不多说了,上图上关键驱动代码,点LED屏TFT-LCD学习可以加群348211538交流:
  1. /***************************************************************************************************/
  2. /*****************代码文件:LED_MATRIX.c************************************************************/
  3. /*****************程序名称:全彩LED点阵屏驱动*******************************************************/
  4. /*****************程序内容:全彩LED点阵屏显示驱动程序***********************************************/
  5. /*****************程序编写:7426笨蛋****************************************************************/
  6. /*****************编写日期:2015年12月**************************************************************/
  7. /*****************修改记录:NA**********************************************************************/
  8. /*****************杭州迷梦电子科技******************************************************************/
  9. /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
  10. /***************************************************************************************************/
  11. #include "stm32f10x.h"
  12. #include"LED_MATRIX.h"
  13. #include "LED_CODE.h"
  14. #include "pwm_output.h"
  15. #define CLR_SA    GPIO_ResetBits(GPIOA, GPIO_Pin_2) //SA=0;
  16. #define SET_SA    GPIO_SetBits(GPIOA, GPIO_Pin_2)      //SA=1;
  17. #define CLR_SB    GPIO_ResetBits(GPIOA, GPIO_Pin_6) //SB=0;
  18. #define SET_SB    GPIO_SetBits(GPIOA, GPIO_Pin_6)      //SB=1;
  19. #define CLR_SC    GPIO_ResetBits(GPIOB, GPIO_Pin_10) //SC=0;
  20. #define SET_SC    GPIO_SetBits(GPIOB, GPIO_Pin_10)  //SC=1;
  21. #define CLR_SD    GPIO_ResetBits(GPIOA, GPIO_Pin_7) //SD=0;
  22. #define SET_SD    GPIO_SetBits(GPIOA, GPIO_Pin_7)      //SD=1;
  23. #define CLR_R    GPIO_ResetBits(GPIOA, GPIO_Pin_0) //R=0;
  24. #define SET_R    GPIO_SetBits(GPIOA, GPIO_Pin_0)      //R=1;
  25. #define CLR_G    GPIO_ResetBits(GPIOA, GPIO_Pin_5) //G=0;
  26. #define SET_G    GPIO_SetBits(GPIOA, GPIO_Pin_5)      //G=1;
  27. #define CLR_B    GPIO_ResetBits(GPIOA, GPIO_Pin_1) //B=0;
  28. #define SET_B    GPIO_SetBits(GPIOA, GPIO_Pin_1)      //B=1;
  29. #define CLR_SH    GPIO_ResetBits(GPIOA, GPIO_Pin_4) //SH=0;
  30. #define SET_SH    GPIO_SetBits(GPIOA, GPIO_Pin_4)      //SH=1;
  31. #define CLR_ST    GPIO_ResetBits(GPIOB, GPIO_Pin_8) //ST=0;
  32. #define SET_ST    GPIO_SetBits(GPIOB, GPIO_Pin_8)      //ST=1;
  33. #define CLR_OE    GPIO_ResetBits(GPIOB, GPIO_Pin_9) //ST=0;
  34. #define SET_OE    GPIO_SetBits(GPIOB, GPIO_Pin_9)      //ST=1;
  35. /////////////////////////////////////////////////////////
  36. //颜色格式说明:16Bit:红[15:11]|绿[10:6]|蓝[5:1]|空[0]
  37. //坐标说明:0———————————>Width
  38. //            |
  39. //            |
  40. //           Hight
  41. /////////////////////////////////////////////////////////
  42. #define RED    0xf800
  43. #define GREEN  0x07c0
  44. #define BLUE   0x003e
  45. #define Width 32
  46. #define Hight 32
  47. #define LED_DOT  Width*Hight
  48. #define LED_TEM_DOT  LED_DOT/256
  49. #define GrayLevel 5
  50. #define Step    32
  51. u16 DispTemp[Width*Hight]={0};//显示缓存数组
  52. u8 const PWM_code[GrayLevel] = {96,48,24,12,6};
  53. /***************************************************************************************************/
  54. /*****************函数名称:void scan(u8 i)*********************************************************/
  55. /*****************函数作用:LED点阵行扫描***********************************************************/
  56. /*****************函数参数:i:要扫描的行数**********************************************************/
  57. /*****************函数返回:无**********************************************************************/
  58. /*****************修改说明:NA**********************************************************************/
  59. /*****************杭州迷梦电子科技******************************************************************/
  60. /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
  61. /***************************************************************************************************/
  62. static void scan(u8 i)    //行扫描函数 16扫
  63. {
  64. switch(i)
  65. {
  66.         case 0: {CLR_SA;CLR_SB;CLR_SC;SET_SD;};break;
  67.         case 1: {SET_SA;CLR_SB;CLR_SC;SET_SD;};break;
  68.         case 2: {CLR_SA;SET_SB;CLR_SC;SET_SD;};break;
  69.         case 3: {SET_SA;SET_SB;CLR_SC;SET_SD;};break;
  70.         case 4: {CLR_SA;CLR_SB;SET_SC;SET_SD;};break;
  71.         case 5: {SET_SA;CLR_SB;SET_SC;SET_SD;};break;
  72.         case 6: {CLR_SA;SET_SB;SET_SC;SET_SD;};break;
  73.         case 7: {SET_SA;SET_SB;SET_SC;SET_SD;};break;
  74.         case 8: {CLR_SA;CLR_SB;CLR_SC;CLR_SD;};break;
  75.         case 9: {SET_SA;CLR_SB;CLR_SC;CLR_SD;};break;
  76.         case 10:{CLR_SA;SET_SB;CLR_SC;CLR_SD;};break;
  77.         case 11:{SET_SA;SET_SB;CLR_SC;CLR_SD;};break;
  78.         case 12:{CLR_SA;CLR_SB;SET_SC;CLR_SD;};break;
  79.         case 13:{SET_SA;CLR_SB;SET_SC;CLR_SD;};break;
  80.         case 14:{CLR_SA;SET_SB;SET_SC;CLR_SD;};break;
  81.         case 15:{SET_SA;SET_SB;SET_SC;CLR_SD;};break;
  82.    default: break;
  83. }
  84. }
  85. /***************************************************************************************************/
  86. /*****************函数名称:void delay_ms(u16 ms)***************************************************/
  87. /*****************函数作用:简单延迟****************************************************************/
  88. /*****************函数参数:ms:延迟循环的个数*******************************************************/
  89. /*****************函数返回:无**********************************************************************/
  90. /*****************修改说明:NA**********************************************************************/
  91. /*****************杭州迷梦电子科技******************************************************************/
  92. /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
  93. /***************************************************************************************************/
  94. static void delay_ms(u16 ms)//延时函数
  95. {
  96. u8 j;
  97. while(ms--)
  98. for(j=0;j<100;j++);
  99. }
  100. /***************************************************************************************************/
  101. /*****************函数名称:void WriteByte(u16 rdat,u16 gdat,u16 bdat)******************************/
  102. /*****************函数作用:给3个列驱动芯片写入16位的RGB数据****************************************/
  103. /*****************函数参数:rdat:红色数据;gdat:绿色数据;bdat:蓝色数据******************************/
  104. /*****************函数返回:无**********************************************************************/
  105. /*****************修改说明:NA**********************************************************************/
  106. /*****************杭州迷梦电子科技******************************************************************/
  107. /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
  108. /***************************************************************************************************/
  109. static void WriteByte(u16 rdat,u16 gdat,u16 bdat)  //写入一行RGB数据
  110. {
  111. u8 k;
  112. for(k=0;k<16;k++)                          
  113. {
  114.   if(rdat&0x8000)                           //先送最高位
  115.   {
  116.    SET_R;
  117.   }
  118.   else
  119.   {
  120.    CLR_R;
  121.   }
  122.   if(gdat&0x8000)
  123.   {
  124.    SET_G;
  125.   }
  126.   else
  127.   {
  128.    CLR_G;
  129.   }
  130.   if(bdat&0x8000)
  131.   {
  132.    SET_B;
  133.   }
  134.   else
  135.   {
  136.    CLR_B;
  137.   }
  138.   CLR_SH;                                    //CLK上升沿送入数据到锁存器
  139.   SET_SH;
  140.   rdat=rdat<<1;
  141.   gdat=gdat<<1;
  142.   bdat=bdat<<1;
  143. }
  144. }
  145. /***************************************************************************************************/
  146. /*****************函数名称:void WriteTemp(void)****************************************************/
  147. /*****************函数作用:把缓存里的数据显示到LED点阵屏上*****************************************/
  148. /*****************函数参数:无**********************************************************************/
  149. /*****************函数返回:无**********************************************************************/
  150. /*****************修改说明:NA**********************************************************************/
  151. /*****************杭州迷梦电子科技******************************************************************/
  152. /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
  153. /***************************************************************************************************/
  154. void WriteTemp(void)                    //写缓存命令
  155. {
  156.     u8 i,j,k;
  157.     for(k=0;k<5;k++)                    //5阶灰度显示,颜色的高位先显示
  158.     {
  159.                 for(j=0;j<16;j++)        //16行数据显示,行扫描先扫
  160.                 {                                  //注意:暂缓存的变量作用域为此小程序块,下一循环自动清零
  161.                     u16 rtem[LED_TEM_DOT] = {0};  //红色数据暂缓存
  162.                     u16 gtem[LED_TEM_DOT] = {0};  //绿色数据暂缓存
  163.                     u16 btem[LED_TEM_DOT] = {0};  //蓝色数据暂缓存
  164.                     for(i=0;i<16;i++)              //16次的显示数据的位拼接计算,计算结果保存到暂缓存
  165.                     {
  166.                         rtem[0] |=  ((DispTemp[i+j*Width]<<k)&0x8000)>>i;
  167.                         gtem[0] |=    ((DispTemp[i+j*Width]<<(k+5))&0x8000)>>i;
  168.                         btem[0] |=    ((DispTemp[i+j*Width]<<(k+10))&0x8000)>>i;
  169. #if     LED_TEM_DOT > 1        
  170.                         rtem[1] |=  ((DispTemp[i+j*Width+16]<<k)&0x8000)>>i;
  171.                         gtem[1] |=    ((DispTemp[i+j*Width+16]<<(k+5))&0x8000)>>i;
  172.                         btem[1] |=    ((DispTemp[i+j*Width+16]<<(k+10))&0x8000)>>i;
  173. #endif
  174. #if     LED_TEM_DOT > 2    
  175.                         rtem[2] |=  ((DispTemp[i+j*Width+16*Hight]<<k)&0x8000)>>i;
  176.                         gtem[2] |=    ((DispTemp[i+j*Width+16*Hight]<<(k+5))&0x8000)>>i;
  177.                         btem[2] |=    ((DispTemp[i+j*Width+16*Hight]<<(k+10))&0x8000)>>i;
  178. #endif
  179. #if     LED_TEM_DOT > 3        
  180.                         rtem[3] |=  ((DispTemp[i+j*Width+16*Hight+16]<<k)&0x8000)>>i;
  181.                         gtem[3] |=    ((DispTemp[i+j*Width+16*Hight+16]<<(k+5))&0x8000)>>i;
  182.                         btem[3] |=    ((DispTemp[i+j*Width+16*Hight+16]<<(k+10))&0x8000)>>i;
  183. #endif
  184.                     }            
  185. #if     LED_TEM_DOT > 1                    
  186.                        WriteByte(rtem[2],gtem[2],btem[2]);    
  187. #endif
  188. #if     LED_TEM_DOT > 3                    
  189.                     WriteByte(rtem[3],gtem[3],btem[3]);
  190. #endif        
  191.                     WriteByte(rtem[0],gtem[0],btem[0]);
  192. #if     LED_TEM_DOT > 1                    
  193.                     WriteByte(rtem[1],gtem[1],btem[1]);
  194. #endif
  195.                     CLR_ST;                                    //ST_CP上升沿锁存的数据输出
  196.                     SET_ST;  
  197.                     scan(j);                                //行扫描
  198.                     TIM3_PWM_ValueChange(PWM_code[k]);        //PWM显示
  199.                     delay_ms(2);                            //延迟一会
  200.                     TIM3_PWM_ValueChange(0);                //关闭显示
  201.              }
  202.     }
  203. }


本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共5条打赏M币+13
离线7426笨蛋

发帖
1433
M币
229
专家
3
粉丝
47
只看该作者 1楼 发表于: 2015-12-20
请登录后查看
离线blueruby

发帖
7030
M币
2201
专家
4
粉丝
54
只看该作者 2楼 发表于: 2015-12-20
请登录后查看
离线Ω囿圉Ω

发帖
11295
M币
8437
专家
11
粉丝
210
只看该作者 3楼 发表于: 2015-12-20
请登录后查看
离线e-van

发帖
9
M币
25
专家
0
粉丝
1
只看该作者 4楼 发表于: 2016-01-21
请登录后查看
离线7426笨蛋

发帖
1433
M币
229
专家
3
粉丝
47
只看该作者 5楼 发表于: 2017-01-05
回 e-van 的帖子
请登录后查看
离线office1886

发帖
7
M币
-44
专家
0
粉丝
1
只看该作者 6楼 发表于: 2018-11-30
请登录后查看
离线aimonday

发帖
73
M币
63
专家
1
粉丝
3
只看该作者 7楼 发表于: 2018-11-30
回 blueruby 的帖子
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个