关于32*64led单 {MOD}单元点阵问题
2019-07-14 19:38发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
小白遇到了一个问题。
自己做着一个32*64点阵玩,程序如下,无外乎就是ABCD,OE,STB,CLK四个信号,我通过STM32开发板直接从引脚处(IO)接出来,考虑到了电路可能驱动不了,但是屏幕中有几行能闪,请教大神为什么?如果有源码那更好,借鉴借鉴。屏幕里面芯片:增大电流驱动能力74HC245,行选芯片ICN2012,列选芯片ICN2025,希望大神们能帮忙知道下。
#include "includes.h"
/***************************************************************
*函数名:LED_08_GPIO_Config
*形参:void
*返回值:void
*函数功能:08管口初始化
****************************************************************/
void LED_08_GPIO_Config(void)
{
GPIO_InitPara GPIO_InitStructure;
/* PB4~PB7 接口A B C D 表示行信号的管脚*/
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
/* Configure the pin */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* PA0~PA1 PA4~PA5 接口R1 R2 G1 G2 表示列信号的管脚*/
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA, ENABLE);
/* Configure the pin */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PB0,PB1,PB3, EN使能,STB锁存,CLK时钟*/
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
/* Configure the pin */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/***************************************************************
*函数名:Led_Light
*形参:void
*返回值:void
*函数功能:点亮主程序,先清屏,然后让红灯全亮
****************************************************************/
void Led_Light(void)
{
EN(1);//高电平,失能
Clean_595();//清除锁存器信息,红绿全灭
while(1)
{
WriteDataToFirstHalScreen();//写入全点亮红灯
SetRowLight();
}
}
/***************************************************************
*函数名:Clean_595
*形参:void
*返回值:void
*函数功能:清屏,清除锁存器里没用的信息,led点阵屏全灭,置高电平
红绿
****************************************************************/
void Clean_595(void)
{
int columnarr[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//控制8个595
int send_data[64]={0}; //十六变二进制保存,发送给595
int i,j;
STB(0);//锁存低电平,不发送
for(i=0;i<8;i++)//把所有数据存入send_data中,控制64列
{
for(j=0;j<8;j++)
{
send_data[j+i*8]=columnarr%2;
columnarr=columnarr/2;
}
}
for(i=0;i<64;i++)
{
CLK(0);//时钟低电平,不接收
R1(send_data);//发送相应位的电平,一位一位发送
G1(send_data);
CLK(1);//时钟高电平,接收
}
STB(1);
CLK(0);
STB(0);
}
/***************************************************************
*函数名:WriteDataToFirstHalScreen
*形参:void
*返回值:void
*函数功能:发送数据控制列的led亮灭/红灯
****************************************************************/
void WriteDataToFirstHalScreen(void)
{
int i,j;
int columnarr[8]={0};
int send_data[64]={0};
STB(0);//锁存低电平,不发送
for(i=0;i<8;i++)//把所有数据存入a中,控制64列
{
for(j=0;j<8;j++)
{
send_data[j+i*8]=columnarr%2;
columnarr=columnarr/2;
}
}
for(i=0;i<64;i++)
{
CLK(0);
R1(send_data);//发送相应位的电平,一位一位发送
CLK(1);//接收数据存入锁存
}
STB(1); //锁存置高,发送数据
CLK(0);//全部置低,不发送不接收。
STB(0);
}
/***************************************************************
*函数名:SetRowLight
*形参:void
*返回值:void
*函数功能:点亮主程序,先清屏,然后让红灯全亮
****************************************************************/
/*行信号选择函数,输入行后,进行abcd的二进制转换选择改变高低电平进而选择行*/
void SetRowLight(void)
{
// u8 weixuan[16]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int rowarr[4] = {0};
int i=0,rownum;
for(rownum=0;rownum<16;rownum++)
{
EN(0);
//换算二进制,发送相应行
while(rownum>0)
{
rowarr = rownum%2;
rownum = rownum/2;
i++;
}
LA(rowarr[0]);//发送相应的电平,确定哪一行
LB(rowarr[1]);
LC(rowarr[2]);
LD(rowarr[3]);
EN(1);
}
}
void Text1_Led(void)
{
LED_08_GPIO_Config();
Led_Light();
}
一周热门 更多>