📄 1616led.c.bak
字号:
#include"reg52.h"
typedef unsigned char byte;
typedef unsigned int word;
sbit datah595=P1^0;
sbit datal595=P1^1;
sbit clk595=P1^2;
sbit str595=P1^3;
sbit oe595=P1^4;
word data datah,datal; /*datah是行数据,datal是列选通*/
/*取模方式:阴码、逐列式、逆向、十六进制、C51格式自定义 (使用Pctolcd2002软件)*/
byte code displaydata[]= /*在ROM中定义一个可变长度数组,供用户填充一定个数的字模*/
{ /*可填充的最大字模数取决于您所选用的单片机ROM空间大小*/
0x00,0x00, /*表头*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//在以下位置插入字模
0x14,0x20,0x24,0x10,0x44,0x4C,0x84,0x43,0x64,0x43,0x1C,0x2C,0x20,0x20,0x18,0x10,
0x0F,0x0C,0xE8,0x03,0x08,0x06,0x08,0x18,0x28,0x30,0x18,0x60,0x08,0x20,0x00,0x00,/*"欢",0*/
0x40,0x40,0x41,0x20,0xCE,0x1F,0x04,0x20,0x00,0x40,0xFC,0x47,0x04,0x42,0x02,0x41,
0x02,0x40,0xFC,0x5F,0x04,0x40,0x04,0x42,0x04,0x44,0xFC,0x43,0x00,0x40,0x00,0x00,/*"迎",1*/
0x80,0x00,0x40,0x20,0x30,0x38,0xFC,0x03,0x03,0x38,0x90,0x40,0x68,0x40,0x06,0x49,
0x04,0x52,0xF4,0x41,0x04,0x40,0x24,0x70,0x44,0x00,0x8C,0x09,0x04,0x30,0x00,0x00,/*"您",2*/
0x40,0x00,0x20,0x00,0xF0,0x7F,0x1C,0x00,0x07,0x40,0xF2,0x41,0x94,0x22,0x94,0x14,
0x94,0x0C,0xFF,0x13,0x94,0x10,0x94,0x30,0x94,0x20,0xF4,0x61,0x04,0x20,0x00,0x00,/*"使",3*/
0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,
0xFE,0xFF,0x22,0x02,0x22,0x02,0x22,0x42,0x22,0x82,0xFE,0x7F,0x00,0x00,0x00,0x00,/*"用",4*/
0x08,0x20,0xF8,0x3F,0x88,0x20,0xC0,0x01,0x28,0x26,0x18,0x38,0x08,0x20,0x00,0x00,/*"K",0*/
0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00,/*"P", 5*/
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",6*/
0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*"5"*/
0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1", 7*/
0x00,0x08,0x00,0x08,0xF8,0x0B,0x28,0x09,0x29,0x09,0x2E,0x09,0x2A,0x09,0xF8,0xFF,
0x28,0x09,0x2C,0x09,0x2B,0x09,0x2A,0x09,0xF8,0x0B,0x00,0x08,0x00,0x08,0x00,0x00,/*"单",10*/
0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x10,0x01,0x10,0x01,0x10,0x01,0x10,0x01,
0x10,0x01,0x1F,0x01,0x10,0x01,0x10,0xFF,0x10,0x00,0x18,0x00,0x10,0x00,0x00,0x00,/*"片",11*/
0x08,0x04,0x08,0x03,0xC8,0x00,0xFF,0xFF,0x48,0x00,0x88,0x41,0x08,0x30,0x00,0x0C,
0xFE,0x03,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x3F,0x00,0x40,0x00,0x78,0x00,0x00,/*"机",12*/
0x40,0x00,0x42,0x40,0x42,0x20,0x42,0x10,0x42,0x0C,0xFE,0x03,0x42,0x00,0x42,0x00,
0x42,0x00,0x42,0x00,0xFE,0x7F,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,/*"开",0*/
0x00,0x40,0x10,0x20,0x3E,0x10,0x10,0x88,0x10,0x87,0xF0,0x41,0x9F,0x46,0x90,0x28,
0x90,0x10,0x92,0x28,0x94,0x27,0x1C,0x40,0x10,0xC0,0x10,0x40,0x10,0x00,0x00,0x00,/*"发",1*/
0x10,0x04,0x10,0x03,0xD0,0x00,0xFF,0x7F,0x50,0x00,0x90,0x11,0x00,0x0E,0xFE,0x41,
0x62,0x20,0xA2,0x11,0x22,0x0A,0x21,0x0E,0xA1,0x31,0x61,0x60,0x00,0x20,0x00,0x00,/*"板",2*/
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",20*/
//至此字模插入结束
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte *p=&displaydata[0]; //定义指针p指向字模表的第一个汉字
byte *q=&displaydata[32]; //定义指针q指向字模表的第二个汉字,每个汉字含有32个字节
void delay(word a)
{
word b;
for(b=0;b<a;b++);
}
void senddata(word datah,datal) //向行和列的4个595同时发送数据,显示其中的一列数据
{
byte i=0;
word m,n;
oe595=0;
str595=0;
for(;i<16;i++) //行和列各有两片595驱动,所以行和列分别需要连续送两个字节数据
{
clk595=0;
m=datah; //行为高电平驱动
n=~datal; //列为低电平驱动
m&=0x8000;
n&=0x8000;
datah595=(bit)m; //在每个clk周期,同时送出行和列的1bit串行数据
datal595=(bit)n;
datah<<=1;
datal<<=1;
clk595=1;
}
str595=1; //一列数据送完,锁存到输出端进行显示
str595=0;
}
void horizontal(byte time,word counth) // ①水平移动子程序
{
byte x,y;
word j,k,z;
for(z=0;z<counth;z++) //显示字模表中的所有汉字(包括有用字模前后的的清屏数据)
{
for(y=0;y<time;y++) //该屏数据重复显示time次后刷新,实际上这是水平移动的速度
{
datal=0x0001;
for(x=0;x<16;x++) //发送一整屏数据,16个16位
{
p+=3; //受到取模软件的限制,需要对字模表的数据进行重新排列
j=(word)*p;
j<<=8; //16位中的高字节数据
j&=0xff00; //低字节清零
p-=1;
k=(word)*p; //16位中的低字节数据
k&=0x00ff; //高字节清零
datah=j|k; //二者拼接,形成一个完整的16bit行数据
if(x) //如果显示的是第一列则使用默认的datah=0x0001
{datal<<=1;} //如果显示的不是第一列则将列选通位移到相应的列上进行选通
//datah=~datah; //去掉此行前面的注释则水平移动程反白显示
senddata(datah,datal); //将行和列数据发送出去进行一列的显示
}
p-=32; //指针恢复为这个汉字首地址,准备重复显示该屏数据time次
} //该屏数据经过了time次的显示,显示数据准备更新
p+=2; //指向了该汉字的下一列,左移一列汉字
} //移动了字模表中的所有汉字,左移过程结束
p=&displaydata[0]; //指针p归位到字模表中第一个汉字
oe595=1;
}
void vertical(byte a,time,word countv) // ②垂直移动子程序
{
byte x,y,e,w=0;
word j,k,z;
word datah1,datah2;
for(z=countv;z>0;z--) //显示字模表中的所有汉字(包括有用字模前后的的清屏数据)
{
for(e=0;e<16;e++) //拼字的过程,从一个汉字完整地过渡到下一个汉字
{
for(y=0;y<time;y++) //该屏数据重复显示time次后刷新,实际上这是垂直移动的速度
{
datal=0x0001;
for(x=0;x<16;x++) //发送一整屏数据,16个16位
{
/*处理p所指向汉字某一列的拼接*/
p+=3;
j=(word)*p;
j<<=8;
j&=0xff00;
p-=1;
k=(word)*p;
k&=0x00ff;
datah1=j|k;
datah1>>=w; //这行语句改为左移同时下处改为右移,则显示向下移动
/*处理下一个汉字相应列的拼接*/
q+=3;
j=(word)*q;
j<<=8;
j&=0xff00;
q-=1;
k=(word)*q;
k&=0x00ff;
datah2=j|k;
datah2<<=(16-w); //这行语句改为右移同时上处改为左移,则显示向下移动
/*准备显示这列数据*/
datah=datah1|datah2; //此时进行拼接某汉字某一列的运算操作
if(x) //显示第一列数据列选通不需要移位,使用默认值0x0001
{datal<<=1;}
//datah=~datah; //去掉此行前面的注释则垂直移动程反白显示
senddata(datah,datal);
} //一整屏数据发送完毕
p-=32;q-=32; //指针恢复为这个汉字首地址,准备重复显示该屏数据time次
} //该屏数据经过了time次的显示,显示数据准备更新
w++; //显示上移w行的拼接数据移位位数加1
if(w==16) w=0; //如果上移了15行,w归0,结束此次拼字循环
} //此次拼字循环结束
/*开始对下一组汉字进行拼字操作*/
if((a==16)&&(z==2)) //如果字模表中含有半个汉字并且显示最后一组汉字
{ p+=32;q+=16; } //则q+16,相当于用16个零填充不足的半个汉字
else //其它情况下
{p+=32;q+=32; } //p和q一律指向下一个汉字
} //拼完字模表中的所有汉字,上移过程结束(注:上移是现象,拼字是本质)
p=&displaydata[0]; //指针p归位到字模表中第一个汉字
q=&displaydata[32]; //指针q归位到字模表中第二个汉字
oe595=1;
}
void main(void)
{
byte time=8; //调整这个值的大小将会改变汉字移动的速度
word size=sizeof(displaydata); //计算出上述在ROM中定义的可变长度字模表填充数据后的大小
word countv=((size-2)>>5)-1; //这些个汉字垂直移动全部完成所需要的拼字次数
word counth=countv<<4; //这些个汉字水平移动全部完成所需要的左移列数
byte a=(byte)((size-2)%32); //判断字模表中是否会出现一个半角的数字或符号或字母
if(a==16) //如果余数为16,说明出现了半角情况
{
counth+=8; //这时左移时需要多移动8列
countv+=1; //而右移时需要多拼一个汉字
}
while(1)
{
horizontal(time,counth); //将字模表中的所有汉字进行水平移动
; delay(65535);
delay(65535);
vertical(a,time,countv); //将字模表中的所有汉字进行垂直移动
; delay(65535);
delay(65535);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -