sujingliang 发表于 2023-11-24 21:44:25

STC89C52RC 驱动16x64LED点阵模块驱动记录(二)左移实现

一、循环左移源码
#include <STC89C5xRC.H>
#include<intrins.h>

sbit SH_CP = P1^5;
sbit DS = P2^7;
sbit ST_CP = P1^6;


//PCtoLCD2002
//
unsigned char code Table_row[] = {


//阳码,顺向,逐行式,C51,左右反转

0xFE,0xFF,0xFD,0xFB,0xFD,0xF7,0xC0,0x17,0xF7,0xFF,0xF7,0xBF,0xFB,0x70,0xFA,0xF7,
0xFD,0xF7,0xFA,0xF7,0xF7,0x77,0xEF,0xB7,0xEF,0xD7,0xFF,0xEB,0x80,0x1D,0xFF,0xFF,/*"这",1*/

0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xC0,0x01,0xFF,0xDF,0xFF,0x6F,0xFF,0x77,0xFF,0x7B,
0xE0,0x03,0xFF,0x7F,0xFB,0x6F,0xF7,0x77,0xEF,0x7B,0xDF,0x7D,0xFF,0x5F,0xFF,0xBF,/*"东",2*/

0xFF,0xFF,0x80,0x00,0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xE0,0x03,0xED,0xDB,0xED,0xDB,
0xED,0xDB,0xED,0xDB,0xE3,0xEB,0xEF,0xF3,0xEF,0xFB,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,/*"西",3*/

0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,
0xFE,0xBF,0xFE,0xBF,0xFD,0xDF,0xFD,0xDF,0xFB,0xAF,0xF7,0x77,0xEF,0x7B,0x9F,0xFC,/*"太",4*/

0xFE,0xFB,0xFE,0xFB,0xC2,0xFB,0xFC,0x3B,0xF5,0xEA,0xDB,0xF2,0xD4,0xFA,0xCF,0x3A,
0xFF,0xFB,0x80,0x1B,0xF6,0xFB,0xF6,0xFB,0xB7,0x75,0xB7,0x6D,0x8F,0xBD,0xFF,0xDE,/*"烧",5*/

0xFD,0xFF,0xFB,0xE1,0xFB,0xED,0x80,0x0D,0xFF,0xED,0xFF,0xE1,0xF6,0xED,0xD5,0xAD,
0xDB,0xAD,0xDB,0xA1,0xD5,0xAD,0xD6,0xAD,0xDF,0xAD,0xDF,0xAD,0xC0,0x2D,0xDF,0xE6,/*"脑",6*/
};

/*
void delayms(unsigned int m)
{
        int i,j;
        for(i=0; i<m; i++)
                for(j=0; j<120; j++);
}
*/

void HC595(unsigned char dat)
{
        unsigned char j;
        for(j=0;j<8;j++)
        {
                SH_CP = 0;        //为移位准备
                DS = dat & 0x01;        //先低位
                dat=dat>>1;
                SH_CP =1;        //上升沿,移位
        }
}


void Matrix16x16(unsigned char num)
{
        unsigned int k,i,t,y,t1;
        unsigned int m,n;
        unsigned int Char_num=num*32;
       
        for(m=0;m<Char_num;m++)    //动起来吧
        {
                t=m/8;                //位移除以8取整数部分
                t1=m/16;    //位移除以16取整数部分
                y=m%8;                                        //位移除以8取余部分
                for(n=0;n<1;n++)//控制显示速度,防止闪烁,设成1了,提高速度,闪烁严重,可以把STEP 设置大一些,如n+=2,一次迈2步,显示速度会提高
                {
                        for(k=0;k<16;k++)        //行扫描
                        {
                                //P1=0xff;
                               
                                for(i=0;i<num;i++)   //控制第几个字
                                {
                                       
                                        //HC595(Table_row[(32*i+2*k+1)]);                //
                                        //HC595(Table_row[(32*i+2*k+0)]);                //

                                                if(t%2==0){
                                                        HC595(Table_row[(32*(i+t1)+2*k+1)%Char_num]>>y|Table_row[(32*(i+t1)+2*k+0)%Char_num]<<(8-y));
                                                        HC595(Table_row[(32*(i+t1)+2*k+0)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+1)%Char_num]<<(8-y));
                                                }
                                                else
                                                {
                                                        HC595(Table_row[(32*(i+t1)+2*k+0)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+1)%Char_num]<<(8-y));
                                                        HC595(Table_row[(32*(i+1+t1)+2*k+1)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+0)%Char_num]<<(8-y));
                                                }
                          }
                          ST_CP = 0;
                          ST_CP = 1; //并行输出
                          
                      P1=16-k;    //从左往右显示,P1低4位为74HC154输入,高4位未使用
                                        //_nop_();
                                        //_nop_();
                                        //_nop_();
                                        //_nop_();
                                //delayms(2);//所有的延时都关了,速度还有点欠缺,晃眼
                        }
                }
        }
}

void main(){
        while(1){
                Matrix16x16(4);
        }
}
二、左移不循环源码
#include <STC89C5xRC.H>
#include<intrins.h>

sbit SH_CP = P1^5;
sbit DS = P2^7;
sbit ST_CP = P1^6;


//PCtoLCD2002
//
unsigned char code Table_row[] = {


//这个调了好久,现在贴的不知道是不是实际跑的字模了
//阳码,顺向,逐行式,C51,左右反转
        /*
0xFE,0xFF,0xFE,0xFF,0xFE,0xC0,0xC0,0xDF,0xDF,0x5F,0xEF,0x6D,0xFD,0xAB,0xFD,0xD7,
0xFD,0xF7,0xFA,0xEB,0xFA,0xDB,0xF7,0x5D,0xF7,0x7E,0xEF,0xBF,0xDF,0xDF,0xBF,0xEF,
0xFF,0xFF,0xFE,0xFB,0xC3,0x37,0xDB,0xB7,0xDB,0xBF,0xDB,0xBF,0xDB,0xB0,0xDB,0xB7,
0xDB,0xB7,0xD2,0xB7,0xEB,0x37,0xFB,0xB7,0xFB,0xF7,0xFB,0xEB,0x80,0x1D,0xFF,0xFF,
0xFF,0x7F,0xEF,0x7B,0xEF,0x77,0xF7,0x6F,0xFB,0x6F,0xFF,0x7F,0x80,0x00,0xFD,0xDF,
0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xBD,0xEF,0xBD,0xEF,0xBD,0xF7,0x83,0xFB,0xFF,0xFC,
0xFE,0xEF,0xFE,0xEF,0xFE,0xEF,0x80,0x6D,0xFD,0x6D,0xFB,0xAD,0xFB,0xCD,0xFF,0xED,
0xC0,0x6D,0xDB,0x6D,0xDB,0x6D,0xDB,0x6D,0xDB,0x6D,0xC0,0x6F,0xDF,0x6F,0xFF,0xEF,
*/

0xFE,0xFF,0xFD,0xFB,0xFD,0xF7,0xC0,0x17,0xF7,0xFF,0xF7,0xBF,0xFB,0x70,0xFA,0xF7,
0xFD,0xF7,0xFA,0xF7,0xF7,0x77,0xEF,0xB7,0xEF,0xD7,0xFF,0xEB,0x80,0x1D,0xFF,0xFF,/*"这",1*/

0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xC0,0x01,0xFF,0xDF,0xFF,0x6F,0xFF,0x77,0xFF,0x7B,
0xE0,0x03,0xFF,0x7F,0xFB,0x6F,0xF7,0x77,0xEF,0x7B,0xDF,0x7D,0xFF,0x5F,0xFF,0xBF,/*"东",2*/

0xFF,0xFF,0x80,0x00,0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xE0,0x03,0xED,0xDB,0xED,0xDB,
0xED,0xDB,0xED,0xDB,0xE3,0xEB,0xEF,0xF3,0xEF,0xFB,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,/*"西",3*/

0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,
0xFE,0xBF,0xFE,0xBF,0xFD,0xDF,0xFD,0xDF,0xFB,0xAF,0xF7,0x77,0xEF,0x7B,0x9F,0xFC,/*"太",4*/

0xFE,0xFB,0xFE,0xFB,0xC2,0xFB,0xFC,0x3B,0xF5,0xEA,0xDB,0xF2,0xD4,0xFA,0xCF,0x3A,
0xFF,0xFB,0x80,0x1B,0xF6,0xFB,0xF6,0xFB,0xB7,0x75,0xB7,0x6D,0x8F,0xBD,0xFF,0xDE,/*"烧",5*/

0xFD,0xFF,0xFB,0xE1,0xFB,0xED,0x80,0x0D,0xFF,0xED,0xFF,0xE1,0xF6,0xED,0xD5,0xAD,
0xDB,0xAD,0xDB,0xA1,0xD5,0xAD,0xD6,0xAD,0xDF,0xAD,0xDF,0xAD,0xC0,0x2D,0xDF,0xE6,/*"脑",6*/


0xFD,0xFB,0x81,0x83,0xF6,0xED,0xFF,0xFE,0xE0,0x03,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,
0xE0,0x03,0xEF,0xFB,0xE0,0x03,0xFB,0xEF,0x80,0x00,0xFB,0xEF,0xFB,0xF7,0xFB,0xFB,/*"算",0*/

0xFD,0xFF,0xFD,0xFB,0xFD,0xF7,0xFD,0xF7,0xC0,0x1E,0xFD,0xFD,0xFD,0xFD,0xFD,0xF7,
0x80,0x07,0xFD,0xFB,0xFE,0xF8,0xFF,0x7B,0xF7,0xBB,0xEF,0xDB,0xC0,0x0B,0xDF,0xDF,/*"法",1*/

0xFE,0xFF,0xFE,0xFB,0xFE,0xFB,0xDE,0xFB,0xEE,0xFB,0xF6,0xFB,0xFA,0x83,0xFC,0xFB,
0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,0xBE,0xFB,0xBE,0x9B,0xBE,0xE3,0x81,0xFB,0xFF,0xFF,/*"比",2*/

0xFD,0xFB,0xFB,0xFB,0xFB,0xFB,0x80,0x40,0xFF,0xFD,0xEE,0xF5,0xDF,0x76,0xBF,0x80,
0xEE,0xF7,0xEE,0xF7,0xF5,0xC7,0xF5,0xF0,0xFB,0xF5,0xF5,0xF7,0xEE,0xF7,0x9F,0x37,/*"较",3*/

0xFE,0xF7,0xFD,0xF7,0xFD,0xF7,0xFF,0xF7,0xC0,0x37,0xFF,0xC0,0xEF,0xF7,0xEF,0x77,
0xEF,0x77,0xF6,0xF7,0xF6,0xF7,0xF6,0xC7,0xFA,0xF8,0xFB,0xFD,0x80,0x1F,0xFF,0xFF,/*"垃",4*/

0xFF,0xF7,0xE0,0x17,0xEF,0x77,0xF7,0x77,0xF7,0x77,0xFB,0x40,0xC3,0x77,0xDF,0x77,
0xDF,0x77,0xEE,0xB7,0xEE,0x87,0xF5,0xB8,0xFB,0xDD,0xF5,0xDF,0xEE,0xEF,0x9F,0x3F,/*"圾",5*/

0xFD,0xFF,0xFD,0xFB,0xC0,0x17,0xFD,0xF7,0xE0,0x3F,0xED,0xBF,0xED,0xB0,0xE0,0x37,
0xF8,0xF7,0xF5,0x77,0xED,0xB7,0xDD,0xD7,0xFD,0xF7,0xFF,0xEB,0x80,0x1D,0xFF,0xFF,/*"速",6*/

0xFF,0x7F,0xFE,0xFF,0x80,0x03,0xFB,0xBB,0xFB,0xBB,0xC0,0x03,0xFB,0xBB,0xFB,0xBB,
0xF8,0x3B,0xFF,0xFB,0xF0,0x0B,0xF7,0xDB,0xFB,0xBD,0xFC,0x7D,0xF3,0x9E,0x8F,0xE3,/*"度",7*/

0xE0,0xFF,0xFF,0x01,0xFF,0x7F,0xE0,0x03,0xFF,0xBF,0x80,0x00,0xFF,0xDF,0xFF,0xEF,
0xF0,0x07,0xF7,0xEB,0xF0,0x0D,0xF7,0xEE,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,/*"看",0*/

0xE0,0xFF,0xFF,0x01,0xFF,0x7F,0xE0,0x03,0xFF,0xBF,0x80,0x00,0xFF,0xDF,0xFF,0xEF,
0xF0,0x07,0xF7,0xEB,0xF0,0x0D,0xF7,0xEE,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,/*"看",1*/

0xFF,0xFF,0x80,0x01,0xF7,0xFF,0xF7,0xFF,0xF7,0x07,0xF7,0x77,0xF7,0x77,0xF7,0x77,
0xF7,0x77,0xF7,0x77,0xF7,0x07,0xF7,0x77,0xF7,0xFF,0xF7,0xFF,0xF5,0xFF,0xFB,0xFF,/*"可",2*/

0xF7,0xFF,0xF7,0xDF,0xF7,0xBB,0xF7,0x7B,0xF7,0x7B,0xF7,0xFB,0xF7,0xFB,0xFB,0xFB,
0xFB,0xFB,0xFB,0xFB,0xFD,0xDB,0xF5,0xEB,0xEE,0xF3,0xDF,0x7B,0xBF,0xBF,0xBF,0xDF,/*"以",3*/

0xFF,0xFF,0xF0,0x07,0xF7,0xF7,0xF7,0xF7,0xF0,0x07,0xF7,0xF7,0xF7,0xF7,0xF0,0x07,
0xFD,0xDF,0xDD,0xDD,0xDD,0xDB,0xED,0xD7,0xF5,0xD7,0xFD,0xDF,0x80,0x00,0xFF,0xFF,/*"显",4*/

0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0xFF,0x7F,
0xFF,0x7F,0xF7,0x77,0xEF,0x77,0xDF,0x7B,0xBF,0x7D,0xBF,0x7E,0xFF,0x5F,0xFF,0xBF,/*"示",5*/

0xFF,0xFF,0xF8,0x0F,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,
0xFB,0xEF,0xFB,0xEF,0xFB,0xF7,0xBB,0xF7,0xBB,0xFB,0xBB,0xFB,0x87,0xFD,0xFF,0xFE,/*"几",6*/

0xFF,0x7F,0xFF,0x7F,0xFE,0xBF,0xFD,0xDF,0xFB,0xEF,0xF7,0xF7,0xEF,0x7B,0x9F,0x7C,
0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,/*"个",7*/

0xFF,0xBF,0xFF,0x7F,0x80,0x01,0xBF,0xFD,0xDF,0xFE,0xF8,0x07,0xFD,0xFF,0xFE,0xFF,
0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,/*"字",8*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"OxFF",8*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"OxFF",8*/


};

/*
void delayms(unsigned int m)
{
        int i,j;
        for(i=0; i<m; i++)
                for(j=0; j<120; j++);
}
*/

void HC595(unsigned char dat)
{
        unsigned char j;
        for(j=0;j<8;j++)
        {
                SH_CP = 0;        //为移位准备
                DS = dat & 0x01;        //先低位
                dat=dat>>1;
                SH_CP =1;        //上升沿,移位
        }
}


void Matrix16x16(unsigned char num)
{
        unsigned int k,i,t,y,t1;
        unsigned int m,n;
        unsigned int Char_num=num*32;
       
        for(m=0;m<Char_num;m++)    //为移动预留
        {
                t=m/8;                //位移除以8取整数部分
                t1=m/16;
                y=m%8;                                        //位移除以8取余部分
                for(n=0;n<1;n++)//控制显示速度,防止闪烁
                {
                        for(k=0;k<16;k++)        //行扫描
                        {
                                //P1=0xff;
                               
                                //for(i=0;i<num;i++)   //控制第几个字
                                for(i=0;i<4;i++)   //控制第几个字
                               
                                {
                                       
                                        //HC595(Table_row[(32*i+2*k+1)]);                //
                                        //HC595(Table_row[(32*i+2*k+0)]);                //

                                                if(t%2==0){
                                                        //HC595(Table_row[(32*(i+t1)+2*k+1)%Char_num]>>y|Table_row[(32*(i+t1)+2*k+0)%Char_num]<<(8-y));
                                                        //HC595(Table_row[(32*(i+t1)+2*k+0)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+1)%Char_num]<<(8-y));
                                                        if ((32*(i+t1)+2*k)<sizeof(Table_row)-1&&(32*(i+t1+1)+2*k+1)<sizeof(Table_row)-1&&(32*(i+t1)+2*k+1)<sizeof(Table_row)-1)
                                                        {
                                                                HC595(Table_row[(32*(i+t1)+2*k+1)]>>y|Table_row[(32*(i+t1)+2*k+0)]<<(8-y));
                                                                HC595(Table_row[(32*(i+t1)+2*k+0)]>>y|Table_row[(32*(i+1+t1)+2*k+1)]<<(8-y));
                                                        }
                                                        else
                                                        {
                                                                HC595(0xff);
                                                                HC595(0xff);
                                                        }
                                                }
                                                else
                                                {
                                                        if ((32*(i+1+t1)+2*k+1)<sizeof(Table_row)-1&&(32*(i+t1)+2*k+0)<sizeof(Table_row)-1&&(32*(i+1+t1)+2*k+0)<sizeof(Table_row)-1)
                                                        {
                                                                HC595(Table_row[(32*(i+t1)+2*k+0)]>>y|Table_row[(32*(i+1+t1)+2*k+1)]<<(8-y));
                                                                HC595(Table_row[(32*(i+1+t1)+2*k+1)]>>y|Table_row[(32*(i+1+t1)+2*k+0)]<<(8-y));
                                                        }
                                                        else
                                                        {
                                                                HC595(0xff);
                                                                HC595(0xff);
                                                        }
                                                }
                          }
                          ST_CP = 0;
                          ST_CP = 1; //并行输出
                          
          P1=16-k;    //从左往右显示,P1低4位为74HC154输入,高4位未使用
                                        //_nop_();
                                        //_nop_();
                                        //_nop_();
                                        //_nop_();
                          //delayms(2);//可以不用delay,89C52已经够慢了
                        }
                }
        }
}

void main(){
        while(1){
               
                Matrix16x16(23);
        }
}
三、总结


   最有效的提高移动速度的方法是:

   1、烧录时,使能6T,可以提高一倍速度;

      2、for(n=0;n<1;n++),那句可以改成for(n=0;n<16;n+=2),显示可以清楚一些,步子大了,显示速度也快了,并且人眼几乎看不出和一步一步走的差别。

          这个算法数据本身没有动,通过取值来控制输出。但就像牛屎芯片一样,自己都看不懂到底是个啥。

文章内容成文于半年前,先发于个人blog。
听说发文可以得芯愿,换MCU,^-^{:titter:}。




页: [1]
查看完整版本: STC89C52RC 驱动16x64LED点阵模块驱动记录(二)左移实现