-
UID:1334822
-
- 注册时间2012-12-16
- 最后登录2023-07-01
- 在线时间370小时
-
-
访问TA的空间加好友用道具
|
手上有两片32x32的全彩点阵屏,恒流驱动的。本来打算用FPGA驱动一下的,一直没动手,没想到刚想动手时候卡壳了。于是就想先用STM32先驱动,后面再用Verilog写调试就轻松一点了。不多说了,上图上关键驱动代码,点LED屏TFT-LCD学习可以加群348211538交流: - /***************************************************************************************************/
- /*****************代码文件:LED_MATRIX.c************************************************************/
- /*****************程序名称:全彩LED点阵屏驱动*******************************************************/
- /*****************程序内容:全彩LED点阵屏显示驱动程序***********************************************/
- /*****************程序编写:7426笨蛋****************************************************************/
- /*****************编写日期:2015年12月**************************************************************/
- /*****************修改记录:NA**********************************************************************/
- /*****************杭州迷梦电子科技******************************************************************/
- /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
- /***************************************************************************************************/
- #include "stm32f10x.h"
- #include"LED_MATRIX.h"
- #include "LED_CODE.h"
- #include "pwm_output.h"
- #define CLR_SA GPIO_ResetBits(GPIOA, GPIO_Pin_2) //SA=0;
- #define SET_SA GPIO_SetBits(GPIOA, GPIO_Pin_2) //SA=1;
- #define CLR_SB GPIO_ResetBits(GPIOA, GPIO_Pin_6) //SB=0;
- #define SET_SB GPIO_SetBits(GPIOA, GPIO_Pin_6) //SB=1;
- #define CLR_SC GPIO_ResetBits(GPIOB, GPIO_Pin_10) //SC=0;
- #define SET_SC GPIO_SetBits(GPIOB, GPIO_Pin_10) //SC=1;
- #define CLR_SD GPIO_ResetBits(GPIOA, GPIO_Pin_7) //SD=0;
- #define SET_SD GPIO_SetBits(GPIOA, GPIO_Pin_7) //SD=1;
- #define CLR_R GPIO_ResetBits(GPIOA, GPIO_Pin_0) //R=0;
- #define SET_R GPIO_SetBits(GPIOA, GPIO_Pin_0) //R=1;
- #define CLR_G GPIO_ResetBits(GPIOA, GPIO_Pin_5) //G=0;
- #define SET_G GPIO_SetBits(GPIOA, GPIO_Pin_5) //G=1;
- #define CLR_B GPIO_ResetBits(GPIOA, GPIO_Pin_1) //B=0;
- #define SET_B GPIO_SetBits(GPIOA, GPIO_Pin_1) //B=1;
- #define CLR_SH GPIO_ResetBits(GPIOA, GPIO_Pin_4) //SH=0;
- #define SET_SH GPIO_SetBits(GPIOA, GPIO_Pin_4) //SH=1;
- #define CLR_ST GPIO_ResetBits(GPIOB, GPIO_Pin_8) //ST=0;
- #define SET_ST GPIO_SetBits(GPIOB, GPIO_Pin_8) //ST=1;
- #define CLR_OE GPIO_ResetBits(GPIOB, GPIO_Pin_9) //ST=0;
- #define SET_OE GPIO_SetBits(GPIOB, GPIO_Pin_9) //ST=1;
- /////////////////////////////////////////////////////////
- //颜色格式说明:16Bit:红[15:11]|绿[10:6]|蓝[5:1]|空[0]
- //坐标说明:0———————————>Width
- // |
- // |
- // Hight
- /////////////////////////////////////////////////////////
- #define RED 0xf800
- #define GREEN 0x07c0
- #define BLUE 0x003e
- #define Width 32
- #define Hight 32
- #define LED_DOT Width*Hight
- #define LED_TEM_DOT LED_DOT/256
- #define GrayLevel 5
- #define Step 32
- u16 DispTemp[Width*Hight]={0};//显示缓存数组
- u8 const PWM_code[GrayLevel] = {96,48,24,12,6};
- /***************************************************************************************************/
- /*****************函数名称:void scan(u8 i)*********************************************************/
- /*****************函数作用:LED点阵行扫描***********************************************************/
- /*****************函数参数:i:要扫描的行数**********************************************************/
- /*****************函数返回:无**********************************************************************/
- /*****************修改说明:NA**********************************************************************/
- /*****************杭州迷梦电子科技******************************************************************/
- /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
- /***************************************************************************************************/
- static void scan(u8 i) //行扫描函数 16扫
- {
- switch(i)
- {
- case 0: {CLR_SA;CLR_SB;CLR_SC;SET_SD;};break;
- case 1: {SET_SA;CLR_SB;CLR_SC;SET_SD;};break;
- case 2: {CLR_SA;SET_SB;CLR_SC;SET_SD;};break;
- case 3: {SET_SA;SET_SB;CLR_SC;SET_SD;};break;
- case 4: {CLR_SA;CLR_SB;SET_SC;SET_SD;};break;
- case 5: {SET_SA;CLR_SB;SET_SC;SET_SD;};break;
- case 6: {CLR_SA;SET_SB;SET_SC;SET_SD;};break;
- case 7: {SET_SA;SET_SB;SET_SC;SET_SD;};break;
- case 8: {CLR_SA;CLR_SB;CLR_SC;CLR_SD;};break;
- case 9: {SET_SA;CLR_SB;CLR_SC;CLR_SD;};break;
- case 10:{CLR_SA;SET_SB;CLR_SC;CLR_SD;};break;
- case 11:{SET_SA;SET_SB;CLR_SC;CLR_SD;};break;
- case 12:{CLR_SA;CLR_SB;SET_SC;CLR_SD;};break;
- case 13:{SET_SA;CLR_SB;SET_SC;CLR_SD;};break;
- case 14:{CLR_SA;SET_SB;SET_SC;CLR_SD;};break;
- case 15:{SET_SA;SET_SB;SET_SC;CLR_SD;};break;
- default: break;
- }
- }
- /***************************************************************************************************/
- /*****************函数名称:void delay_ms(u16 ms)***************************************************/
- /*****************函数作用:简单延迟****************************************************************/
- /*****************函数参数:ms:延迟循环的个数*******************************************************/
- /*****************函数返回:无**********************************************************************/
- /*****************修改说明:NA**********************************************************************/
- /*****************杭州迷梦电子科技******************************************************************/
- /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
- /***************************************************************************************************/
- static void delay_ms(u16 ms)//延时函数
- {
- u8 j;
- while(ms--)
- for(j=0;j<100;j++);
- }
- /***************************************************************************************************/
- /*****************函数名称:void WriteByte(u16 rdat,u16 gdat,u16 bdat)******************************/
- /*****************函数作用:给3个列驱动芯片写入16位的RGB数据****************************************/
- /*****************函数参数:rdat:红色数据;gdat:绿色数据;bdat:蓝色数据******************************/
- /*****************函数返回:无**********************************************************************/
- /*****************修改说明:NA**********************************************************************/
- /*****************杭州迷梦电子科技******************************************************************/
- /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
- /***************************************************************************************************/
- static void WriteByte(u16 rdat,u16 gdat,u16 bdat) //写入一行RGB数据
- {
- u8 k;
- for(k=0;k<16;k++)
- {
- if(rdat&0x8000) //先送最高位
- {
- SET_R;
- }
- else
- {
- CLR_R;
- }
- if(gdat&0x8000)
- {
- SET_G;
- }
- else
- {
- CLR_G;
- }
- if(bdat&0x8000)
- {
- SET_B;
- }
- else
- {
- CLR_B;
- }
- CLR_SH; //CLK上升沿送入数据到锁存器
- SET_SH;
- rdat=rdat<<1;
- gdat=gdat<<1;
- bdat=bdat<<1;
- }
- }
- /***************************************************************************************************/
- /*****************函数名称:void WriteTemp(void)****************************************************/
- /*****************函数作用:把缓存里的数据显示到LED点阵屏上*****************************************/
- /*****************函数参数:无**********************************************************************/
- /*****************函数返回:无**********************************************************************/
- /*****************修改说明:NA**********************************************************************/
- /*****************杭州迷梦电子科技******************************************************************/
- /*****************CopyRight2015 MiMeng Electronics Technology Ltd.**********************************/
- /***************************************************************************************************/
- void WriteTemp(void) //写缓存命令
- {
- u8 i,j,k;
- for(k=0;k<5;k++) //5阶灰度显示,颜色的高位先显示
- {
- for(j=0;j<16;j++) //16行数据显示,行扫描先扫
- { //注意:暂缓存的变量作用域为此小程序块,下一循环自动清零
- u16 rtem[LED_TEM_DOT] = {0}; //红色数据暂缓存
- u16 gtem[LED_TEM_DOT] = {0}; //绿色数据暂缓存
- u16 btem[LED_TEM_DOT] = {0}; //蓝色数据暂缓存
- for(i=0;i<16;i++) //16次的显示数据的位拼接计算,计算结果保存到暂缓存
- {
- rtem[0] |= ((DispTemp[i+j*Width]<<k)&0x8000)>>i;
- gtem[0] |= ((DispTemp[i+j*Width]<<(k+5))&0x8000)>>i;
- btem[0] |= ((DispTemp[i+j*Width]<<(k+10))&0x8000)>>i;
- #if LED_TEM_DOT > 1
- rtem[1] |= ((DispTemp[i+j*Width+16]<<k)&0x8000)>>i;
- gtem[1] |= ((DispTemp[i+j*Width+16]<<(k+5))&0x8000)>>i;
- btem[1] |= ((DispTemp[i+j*Width+16]<<(k+10))&0x8000)>>i;
- #endif
- #if LED_TEM_DOT > 2
- rtem[2] |= ((DispTemp[i+j*Width+16*Hight]<<k)&0x8000)>>i;
- gtem[2] |= ((DispTemp[i+j*Width+16*Hight]<<(k+5))&0x8000)>>i;
- btem[2] |= ((DispTemp[i+j*Width+16*Hight]<<(k+10))&0x8000)>>i;
- #endif
- #if LED_TEM_DOT > 3
- rtem[3] |= ((DispTemp[i+j*Width+16*Hight+16]<<k)&0x8000)>>i;
- gtem[3] |= ((DispTemp[i+j*Width+16*Hight+16]<<(k+5))&0x8000)>>i;
- btem[3] |= ((DispTemp[i+j*Width+16*Hight+16]<<(k+10))&0x8000)>>i;
- #endif
- }
- #if LED_TEM_DOT > 1
- WriteByte(rtem[2],gtem[2],btem[2]);
- #endif
- #if LED_TEM_DOT > 3
- WriteByte(rtem[3],gtem[3],btem[3]);
- #endif
- WriteByte(rtem[0],gtem[0],btem[0]);
- #if LED_TEM_DOT > 1
- WriteByte(rtem[1],gtem[1],btem[1]);
- #endif
- CLR_ST; //ST_CP上升沿锁存的数据输出
- SET_ST;
- scan(j); //行扫描
- TIM3_PWM_ValueChange(PWM_code[k]); //PWM显示
- delay_ms(2); //延迟一会
- TIM3_PWM_ValueChange(0); //关闭显示
- }
- }
- }
|