相信很多朋友都喜欢LED点阵屏吧,可是对于初学者而言,可能点阵的驱动会有点困难。现在就此讲解一下点阵的驱动方法。上几个图看看我做的点阵的效果吧。首先上个单 {MOD}点阵的吧,
,这个有原理图,那么就给大家看看原理图吧,
这个是595
芯片,串入并出,作为列输出,注意这个芯片有锁存输出,也就是说只有锁存脚有脉冲信号时输出才会改变,再看看行输出,就是控制选通每一行的,
,这个芯片和595主要的区别是没有锁存输出,为什么行不要锁存输出呢?因为每次选通一行,每来一个时钟信号改变一行,若行为低电平有效,164上电默认输出为1,则先移入一个0进去,然后一直移入1,直到16行移完,再循环,这里没来一个时钟输出都会变一下,而如果列输出也这样的话,列数据是经过16次的变化才得到最终的正确数据,而不是一次得到一个正确数据。然后继续下一个啊,这个是双 {MOD}点阵
,这个其实是红 {MOD}、绿 {MOD}、红绿结合(橙 {MOD}),这个我没原理图,但是这些都可以做,现在要自己分析了,不要原理图!对于大部分点阵都是逐行扫描的,行扫描一般都是A、B、C、D四根线组成的,再经过译码形成16根行选
通信号线,再加上列数据输入线、列时钟线、列锁存线基本就没什么线了,再加个OE吧,这个用来控制亮度的,红、绿各有自己的数据线,但其他线都是公用的,先查查里面用的芯片,再先选通一行,再写入一个字节数据,看显示出来的和你的数据是怎么样的。下面展示一下彩 {MOD}点阵,有三原 {MOD}的,RGB,扫描方式是分上下两屏同时16行扫描,数据断独立,控制端共用,无原理图
像这样的屏幕一般都有ABCD的,前面说了这个是行扫描,16行的,然后LAT(列锁存),CLK(时钟),每种颜 {MOD}有独立的数据输入。先讲到这里吧,上传几个程序供大家参考,不是通用的啊,根据原理图更改相应程序。有兴趣的朋友可以交流交流啊。
-
-
-
参考程序.rar
下载积分: 积分 -1 分
13.45 KB, 下载次数: 932, 下载积分: 积分 -1 分
我给你分析一下吧,向这种点阵一般是把HC138作为行扫描的,因为这个译码器可以级联,输出低电平有效,所以行为0有效,级联后行有四根输入,一般的点阵都是写ABCD着四根引脚,ABCD=“0000”就选中第0行,这样只可以选中16行,但是把点阵分为上下两屏的话,上下两屏的行一样,即0-17行,1-18行,这样依次下去,当选中第0行时第17行同时也选中,当选中第1行时第18行也同时选中,这是16扫的,就是分为上下两屏同时扫描,每屏16行,所以程序大概这样:
unsigned char DataBuffer[8][16]={//32列的点阵,分为4个8列
/*上半屏 16*32*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第1个部分的,即第1个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第2个部分的,即第2个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第3个部分的,即第3个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第4个部分的,即第4个8列*/
/*下半屏 16*32*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第1个部分的,即第1个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第2个部分的,即第2个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第3个部分的,即第3个8列*/
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第4个部分的,即第4个8列*/
};//缓存数据
//595有CLK,LAT,DATA 3个主要信号
void Send_Byte(unsigned char sel,unsigned data)
{
usnigned char j;
for(j=0;j<8;j++)
{
CLK = 0; if(UP == sel) DATAUP = data&0x01;
if(DOWN == sel) DATADOWN= data&0x01;
temp >>= 1;
CLK = 1; //将数据移位
} }
void Set_ABCD(unsigned char value)//行选中函数,若P1.0~P1.3输出到ABCD四个引脚
{
P1OUT = value &0x0f;
}
void Send_Row_Data(unsigned char (*buf)[16],unsigned char n)//参数为要发送的数据,行数
{
unsigned char i;
for(i=0;i<4;i++)
{
Send_Byte(UP,buf[n]);//每次移动8位数据,循环四次共32位,对应32列
Send_Byte(DOWN,buf[i+4][n]);
}
LAT = 0;
LAT = 1;//将数据输出
}
void Led_Display(void)
{
for(i=0;i<16;i++)//16行扫描
{
Set_ABCD(i);//选中某一行
Send_Row_Data(DataBuffer,i);
}
}
这个供你参考,这还要看你的点阵是什么样子的,要具体点阵测试才好些,
一周热门 更多>