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

📄 main.c

📁 单片机驱动32X64点阵资料
💻 C
字号:
/****************************************
主控芯片;STC12C5A32S2  晶振:30M
通信波特率:9600
使用点阵屏 :32*64双色
 
程序实现功能:
通过上位机字幕软件生成的字幕数据下载到单片机内部的EEPROM 
此款单片机内部有32K的EEPROM 所以可以存储较多的字
字幕软件可配置16*16 和32*32字体
其中 16*16字体可设置显示颜色 红 绿 黄 三种
可设置移动速度
移动方式目前只有一种左移 往后继续加
其他功能待开发

上位机使用见说明

欢迎大家做技术交流:QQ 77554971
手上有多片STC12C5A32S2最小系统版 如有需要 25元出售 板上40个IO全部引出 板载DS1302接口 DHT11温湿度接口 红外接收一体化头 4个独立按键
http://item.taobao.com/item.htm?id=15255080252
另外如需要2手32*64双色点阵屏的朋友可联系我

祝大家学习进步!
*****************************************/
#include "NEW_8051.H"
#include "main.h"
#define light 3                        //定义亮度
uchar code hanzi[];					    //汉字字模
uchar code hanzi1[];					    //汉字字模
				 //0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段码*///138驱动数据
sbit IA  =P4^0;  //行控制线A
sbit IB  =P2^0;  //行控制线B
sbit IC  =P2^1;  //行控制线C
sbit ID  =P2^2;  //行控制线D

#define  scan0    {IA=0;IB=0;IC=0;ID=0;}
#define  scan1    {IA=1;IB=0;IC=0;ID=0;}
#define  scan2    {IA=0;IB=1;IC=0;ID=0;}
#define  scan3    {IA=1;IB=1;IC=0;ID=0;}
#define  scan4    {IA=0;IB=0;IC=1;ID=0;}
#define  scan5    {IA=1;IB=0;IC=1;ID=0;}
#define  scan6    {IA=0;IB=1;IC=1;ID=0;}
#define  scan7    {IA=1;IB=1;IC=1;ID=0;}
#define  scan8    {IA=0;IB=0;IC=0;ID=1;}
#define  scan9    {IA=1;IB=0;IC=0;ID=1;}
#define scan10    {IA=0;IB=1;IC=0;ID=1;}
#define scan11    {IA=1;IB=1;IC=0;ID=1;}
#define scan12    {IA=0;IB=0;IC=1;ID=1;}
#define scan13    {IA=1;IB=0;IC=1;ID=1;}
#define scan14    {IA=0;IB=1;IC=1;ID=1;}
#define scan15    {IA=1;IB=1;IC=1;ID=1;}

sbit STR=P4^1;              //锁存	 
sbit SCK=P2^7;	            //时钟	 
sbit SERr1= P2^4;            //数据
sbit SERg1= P2^6;

sbit SERr= P2^3;
sbit SERg= P2^5;	
uchar Move,Speed,line;  //时间温度变量
uint zimuo;		                   //字模计数器
uchar BUFF[20];			           //缓存
uchar BUFF1[20];			           //缓存
uchar ucTimeOut;
uchar i;
uint uiBaseAddress=0;
uint uiFontNumber=0;
//void   DelayMs(void);              // 延时
void   in_data();				   // 调整移动数据
void   rxd_data();				   // 串口发送移动数据
/******************************************************/
uchar ucSetSpeed=0;
uchar ucSpeed=3;
uchar ucSetPlateNum=0;
uchar ucPlateNum=0;
uchar ucSetShowMode=0;
uchar ucShowMode=0;
uchar ucSetFontSize=0;
uchar ucFontSize=0;
uchar BuffCount=0;
uchar ucSetFontColor=0;
uchar ucFontColor=0;
uchar DelayMs=0;
uchar l=0;
bit bDelayMsOver=0;
uchar ucEEPArray=0;
uchar ucUdateTime=0;
void Send8Line();
void Send16Line();
void Send24Line();
void Send32Line();
void Load32();
/*****不影响其他端口的扫描*************************/
void scan(unsigned char Value)
{switch(Value)
        {case  15: scan0;break;
		  case  0: scan1;break;
		   case  1: scan2;break;
		    case  2: scan3;break;
             case  3: scan4;break;
		      case  4: scan5;break;
		       case  5: scan6;break;
		        case  6: scan7;break;
                 case  7: scan8;break;
		       case  8: scan9;break;
		      case 9:scan10;break;
		     case 10:scan11;break;
            case 11:scan12;break;
		  case 12:scan13;break;
		 case 13:scan14;break;
	    case 14:scan15;break;
	   default:break;
        }
}
/*************************/
void DelayMss(void)
 {
  uchar TempCyc;
  for(TempCyc=150;TempCyc>1;TempCyc--)
     {;}
 }
/**************************延时***********************/
void InitTimer0(void)
{
    TMOD|= 0x01;
    TH0 = 0x0C4;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
/***********************************/
void Send_data(unsigned char d)	  /*从串口发送数据*/
{
	  ES=0;
      SBUF=d;
	  while(TI==0);       //等待发送完毕
      TI=0;
	  ES=1;
}
/*****************************************/
void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x0C4;
    TL0 = 0x00;
	if( ucTimeOut )
	{
		ucTimeOut--;
		if( !ucTimeOut )
		{
			//bEanle=0;
			LED4=1;
		}
			
	}
	if(ucUdateTime)
	{
		ucUdateTime--;
		if(!ucUdateTime)
		{
					
			//uiBaseAddress=0;
			//bEanle=0;
			
		}
	}
	
/**************************************/
    
}
/****************************************/
void LED_Display(void)
{
	ucSetPlateNum=byte_read(0x0003);//读取EEPROM里设置的点阵屏块数量(32*64一块)
	switch ( ucSetPlateNum )
	{
	case 0X01:
		ucPlateNum=8; //1块 
		break;
	case 0X02:
		ucPlateNum=16; //2块
		break;
	case 0X03:
		ucPlateNum=24;//3块
		break;
	case 0X04:
		ucPlateNum=32;//4块
		break;
	case 0X05:
		ucPlateNum=40;	//5块
		break;
	default:
		ucPlateNum=8;	//1块
		break;
	}
/***********************************/

  ucSetShowMode=byte_read(0x0004); //显示方式
  switch ( ucSetShowMode )
   {
   	case 0X01:
		ucShowMode=1;  //左移
		break;
	case 0X02:
		ucShowMode=2; //右移
		break;
	case 0X03:
		ucShowMode=3;
		break;
	case 0X04:
		ucShowMode=4;
		break;
	case 0X05:
		ucShowMode=5;
		break;
	default:
		ucShowMode=2;
		break;
	}
/***********************************/
 
ucSetSpeed=byte_read(0x0000); //移动速度
  switch ( ucSetSpeed )
   {
   	case 0X01:
		ucSpeed=2; 
		break;
	case 0X02:
		ucSpeed=4; 
		break;
	case 0X03:
		ucSpeed=6;
		break;
	case 0X04:
		ucSpeed=8;
		break;
	case 0X05:
		ucSpeed=10;
		break;
	default:
		ucSpeed=5;
		break;
	}
/********************************************/ 
ucSetFontSize=byte_read(0x0001); //字体大小
  switch ( ucSetFontSize )
   {
   	case 0X01:
		ucFontSize=16; 
		break;
	case 0X02:
		ucFontSize=32; 
		break;
	default:
		ucFontSize=16;
		break;
	}
/**************************************************/
ucSetFontColor=byte_read(0x0002); //字体颜色
  switch ( ucSetFontColor )
   {
   	case 0X01:
		ucFontColor=1; 	//红
		break;
	case 0X02:
		ucFontColor=2; //绿
		break;
	case 0X03:
		ucFontColor=3; //黄
		break;
	default:
		ucFontColor=1;
		break;
	}
uiFontNumber=(byte_read(0x0100)<<8)+byte_read(0x0101);
}

/*主函数*/
void main()
{  
   InitTimer0();
   uart_init();
   Move=0;
   zimuo=0;
   LED_Display();

   //uart_rBIT=1;   
/*******************************************/
 
while(1)  
{
	while(zimuo<uiFontNumber+64)
	{

		//if( !bEanle ) //下载数据和设置屏参数时不显示信息
			//{
		if(ucShowMode==0x01)
		{
			while(Move<ucFontSize)	//数据移位。
			{			
					for(Speed=0;Speed<ucSpeed;Speed++) //移动速度
					{	
						for(line=0;line<16;line++)
						{
							in_data();		//调整移动数据
							rxd_data();
						//	P0=sw[line];  
							scan(line);     								 
							STR=1;//锁存
							STR=0;
							STR=1;
							DelayMss();	 //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。										
						}
					}
				
		/****************************************************/
			l++;
				if(l==16)l=0;
				Move++;				                 //移动一步
			}
		   	Move=0;
			if(ucFontSize==32)
		    {
				zimuo=zimuo+128;				
		    }
			else
			{
				zimuo=zimuo+32;
			}
		}					
/**********************************************************/	
			else if(ucShowMode==0x02)
				{
					for(i=0;i<32;i++)
					{
					for(Speed=0;Speed<16;Speed++) //移动速度
					{
						for(line=0;line<16;line++)
						 {
							in_data();//调整移动数据
							if((i<=15)&&(line<=i))													
							Send8Line();
							else
							Send16Line();							
							if(i>15)
							{
								if(line<=(i-15))
								 {
								   Send24Line();			 
								 }
							       else
							      {
							         Send32Line();	
							      }	
							}
								STR=1;//锁存
								STR=0;
								STR=1;
								//P0 =sw[line];
								if(i>15) 
								 {
								 	if(i-15>line)
									P0 =sw[i-15-line];
									else
									P0=sw[line+15-i];
								 }
								 //P0= sw[line];
								 else
								 P0 =sw[i-line];
								  	
						}
						DelayMss();
						}
					}
/********************************************************/
					for(i=0;i<120;i++)
					{						
						for(line=0;line<16;line++)
						{
							Load32();
							Send24Line();
							STR=1;//锁存
							STR=0;
							STR=1;
							P0 =sw[line];
						}
						  	
					}
					//zimuo=zimuo+256;	
				}
			
	}
	zimuo=0;
	}
}
/*********************************************************/
void Send8Line()
{
	uchar k,i;
	SERg=SERg1=1;
	for(i=0;i<8;i++)
	{
		 for(k=0;k<8;k++)
	       {
		   	   SCK=0;	   
			   SERr=(bit)(BUFF1[i]&0x01);//这里SERr定义成普通IO口就得了
		       BUFF1[i]=BUFF1[i]>>1;
			   SERr1=1;			   
		       SCK =1;
	      }	
	}
}
/*********************************************************/
void Send16Line()
{
	uchar k,i;
	SERg=1;
	SERg1=1;
	for(i=0;i<8;i++)
	{
		 for(k=0;k<8;k++)
	       {
		   	   SCK=0;	   
			   SERr=1;//这里SERr定义成普通IO口就得了
		       SERr1=1;			   
		       SCK=1;
	      }	
	  }	
}
/*********************************************************/
void Send24Line()
{
	uchar k,i;
	 SERg=SERg1=1;
	for(i=0;i<8;i++)
	{
		 for(k=0;k<8;k++)
	       {
		   	   SCK=0;	   
			   SERr=(bit)(BUFF[i]&0x01);//这里SERr定义成普通IO口就得了
		       BUFF[i]=BUFF[i]>>1;
			   SERr1=(bit)(BUFF1[i]&0x01);  //这里SERr定义成普通IO口就得了
		       BUFF1[i]=BUFF1[i]>>1;			   
		       SCK=1;
	      }	
	 }	
}
/********************************************************/
void Send32Line()
{
	uchar k,i;
	SERg=SERg1=1;
	for(i=0;i<8;i++)
	{
		 for(k=0;k<8;k++)
	       {
		   	   SCK=0;	   
			   SERr=(bit)(BUFF[i]&0x01);//这里SERr定义成普通IO口就得了
		       BUFF[i]=BUFF[i]>>1;
			   SERr1=1;			   
		       SCK =1;
	      }	
	}	
}	
void Load32()
{	
	char s;
	for(s=2;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
	{
		 BUFF[4*s]=byte_read(0x200+zimuo+128*s+4*line);
		 BUFF[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*line);
		 BUFF[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*line);
		 BUFF[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*line);

		 BUFF1[4*s]=byte_read(0x200+zimuo+128*s+4*line+64);
		 BUFF1[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*line+64);
		 BUFF1[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*line+64);
		 BUFF1[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*line+64);
	}
}	  
/**********************************************************/
void in_data(void)		                       //调整数据
{
  	char s;   
	if(ucShowMode==0x01)//左移
	{
		 if( ucFontSize==16 )//如果字体是16*16 
		 { 
			 for(s=8;s>=0;s--)			                    //i为向后先择字节计数器,zimuoo为向后先字计数器
			 {
				 BUFF[2*s+1]=byte_read(0x200+zimuo+1+32*s+2*line);            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
				 BUFF[2*s]=byte_read(0x200+zimuo+32*s+2*line);	        //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
			
				 BUFF1[2*s+1]=byte_read(0x200+zimuo+1+32*s+2*line);            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
				 BUFF1[2*s]=byte_read(0x200+zimuo+32*s+2*line);
			 }
		 }
		else if( ucFontSize==32 ) //如果字体是32*32
		{
			Load32();
		}
	}
	else if(ucShowMode==0x02)//右移
	{
		 if(ucFontSize==32)
		 {
			 	for(s=1;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
				{
					 BUFF[4*s]=byte_read(0x200+zimuo+128*s+4*(15-line));
					 BUFF[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*(15-line));
					 BUFF[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*(15-line));
					 BUFF[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*(15-line));
			
					 BUFF1[4*s]=byte_read(0x200+zimuo+128*s+4*(15-line)+64);
					 BUFF1[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*(15-line)+64);
					 BUFF1[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*(15-line)+64);
					 BUFF1[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*(15-line)+64);
				}
		}	
	}
}

/***********************发送移动的数据****************************/
void rxd_data(void)		            //串行发送数据
{
  uchar s;
  uchar inc,tempyid,temp,k,temp1;
 	if(Move<8)
	{
		inc=0;
	}
	else if((Move>=8)&&(Move<16)) 
	{
		inc=1;
	}
	else if((Move>=16)&&(Move<24))
	{ 
		inc=2;
	}
	else if(Move>=24)
	{
		inc=3;
	}
  for(s=0+inc;s<8+inc;s++)		   //发送ucSePlateNum字节数据
	{
		 if(l<8) 
       		tempyid=l;
     	 else 
     		tempyid=l-8;
	     temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));	//h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
	     //temp=255-temp;
		 temp1=(BUFF1[s]>>tempyid)|(BUFF1[s+1]<<(8-tempyid));	//h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
	    // temp1=255-temp1;
/************************************************************/	
		if(ucFontColor==1) //红色
		{
		     SERg=SERg1=1;
			 for(k=0;k<8;k++)
		       {
			   	   SCK=0;	   
				   SERr=(bit)(temp&0x01);//这里SERr定义成普通IO口就得了
			       temp=temp>>1;
				   SERr1=(bit)(temp1&0x01);
				   
				   temp1=temp1>>1;
			       SCK=1;
		      }
		}
	/***********************************************/
		else if(ucFontColor==2)//绿色
		{
			   SERr=SERr1=1;
			   for(k=0;k<8;k++)
		       {
				   SCK=0;	   
				   SERg=(bit)(temp&0x01);//这里SERr定义成普通IO口就得了
			       temp=temp>>1;
				   SERg1=(bit)(temp1&0x01);				   
				   temp1=temp1>>1;
			       SCK=1;
		      }	
		}
		else if(ucFontColor==3)//黄色
		{
			   for(k=0;k<8;k++)
		       {
			       
				   SCK=0;	   
				   SERr=SERg=(bit)(temp&0x01);//这里SERr定义成普通IO口就得了
			       temp=temp>>1;
				   SERr1=SERg1=(bit)(temp1&0x01);
				   
				   temp1=temp1>>1;
			       SCK=1;
		      }	
		}
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -