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

这算法太烧脑,弄完了,头晕眼花的

算法还是不太行,显示的速度和效果和原来的驱动差距不小

一、循环左移源码

main.c

#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);
	}
}

二、左移不循环源码

main.c

#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);
	}
}

三、总结

        终于有进展了,算法可能不是最优,但实现了。

        移动速度慢主要的原因是595是外部设备,对它的操作会远远慢于51内部的计算耗时。尝试过优化除法、乘法、取余这些运算,但提高效果有效。

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

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

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

        

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

8925011822d047ef8b94175b61ff3d52.jpg

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值