一、循环左移源码
- #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,^-^ 。
|