这算法太烧脑,弄完了,头晕眼花的
算法还是不太行,显示的速度和效果和原来的驱动差距不小
一、循环左移源码
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),显示可以清楚一些,步子大了,显示速度也快了,并且人眼几乎看不出和一步一步走的差别。
这个算法数据本身没有动,通过取值来控制输出。但就像牛屎芯片一样,自己都看不懂到底是个啥。