读书人

c51,请高手帮忙解释一下显示文字的算法

发布时间: 2012-05-14 15:24:34 作者: rapoo

c51,请高手帮忙解释一下显示文字的算法
#include "reg51.h"
#define BLKN 8 //列锁存器数(=LED显示字数*2)
#define TOTAL 19 //待显示字个数,本例共20个
#define CONIO P1 //显示控制口
sbit G=CONIO^7; //CONIO.7为154译码器显示允许控制信号端口,0时输出,1时输出全为高阻态.
sbit CLK=CONIO^6; //CONIO.6为595输出锁存器时钟信号端,1时输出数据,从1到0时锁存输出数据.
sbit SCLR=CONIO^5; //CONIO.5为595移位寄存器清零口,平时为1,为0时,输出全为0.
unsigned char idata dispram[(BLKN/2)*32]={0}; //显示区缓存,四字共4*32单元

//***********字模表*********************************//
unsigned char code Bmp[][32]={

{0x20,0x13,0x12,0x02,0xFE,0x0A,0x12,0x3B,0x56,0x90,0x10,0x11,0x11,0x12,0x14,0x18,
0x08,0xFC,0x08,0x08,0x08,0x08,0x08,0xF8,0xA8,0xA0,0xA0,0x20,0x22,0x22,0x1E,0x00},

{0x01,0x00,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80,0x00,
0x00,0x84,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x02,0x02,0x02,0xFF,0x04,0x09,0x09,0x11,0x3F,0x01,0x09,0x09,0x11,0x21,0x45,0x02,
0x00,0x00,0x04,0xFE,0x00,0x00,0x00,0x10,0xF8,0x00,0x40,0x20,0x10,0x18,0x08,0x00},

{0x01,0x09,0x09,0x11,0x11,0x20,0x03,0x0C,0x3F,0xC8,0x0F,0x08,0x0F,0x08,0x0F,0x08,
0x00,0x20,0x10,0x0C,0x24,0xC0,0x00,0x08,0xFC,0x08,0xF8,0x08,0xF8,0x08,0xF8,0x08},

{0x02,0x02,0x02,0x7F,0x42,0x42,0x7F,0x42,0x42,0x7F,0x42,0x02,0x02,0x02,0x01,0x00,
0x00,0x00,0x10,0xF8,0x10,0x10,0xF0,0x10,0x10,0xF0,0x10,0x00,0x04,0x04,0xFC,0x00},

{0x00,0x3F,0x00,0x00,0x00,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x02,
0x00,0xF0,0x10,0x20,0x40,0x80,0x04,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x08,0x08,0x0F,0x10,0x10,0x37,0x50,0x90,0x17,0x10,0x13,0x12,0x12,0x12,0x13,0x12,
0x80,0x44,0xFE,0x00,0x08,0xFC,0x00,0x08,0xFC,0x00,0xF8,0x08,0x08,0x08,0xF8,0x08},

{0x02,0x04,0x1F,0x10,0x10,0x1F,0x10,0x1F,0x10,0x10,0x1F,0x02,0x51,0x50,0x90,0x0F,
0x00,0x10,0xF8,0x10,0x10,0xF0,0x10,0xF0,0x10,0x10,0xF0,0x00,0x84,0x92,0x12,0xF0},

{0x10,0x10,0x10,0x13,0xFC,0x10,0x10,0x13,0x1A,0x31,0xD1,0x10,0x10,0x10,0x51,0x26,
0x40,0x40,0x48,0xFC,0x40,0x40,0x40,0xF8,0x08,0x10,0x10,0xA0,0x40,0xB0,0x0E,0x04},

{0x10,0x10,0x10,0x13,0xFC,0x10,0x31,0x3A,0x54,0x50,0x90,0x10,0x10,0x10,0x13,0x1C,
0x40,0x20,0x04,0xFE,0x00,0x88,0x06,0x8A,0x88,0x50,0x50,0x20,0x50,0x88,0x0E,0x04},

{0x10,0x10,0x10,0x13,0xFC,0x10,0x10,0x13,0x1A,0x31,0xD1,0x10,0x10,0x10,0x51,0x26,
0x40,0x40,0x48,0xFC,0x40,0x40,0x40,0xF8,0x08,0x10,0x10,0xA0,0x40,0xB0,0x0E,0x04},

{0x10,0x10,0x24,0x44,0xFE,0x02,0x7C,0x44,0x7C,0x44,0x44,0x7C,0x44,0x44,0x54,0x48,
0x80,0x88,0x98,0xA0,0xC0,0x84,0x84,0x7C,0x00,0x88,0x98,0xA0,0xC0,0x82,0x82,0x7E,},

{0x04,0x04,0xFF,0x04,0x04,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
0x40,0x44,0xFE,0x40,0x48,0xFC,0x08,0x08,0x08,0x08,0x48,0x28,0x10,0x00,0x00,0x00},

{0x22,0x08,0x19,0x18,0x09,0x20,0x00,0x44,0xFF,0xFE,0x04,0x40,0x09,0x20,0x11,0x10,
0x2F,0xEE,0xC1,0x04,0x01,0x10,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00},

{0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x20,0x3F,0xF0,0x02,0x20,0x02,0x20,0x12,0x30,
0x32,0x2C,0x22,0x26,0x44,0x22,0x84,0x20,0x08,0x20,0x10,0xA0,0x20,0x40,0x00,0x00},

{0x00,0x7F,0x40,0x4F,0x48,0x4F,0x40,0x5F,0x50,0x51,0x51,0x52,0x44,0x48,0x7F,0x40,
0x04,0xFE,0x04,0xE4,0x24,0xE4,0x04,0xF4,0x14,0x14,0x14,0x94,0x44,0x24,0xFC,0x04},

{0x41,0x31,0x1F,0x01,0x80,0x6F,0x21,0x01,0x1F,0x29,0xE9,0x2A,0x2C,0x28,0x28,0x28,
0x20,0x24,0xFE,0x20,0x08,0xFC,0x20,0x24,0xFE,0x24,0x24,0xD4,0x0C,0x04,0x14,0x08},

{0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x3E,0x22,0x22,0x22,0x2A,0x24,0x40,0x81,0x00,
0x80,0xA0,0x90,0xFC,0x80,0x80,0x84,0x44,0x48,0x48,0x30,0x20,0x62,0x92,0x0A,0x06},

{0x00,0x00,0x08,0xFC,0x10,0x17,0x10,0x10,0x10,0x10,0x1D,0xF1,0x41,0x02,0x04,0x08,
0x80,0x80,0x80,0x80,0x84,0xFE,0x84,0x84,0x84,0x84,0x04,0x04,0x04,0x44,0x28,0x10},



{0xF8,0x3F,0xE7,0xCF,0xDF,0xF7,0xBF,0xFB,0xB3,0x9B,0x73,0x9D,0x7F,0xFD,0x7F,0xFD,
0x6F,0xED,0x67,0xCD,0xB3,0x9B,0xB8,0x3B,0xDF,0xF7,0xF7,0xCF,0xF8,0x3F,0xFF,0xFF}/*:*笑脸/
};


//***********字模表*********************************//
unsigned char code Bmp1[][32]={
{0xF9,0xBF,0xC7,0xAF,0xF7,0xB7,0xF7,0xB7,0xF7,0xBF,0x00,0x01,0xF7,0xBF,0xF7,0xB7,
0xF1,0xD7,0xC7,0xCF,0x37,0xDF,0xF7,0xAF,0xF6,0x6D,0xF7,0xF5,0xD7,0xF9,0xEF,0xFD
}/*我*/,


{0xFF,0x07,0xC0,0x6F,0xED,0xEF,0xF6,0xDF,0xC0,0x01,0xDD,0xFD,0xBD,0xFF,0xC0,0x03,
0xFB,0xFF,0xF8,0x0F,0xF3,0xDF,0xF4,0xBF,0xEF,0x3F,0x9C,0xCF,0x73,0xF1,0xCF,0xFB
}/*爱*/,


{0xF7,0xDF,0xF9,0xCF,0xFB,0xBF,0xC0,0x07,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,
0xC0,0x07,0xDE,0xF7,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF
}/*单*/,

{0xFF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0xBB,0xE0,0x01,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,
0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xDF,0xEF,0xDF,0xEF,0xBF,0xEF,0x70,0xEF
}/*片*/,

{0xEF,0xFF,0xEF,0x07,0xEF,0x77,0x01,0x77,0xEF,0x77,0xEF,0x77,0xC7,0x77,0xCB,0x77,
0xAB,0x77,0xAF,0x77,0x6E,0xF7,0x0EE,0xF5,0xED,0xF5,0xED,0xF5,0xEB,0xF9,0xEF,0xFF
}/*机*/

{0xF8,0x3F,0xE7,0xCF,0xDF,0xF7,0xBF,0xFB,0xB3,0x9B,0x73,0x9D,0x7F,0xFD,0x7F,0xFD,
0x6F,0xED,0x67,0xCD,0xB3,0x9B,0xB8,0x3B,0xDF,0xF7,0xF7,0xCF,0xF8,0x3F,0xFF,0xFF}/*:*/
};

void main(void)
{
register unsigned char i,j,k,l,q,w;
//初始化
SCON = 0x00; //串口工作模式0:移位寄存器方式
TMOD = 0x01; //定时器T0工作方式1:16位方式
TR0 = 1; //启动定时器T0
CONIO = 0x3f; //CONIO端口初值
IE = 0x82; //允许定时器T0中断
//
while (1)
{
delay(2000); //2秒
//第一种显示效果:卷帘出显示笑脸图案
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp1[5][i];}
if (i%2) delay(120);
}
delay(1000);
//卷帘出显示文字,每次字数为BLKN/2,共显示TOTAL*2/BLKN次
for (w=0;w<TOTAL*2/BLKN;w++)
{
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp[q+w*BLKN/2][i];}
if (i%2) delay(120);
}
delay(3000);
}
//第一种显示效果:卷帘出显示笑脸图案
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp1[5][i];}
if (i%2) delay(120);
}
delay(1000);
//第二种显示效果:向上滚屏,每次BLKN/2个字
for (i=0; i<TOTAL*2/BLKN; i++)
{
for (j=0; j<16; j++)
{
for (k=0; k<15; k++)
{
for(q=0;q<BLKN/2;q++)
{dispram[k*2+q*32] = dispram[(k+1)*2+q*32];dispram[k*2+1+q*32] = dispram[(k+1)*2+1+q*32];}
}
for(q=0;q<BLKN/2;q++)
{dispram[30+q*32] = Bmp[q+i*BLKN/2][j*2];dispram[31+q*32] = Bmp[q+i*BLKN/2][j*2+1];}
delay(100);
}
delay(3000);//滚动暂停
}
//第一种显示效果:卷帘出黑屏
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=0xff;}
if (i%2) delay(120);
}
delay(1000);
//第三种显示效果:左移出显示
for (i=0; i<TOTAL; i++)
{
for (j=0; j<2; j++)
for (k=0; k<8; k++)
{
for (l=0; l<16; l++)
{
for(q=0;q<BLKN/2;q++)
{
dispram[l*2+q*32] = dispram[l*2+q*32]<<1 | dispram[l*2+1+q*32]>>7;
if(q==BLKN/2-1) dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | Bmp[i][l*2+j]>>(7-k);


else dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | dispram[l*2+(q+1)*32]>>7;
}
}
delay(100);
}
}
delay(3000);
//第一种显示效果:卷帘出黑屏
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=0xff;}
if (i%2) delay(120);
}
delay(1000);
//第三种显示效果:右移出显示
for (i=0; i<TOTAL; i++)
{
for (j=2; j>0; j--)
for (k=0; k<8; k++)
{
for (l=0; l<16; l++)
{
for(q=0;q<BLKN/2;q++)
{
dispram[l*2+1+q*32] = dispram[l*2+1+q*32]>>1 | dispram[l*2+q*32]<<7;
if(q==0) dispram[l*2+q*32] = dispram[l*2+q*32]>>1 | Bmp[i][l*2+j-1]<<(7-k);
else dispram[l*2+q*32] = dispram[l*2+q*32]>>1 | dispram[l*2+1+(q-1)*32]<<7;
}
}
delay(100);
}
}
delay(3000);
//第四种显示效果:卷帘入
for (i=0;i<32;i++)
{
for(q=0;q<BLKN/2;q++)
{dispram[i+q*32]= 0x00;}
if (i%2) delay(100);
}
}
}


/**********显示屏扫描(定时器T0中断)函数**********/
void leddisplay(void) interrupt 1 using 1
{
register unsigned char m, n=BLKN;
TH0 = 0xFc; //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
TL0 = 0x18;
m = CONIO; //读取当前显示的行号
m = ++m & 0x0f; //行号加1,屏蔽高4位
do {
n--;
SBUF = dispram[m*2+(n/2)*30 + n]; //送显示数据
while (!TI); TI = 0;
}while (n); //完成一行数据的发送
G = 1; //消隐(关闭显示)
CONIO &= 0xf0; //行号端口清○
CLK=1; //显示数据打入输出锁存器
CONIO |= m; //写入行号
CLK=0; //锁存显示数据
G = 0; //打开显示
}




[解决办法]
不是都有注释么?
显示其实就是对dispram数组的值置位(1)或者清零.
他显示的给种效果,就是通过for循环给dispram数组送值,找一个样例自己在纸上跟着写一下你就明白了
[解决办法]

探讨

不是都有注释么?
显示其实就是对dispram数组的值置位(1)或者清零.
他显示的给种效果,就是通过for循环给dispram数组送值,找一个样例自己在纸上跟着写一下你就明白了

[解决办法]
主要是显示缓存dispram,程序往里写数据,显示程序把数据发到显示设备上。

读书人网 >C语言

热点推荐