⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1616led.c.bak

📁 16位LED点阵显示 显示汉字等可以显示想要显示的信息
💻 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 + -