打印

感谢lenglx 提供的LED点阵模块,已经调通,请下列人员来领取

[复制链接]
6310|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xwj|  楼主 | 2008-1-9 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
感谢lenglx 提供的LED点阵模块,已经调通,请下列人员来领取

显示效果:


接线方法


级联就不断往后面串,再加上LED 电源既可:


程序下载,做了较完整的图形和12点阵、16点阵中英文混合显示


呵呵,测试的时候用的电脑USB取电,有一块电源对地是短路的,一插电脑就嘟嘟的叫了,键盘鼠标都每反应的,心想这下坏了!
没想到拔下来电脑又正常了,看来我的主板保护功能还不错,没有偷工减料:-)


一共有9块(包括1块坏的)
综合lenglx 的贴和我的贴,请下列人员和我联系,以便邮寄或快递
smalf@sina.com --2块
雁舞白沙
hace1983
OneMillion 
古道热肠


一共有9块(包括1块坏的)
其他需要的赶快联系,不然就没了哦

PS :
我的题只有smalf@sina.com一个发了邮件,郁闷啊...
我会找2块好一点的给smalf,其他的人看来只能每人一块了.
相关链接:https://bbs.21ic.com/upfiles/img/20081/20081935521232.rar

相关帖子

沙发
yewuyi| | 2008-1-9 11:52 | 只看该作者

快发一个给俺……

使用特权

评论回复
板凳
xwj|  楼主 | 2008-1-9 12:04 | 只看该作者

呵呵,没问题

使用特权

评论回复
地板
gyt| | 2008-1-9 12:06 | 只看该作者

好东东啊

我也想要一块:)

使用特权

评论回复
5
古道热肠| | 2008-1-9 12:11 | 只看该作者

好呀!世上还是好人多

有这么多朋友能尝到Lenglx提供的免费午餐,让人有种“2008春天的脚步比以往时候,来得更早了些”
首先要感谢这位热心的网友Lenglx;
其次要感谢XWJ所做的测试工作;
最后要感谢WWW.21IC.com,感谢它为我们提供了这样一个互帮互助,互娱互乐的互动的BBS平台.

使用特权

评论回复
6
古道热肠| | 2008-1-9 12:18 | 只看该作者

奉上LED屏的通用测试代码,简单实用,调试硬件和维修用得

//LED屏驱动



#include "reg52.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

extern void ShT_LEDBoard_ColShiftOut(void);
void TestRefreshLEDScreen(void);

#define c_MaxColNumber 64
#define c_MaxRowNumber 16

#define c_MaxColByte c_MaxColNumber/8

uchar ucColDataBuff_High[c_MaxColByte];            //一行数据缓冲区
uchar idata ucLEDDisplayMemory[c_MaxColByte*c_MaxRowNumber];

//uchar ucColDataBuff_Low[c_MaxDataBuffLength];    //此缓冲区是为拼成32行而设置的

uint uiRowControlValue;
uchar ucRowLineCount;

sbit c_Row_SData = P2^1;
sbit c_Row_SClk  = P2^2;
sbit c_Row_SOut  = P2^0;

//sbit c_Col_SData = P1^5;
//sbit c_Col_SClk = P1^7;
//sbit c_Col_SOut_High = P1^0;
//sbit c_Col_SOut_Low = P1^1;

//sbit c_Col_SOE  = P1^2;

void ShT_LEDBoard_RowShiftOut(uint uiWriteValue)
{
    uchar ucCount;
    uint uiTemp;

    c_Row_SClk = 0;
    c_Row_SOut = 0;

    uiTemp = uiWriteValue;

    for(ucCount=0; ucCount<c_MaxRowNumber; ucCount++)
    {
        if(uiTemp & 0x8000)
        {
            c_Row_SData = 1;
        }
        else
        {
            c_Row_SData = 0;
        }
        c_Row_SClk = 1;

        uiTemp <<= 1;

        c_Row_SClk = 0;
    }

    c_Row_SOut = 1;

    c_Row_SOut = 0;
}


//列驱动
//以下列驱动输出为并行方式
#if 0
#define  c_Col_DataPort  P0
sbit c_Latch373_O1  = P2^0;
sbit c_Latch373_O2  = P2^1;
sbit c_Latch373_O3  = P2^2;
sbit c_Latch373_O4  = P2^3;
sbit c_Latch373_O5  = P2^4;
sbit c_Latch373_O6  = P2^5;
sbit c_Latch373_O7  = P2^6;
sbit c_Latch373_O8  = P2^7;

#define c_Latch_No1 1
#define c_Latch_No2 2
#define c_Latch_No3 3
#define c_Latch_No4 4
#define c_Latch_No5 5
#define c_Latch_No6 6
#define c_Latch_No7 7
#define c_Latch_No8 8


void Init_LED_Board(void)
{
    c_Latch373_O1 =0;
    c_Latch373_O2 =0;
    c_Latch373_O3 =0;
    c_Latch373_O4 =0;
    c_Latch373_O5 =0;
    c_Latch373_O6 =0;
    c_Latch373_O7 =0;
    c_Latch373_O8 =0;
}

void Latch_Data_Out(uchar ucData,uchar LatchRecord)
{
    switch(LatchRecord)
    {
        case c_Latch_No1:

            c_Col_DataPort = ucData;
            c_Latch373_O1 =0;
//            Delay_10MS(1);
            c_Latch373_O1 =1;
            break;

        case c_Latch_No2:

            c_Col_DataPort = ucData;
            c_Latch373_O2 =0;
            c_Latch373_O2 =1;
            break;
        case c_Latch_No3:

            c_Col_DataPort = ucData;
            c_Latch373_O3 =0;
            c_Latch373_O3 =1;
            break;
        case c_Latch_No4:

            c_Col_DataPort = ucData;
            c_Latch373_O4 =0;
            c_Latch373_O4 =1;
            break;
        case c_Latch_No5:

            c_Col_DataPort = ucData;
            c_Latch373_O5 =0;
            c_Latch373_O5 =1;
            break;
        case c_Latch_No6:

            c_Col_DataPort = ucData;
            c_Latch373_O6 =0;
            c_Latch373_O6 =1;
            break;
        case c_Latch_No7:

            c_Col_DataPort = ucData;
            c_Latch373_O7 =0;
            c_Latch373_O7 =1;
            break;
        case c_Latch_No8:

            c_Col_DataPort = ucData;
            c_Latch373_O8 =0;
            c_Latch373_O8 =1;
            break;
    }
}


void ShT_LEDBoard_ColShiftOut(void)
{

    Latch_Data_Out(ucColDataBuff_High[0],c_Latch_No1);
    Latch_Data_Out(ucColDataBuff_High[1],c_Latch_No2);
    Latch_Data_Out(ucColDataBuff_High[2],c_Latch_No3);
    Latch_Data_Out(ucColDataBuff_High[3],c_Latch_No4);
    Latch_Data_Out(ucColDataBuff_High[4],c_Latch_No5);
    Latch_Data_Out(ucColDataBuff_High[5],c_Latch_No6);
    Latch_Data_Out(ucColDataBuff_High[6],c_Latch_No7);
    Latch_Data_Out(ucColDataBuff_High[7],c_Latch_No8);
    
}
#endif


//以下列输出为串行列移位输出方式
sbit c_Col_SData = P2^5;
sbit c_Col_SClk = P2^6;
sbit c_Col_SOut_High = P2^4;
//sbit c_Col_SOut_Low = P2^7;

sbit c_Col_SOE  = P2^3;

void Init_LED_Board(void)
{
    c_Col_SData     = 1;
    c_Col_SClk         = 1;
    c_Col_SOut_High = 1;
    c_Col_SOE         = 1;
     c_Row_SData     = 1;
    c_Row_SClk      = 1;
    c_Row_SOut      = 1;
}

void ShT_LEDBoard_ColShiftOut(void)
{
    uchar ucByteCount;
    uchar ucBitCount;
    uchar ucTemp;

 //开启显示
    c_Col_SOE = 0;
//执行数据锁存到列的操作
    c_Col_SClk = 0;
    c_Col_SOut_High = 0;
    
    for(ucByteCount=0; ucByteCount<c_MaxColByte; ucByteCount++)
    {
        ucTemp = ucColDataBuff_High[ucByteCount];
    
        for(ucBitCount=0; ucBitCount<8; ucBitCount++)
        {
            if(ucTemp & 0x80)
            {
                c_Col_SData = 0;        //When Shift Register Latch Out Value is Zero,the Led is Light
            }
            else
            {
                c_Col_SData = 1;
            }

            c_Col_SClk = 1;
            ucTemp <<= 1;
            c_Col_SClk = 0;
        }
    }

    c_Col_SOut_High = 1;
    c_Col_SOut_High = 0;

//以下操作是给32行屏体用
/*
    for(ucByteCount=0; ucByteCount<16; ucByteCount++)
    {
        ucTemp = ucColDataBuff_Low[ucByteCount];
    
        for(ucBitCount=0; ucBitCount<8; ucBitCount++)
        {
            if(ucTemp & 0x80)
            {
                c_Col_SData = 0;        //When Shift Register Latch Out Value is Zero,the Led is Light
            }
            else
            {
                c_Col_SData = 1;
            }

            c_Col_SClk = 1;
            ucTemp <<= 1;
            c_Col_SClk = 0;
        }
    }
    c_Col_SOut_Low = 1;
    c_Col_SOut_Low = 0;
*/

    c_Col_SOE = 0;
}



void TestLEDBoardHardware(void)
{
    uchar ucCount;
    uint uiRowControlValue;
    uchar ucLoopCount;

//    uint uiDelayCount;
    Init_LED_Board();
    for(ucCount=0; ucCount<8; ucCount++)
    {
        ucColDataBuff_High[ucCount] = 0x00;
//        ucColDataBuff_Low[ucCount] = 0x00;
      }

//    while(1)
//    {
        for(ucLoopCount=0; ucLoopCount<0x50; ucLoopCount++)
        {
            uiRowControlValue = 0x01;
    
            for(ucCount=0; ucCount<c_MaxColByte; ucCount++)
            {
                ucColDataBuff_High[ucCount] = 0x00;
//                ucColDataBuff_Low[ucCount] = 0x00;
              }
            
            for(ucCount=0; ucCount<c_MaxRowNumber; ucCount++)
            {
                ShT_LEDBoard_RowShiftOut(uiRowControlValue);            
                ShT_LEDBoard_ColShiftOut();
                uiRowControlValue <<= 1;
              }
        }
    
        for(ucLoopCount=0; ucLoopCount<0x50; ucLoopCount++)
        {
            uiRowControlValue = 0x01;
    
            for(ucCount=0; ucCount<c_MaxColByte; ucCount++)
            {
                ucColDataBuff_High[ucCount] = 0xff;
//                ucColDataBuff_Low[ucCount] = 0xff;
              }
            
            for(ucCount=0; ucCount<c_MaxRowNumber; ucCount++)
            {
                ShT_LEDBoard_RowShiftOut(uiRowControlValue);            
                ShT_LEDBoard_ColShiftOut();
                uiRowControlValue <<= 1;
              }
        }

//    }
}

void Main(void)
{
    while(1)
    {
        TestLEDBoardHardware();
//        TestRefreshLEDScreen();
    }
}


//以下功能实现字符显
void RefreshLEDScreen(uchar ucLoopCount)
{
    uchar ucRowLineCount;
    uchar ucRefreshCount;
    uint uiRowControlValue;

//    uchar uci;
//    uchar *pucSrcData;
//    uchar *pucDestData;
//    uchar ucCount;

//    ucShiftCount = 0;
    for(ucRefreshCount=0; ucRefreshCount<ucLoopCount; ucRefreshCount++)
    {
        uiRowControlValue = 0x0001;

        for(ucRowLineCount=0; ucRowLineCount<16; ucRowLineCount++)
        {
            memcpy(ucColDataBuff_High,ucLEDDisplayMemory+ucRowLineCount*c_MaxColByte,16);

            ShT_LEDBoard_ColShiftOut();            
    //        c_Col_SOE = 1;                //关闭显示    
            ShT_LEDBoard_RowShiftOut(uiRowControlValue);
//            WriteScreenRowWithSPIModule(~uiRowControlValue);            
            c_Col_SOE = 0;                //打开显示

            uiRowControlValue <<= 1;
        }

//        ucShiftCount++;
//        ucShiftCount &= 0x07;
//

    }
    //补偿最后一行的亮度不?
    


    c_Col_SOE = 1;                //关闭显示
}

#define c_LineWidth  8            //行宽
#define c_MaxLineByteCount 8        //每行占用显示存储器字节数

//#define c_MaxColNumber  128
#define c_MaxLineCount  16                //行的高度
uchar code ucDispDotMaskTab[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
extern code unsigned char   ASCII816[][16];


//测试动态显示效果
void TestRefreshLEDScreen(void)
{
    uchar uci;
    uchar ucCount;


    
//    while(1)
//    {
        uci =1;
//    while(uci)
//    {

        RefreshLEDScreen(100);
        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);
        memset(ucLEDDisplayMemory,0xff,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);
        
        memset(ucLEDDisplayMemory,0x5a,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);
        memset(ucLEDDisplayMemory,0xa5,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);
        //清屏
//        memset(ucLEDDisplayMemory,0xff,c_LineWidth*c_MaxLineCount);
        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(10);
//    }

        /*
        while(1)
        {
            LED_DispString_ColArray(1,"abcdefghijklmnop");
            LED_DispString_ColArray(2,"Tel:025-51615878");

            RefreshCurrentScreen(200);
            LED_DispString_ColArray(1,"8888888888888888");
            LED_DispString_ColArray(2,"6666666666666666");

            RefreshCurrentScreen(200);

        }
*/
    uci =1;
//    while(uci)
    {        
        for(ucCount=0; ucCount<c_MaxLineCount; ucCount++)
        {
            memset(ucLEDDisplayMemory+c_LineWidth*ucCount, 0xFF, c_LineWidth);
//            memset(ucLEDDisplayMemory + 16*ucCount, 0, 16);
            RefreshLEDScreen(10);
        }

        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(10);
        
        for(ucCount=c_MaxLineCount; ucCount>0; ucCount--)
        {
            memset(ucLEDDisplayMemory+c_LineWidth*ucCount, 0xFF, c_LineWidth);
//            memset(ucLEDDisplayMemory + 16*ucCount, 0, 16);
            RefreshLEDScreen(10);
        }

        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(10);
    }



        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(1);
        
        for(ucCount=0; ucCount<c_MaxColNumber; ucCount++)
        {
            uchar idata uci;
            
            for(uci=0; uci<c_MaxLineCount; uci++)
            {
                ucLEDDisplayMemory[uci*c_MaxLineByteCount+ucCount/8] |= ucDispDotMaskTab[ucCount%8];
            }
//            memset(ucLEDDisplayMemory+c_LineWidth*ucCount, 0xFF, c_LineWidth);
            
//            memset(ucLEDDisplayMemory + 16*ucCount, 0, 16);
            RefreshLEDScreen(10);
        }

        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(1);

        
        for(ucCount=c_MaxColNumber; ucCount>0; ucCount--)
        {
            uchar idata uci;
            
            for(uci=0; uci<c_MaxLineCount; uci++)
            {
                ucLEDDisplayMemory[uci*c_MaxLineByteCount+ucCount/8] |= ucDispDotMaskTab[ucCount%8];
            }
//            memset(ucLEDDisplayMemory+c_LineWidth*ucCount, 0xFF, c_LineWidth);
            
//            memset(ucLEDDisplayMemory + 16*ucCount, 0, 16);
            RefreshLEDScreen(10);
        }
        



        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(1);

        for(ucCount=1; ucCount<60; ucCount++)
        {
            uchar idata uci;
            uchar idata ucZMData;
            
            for(uci=0; uci<16; uci++)
            {
                ucZMData = ASCII816[ucCount][uci];
//                ucLEDDisplayMemory[uci*c_MaxLineByteCount+c_HalfScreenMemoryOffset+8] =ucZMData;
//                ucLEDDisplayMemory[uci*c_MaxLineByteCount+8] =ucZMData;
//                ucLEDDisplayMemory[uci*c_MaxLineByteCount+c_HalfScreenMemoryOffset] =ucZMData;
                ucLEDDisplayMemory[uci*c_MaxLineByteCount] =ucZMData;

            }
//            memset(ucLEDDisplayMemory+c_LineWidth*ucCount, 0xFF, c_LineWidth);
            
//            memset(ucLEDDisplayMemory + 16*ucCount, 0, 16);
            RefreshLEDScreen(20);
            memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
            RefreshLEDScreen(1);

        }
        

        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(1);
/*
        LED_DispString(1,"Tel:");
        RefreshLEDScreen(20);
*/
        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(1);

//        LED_DispString(1,"Tel:025-51615878");
//        LED_DispString(2,"Tel:025-83241657");
//        RefreshLEDScreen(200);

//        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
//        RefreshLEDScreen(1);

//        LED_ScrollDispString(1, 20, "This is a Test Long String Disp Demo Line How are you!");

//        memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
//        RefreshLEDScreen(1);
//    }
}

使用特权

评论回复
7
xwj|  楼主 | 2008-1-9 12:24 | 只看该作者

程序很简单

就是:
开1mS 定时中断,中断中每次移位数据,关输出,锁存并切换输出行以及输出

6B595是个非常好用的串行输出IC,竟然有双缓存,完全可以移完数据后在锁存输出,可以充分利用显示时间

由于是1/16扫描,以1mS 中断时刷新率为62.5Hz,可以完全没一点闪烁感


由于红、绿数据是分开输入却共一个CLK的,只用一排时程序比较麻烦,岂是最好的方式是4排(8位)一起输入
这个下一贴讨论

使用特权

评论回复
8
wnhb| | 2008-1-9 12:45 | 只看该作者

还有吗,我也想要

还有吗,我也想要。

使用特权

评论回复
9
xwj|  楼主 | 2008-1-9 12:52 | 只看该作者

移位程序和内存分布讨论

移位程序和内存分布讨论

由于有两个输入端且共用CLK ,必须对两个变量移位,所以效率很低

最开始用C 写的移位程序,MAX_X=64时竟然要用1500多个周期!没法满足刷新率要求
/************************************** /
void displine(void)    
{
    uchar i,j;
    uchar temp1,temp2;
    uchar xdata *p;
    p=&dis_buf[dis_line*(MAX_X/4)];
//    p=dis_buf+dis_line*(MAX_X/4);        //这样写也是一样的
    i=MAX_X/8;
    do{
        temp1=*p;
        p++;
        temp2=*p;
        p++;
        j=8;
        do{
            LED_REG=(temp1&0x01);
            temp1>>=1;
            LED_GREEN=(temp2&0x01);
            temp2>>=1;
            LED_SRCK=1;
            LED_SRCK=0;         
        }while(--j);
    }while(--i);
    LED_G=1;
    LED_RCK=1;
    LED_RCK=0;
    Led_PORT=dis_line|0x80;
    dis_line++;
    dis_line&=0x0f;
}


于是就研究Keil编译后的代码,发现51的位操作必须的通过CY才能传递给IO ,晕啊
只能稍微优化一下,用空间换时间了,下面的代码需要623周期
; void displine(void)    

displine:
    MOV      A,dis_line
    SWAP     A
    ANL      A,#0F0H
    ADD      A,#LOW (dis_buf)
    MOV      DPL,A
    CLR      A
    ADDC     A,#HIGH (dis_buf)
    MOV      DPH,A
    MOV      R7,#08H
?C0003:
    MOVX     A,@DPTR
    MOV      B,A
    INC     DPTR
    MOVX     A,@DPTR
    INC     DPTR

    MOV     C,B.0
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.1
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.2
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.3
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.4
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.5
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.6
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK
    MOV     C,B.7
    MOV      LED_REG,C
    RRC     A
    MOV      LED_GREEN,C
    SETB     LED_SRCK
    CLR      LED_SRCK

    DJNZ     R7,?C0003
    SETB     LED_G
    SETB     LED_RCK
    CLR      LED_RCK
    MOV      A,dis_line
    ORL      A,#080H
    MOV      P1,A
    INC      dis_line
    ANL      dis_line,#0FH
    RET      

    END


其实最好的方法是用字节方式输出数据,完全不需要位操作,一次输出8位反而比这个要快很多很多
同时,最好改用全局指针dis_adr,只管加就行了
displine:
    MOV      A,#LOW (dis_adr)
    MOV      DPL,A
    MOV     A,#HIGH (dis_adr)
    MOV      DPH,A
    MOV      R7,MAX_X
?C0003    
    MOVX     A,@DPTR
    INC     DPTR
    MOV     DATA_PORT,A
    SETB     LED_SRCK
    CLR      LED_SRCK
    DJNZ     R7,?C0003
    
    MOV      A,DPL
    MOV      dis_adr
    MOV      A,DPh
    MOV      dis_adr+1,A

    SETB     LED_G
    SETB     LED_RCK
    CLR      LED_RCK
    MOV      A,dis_line
    ORL      A,#080H
    MOV      P1,A
    INC      dis_line
    ANL      dis_line,#0FH
    RET      

    END

使用特权

评论回复
10
xwj|  楼主 | 2008-1-9 12:55 | 只看该作者

wnhb ,给我地址吧,人多就只能给你一块了

使用特权

评论回复
11
xwj|  楼主 | 2008-1-9 13:04 | 只看该作者

两种方式的内存映射图,希望能看明白

小屏的方式,节约内存和IO口,但速度慢



正常大屏的方式,至少4排起(1kBYTE RAM),速度相当快




我上传的程序已经有完整的图形和汉字显示,实际上简单修改下写屏程序就能用于任何点阵显示的场合,比如液晶屏、OSD叠加等

使用特权

评论回复
12
sz_kd| | 2008-1-9 13:08 | 只看该作者

我也想要,不知道有没有

cyj411022tx@163.com

使用特权

评论回复
13
LPcfANS| | 2008-1-9 13:34 | 只看该作者

哈哈..不错.说不定哪天用到..顶.

使用特权

评论回复
14
martial| | 2008-1-9 13:56 | 只看该作者

xwj,还有吗?我也想要。martial_yang@163.com

使用特权

评论回复
15
古道热肠| | 2008-1-9 15:02 | 只看该作者

哈哈,LED屏的难点是执行屏幕内容左移一列的操作

试试就知道了。平滑左移显示内容占用相当多的资源,值得大家探讨。

使用特权

评论回复
16
程序匠人| | 2008-1-9 17:03 | 只看该作者

看来匠人又来晚了,没赶上免费的午餐

使用特权

评论回复
17
john_light| | 2008-1-9 17:28 | 只看该作者

老徐

使用特权

评论回复
18
xwj|  楼主 | 2008-1-9 17:33 | 只看该作者

???

使用特权

评论回复
19
lenglx| | 2008-1-9 18:02 | 只看该作者

呵呵

你还是比较厉害哈,居然这么短的时间,就将这个板子的信号都理出来了,还编了程序了。

6B595是以前的LED使用的,现在基本不会用了。价格奇贵。
低端的用HC595就够了。
高端的使用恒流的驱动。现在用LED显示的恒流驱动器件很多,价格也相对比较便宜。

至于红/绿数据共用时钟。是因为:
1.模块不是专门为单片机控制设计的。
2.即使单片机控制,也有好处。至少你可以少输出几个时钟信号,节约一点MCU的宝贵的时间资源。

实际上,51单片机扫描时钟,最好使用串口的模式0,让串口自动输出时钟信号。这期间,你可以做其它工作,比如取下一个字节的显示数据。
不过这个方式只能输出一个数据信号,对于单色,16行数据比较合适。
如果是双色或者有多于一个的数据信号,可以使用一个HC165什么的移位寄存器,共用串口的时钟端。如果想要有更多的自由时间,可以在165之前再加一个锁存器。

另外:当数据移位完成,准备输出行选择/锁存数据前一刻,应当使允许信号无效。否则屏体在外界光线比较暗的情况下,看起来会有阴覲OSThttps://bbs.21ic.com/club/bbs/SaveReAnnou时间经常出差。郁闷。。。

使用特权

评论回复
20
lelee007| | 2008-1-9 18:11 | 只看该作者

嘿嘿

不错啊
二姨家有免费的午餐
呵呵,想不聚人气都难啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

xwj

288

主题

22800

帖子

35

粉丝