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

📄 1302+18b20+点阵屏.c

📁 几年搜的LED显示屏程序大全20多个实例带仿真.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************
       16*128 LED点阵屏 C 程序
******************************************************
声明:
     本程序供大家学习之用,用勿用于商业用途。尊重版权。
	 
	 编写:邓椿薪
	 时间:2006年1月20日 晚
	 邮箱:love2151@xinhuanet.com
*******************************************************

//595连级输出数据,138行驱动。P0_1为移动速度高速/*点阵显示汉字程串口输出字符数据,
//P2口输出行扫描信号,P2_7输出595锁存信号。*/


#include <reg51.h>
#include<intrins.h>
sbit P2_7=P2^7;
sbit DQ =P1^2;    //定义通信端口
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK=P1^7;		//DS1302引脚连接
sbit T_IO =P1^6;
sbit T_RST=P1^5;
sbit ACC0=ACC^0;       //1bit数据存储位
sbit ACC7=ACC^7;
void DS18b20start(void);
void RdTemp(void);
void convert(void);
void WrByte(uchar b);
uchar RdByte(void);
void RxWait(void);
bit RdBit(void);
void TxReset(void);
void delay(uint t);
uchar tplsb,tpmsb;        // 温度值低位、高位字节 
void   RTInputByte(uchar);         /* 输入 1Byte */
uchar  RTOutputByte(void);         /* 输出 1Byte */
void   W1302(uchar, uchar);        // 向DS1302写入一个字节
uchar  R1302(uchar);               // 从DS1302读出一个字节
void   Set1302(uchar *);           // 写DS1302时间
void Read_1302(void);            //读取时间
void   DelayMs(void);              // 延时
uchar yid,h;			   //YID为移动计数器,H为行段计数器。
uint zimuo;		           //字模计数器
uchar Flag;
uchar code hanzi[];		   //汉字字模
uchar code hanzi0[67][32];		   //数字0-59字模
uchar code ZaXiang[][32];
uchar BUFF[8];			   //缓存
uchar choice,choice1;
uchar xdata HuanCun[224];     //动态缓存
void in_data(void);			//调整数据
void rxd_data(void);		//发送数据
void TiaoZheng(void);           //调整数据
void TiaoZheng1(void);          //调整数据
void TiaoZheng2(void);          //调整数据
void TiaoZheng3(void);          //调整数据
void TiaoZheng4(void);          //调整数据
void TiaoZheng5(void);          //调整数据
void TiaoZheng6(void);          //调整数据
void TiaoZheng7(void);          //调整数据
void Large_word(void);
void Small_word(void);
void sbuf_out();			    //16段扫描
uchar year,month,day,hour,minute,second,week,temp;  //时间变量
float wendu;
uchar inittime[7]={0x00,0x37,0x13,0x18,0x09,0x04,0x08};	 //初始化后设置
uchar Number[12]; //存储时间数据
unsigned  code sw[16]={0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e }; /*16行段码*/

/********************************************/
void main(void)
{  
    Set1302(inittime);           //初始化 
    DelayMs();
   	W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/ 
	W1302(0x90,0xa5);           //打开充电二级管  一个二级管串联一个2K电阻  
	while(1)
  {
   Small_word();  
  }
   
}
void Small_word(void)
{
  uchar i,j,m,d=4;
        yid=0;
        zimuo=0;
        DS18b20start();
        DelayMs();
		Read_1302();
        DelayMs();
        for(m=0;m<8;m++)
 	     { 
           switch(choice)
		     {
			   case 0:TiaoZheng();  break;
               case 1:TiaoZheng1(); break;
			   case 2:TiaoZheng2(); break;
               case 3:TiaoZheng3(); break;
			   case 4:TiaoZheng4(); break;
               case 5:TiaoZheng5(); break;
			   case 6:TiaoZheng6(); break;
               case 7:TiaoZheng7(); break;
			 }
           for(j=0;j<4;j++) 
              {
	                  while(yid<16)				       //数据移位。
	                   {
		                    for(i=0;i<d;i++)			   //移动速度
		                   {
		                    sbuf_out();
                           }
		                   yid++;				//移动一步
	                   }
                    yid=0;
                    zimuo=zimuo+32;			    //后移一个字,
                    if(zimuo>=128)			
                    zimuo=0; 
             }
			  choice++; if(choice==8) {Flag=1;choice=0;Large_word();}
		 }

}
void DS18b20start(void)
       {
         delay(1);        // 延时1ms
         convert();        // 启动温度转换,需要750ms
         delay(1000);    // 延时1s
         RdTemp();        // 读取温度    
         delay(2000);

		 }
void Large_word(void)
         {   
		   uchar i,d=4;
		    yid=0;
            zimuo=0;
          for(i=0;i<12;i++)		 
		       {
	                while(yid<16)				       //数据移位。
	                  {
		                for(i=0;i<d;i++)			   //移动速度
		                    {
		                      sbuf_out();
                            }
		                    yid++;				//移动一步
	                  }
                      yid=0;
                      zimuo=zimuo+32;			    //后移一个字,
                      if(zimuo>=384)			
                      zimuo=0;
                      choice1++;
                      if(choice1==12) {Flag=0;choice1=0;Small_word();}
                }
			    
		  }
/********************************/
void sbuf_out()
	  {
		for(h=0;h<16;h++)	  //16行扫描
			{
			in_data();				  //调整数据
			rxd_data();				  //串口发送数据
                        P2=0x7f;		                 //关闭显示。
                        P2_7=1;					  //锁存为高,595锁存信号
			P2=sw[h];			     //送段码
			
	        
			
			}
		}

/******************************************************/
void in_data(void)
{
 char s;
   if(Flag==0)	
           for(s=3;s>=0;s--)			//h为向后先择字节计数器,zimuoo为向后先字计数器
	          {
	             BUFF[2*s]=HuanCun[zimuo+32*s+2*h];			 //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
	             BUFF[2*s+1]=HuanCun[zimuo+1+32*s+2*h];	    // 把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
	          }
	if(Flag==1)
	       for(s=3;s>=0;s--)			//h为向后先择字节计数器,zimuoo为向后先字计数器
	          {
	             BUFF[2*s]=hanzi[zimuo+32*s+2*h];			 //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
	             BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*h];	    // 把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
	          }
}

/*******************************************************/
void rxd_data(void)		            //串行发送数据
{
  char s;
  uchar inc,tempyid,temp;
  if(yid<8)
    inc=0;
  else 
    inc=1;
  for(s=0+inc;s<6+inc;s++)			   //发送8字节数据
	{
	  if(yid<8) 
     tempyid=yid;
      else 
    tempyid=yid-8;
    temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));	//h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
    temp=255-temp;	


	 SBUF=temp;//把BUFF中的字节从大到小移位相或后发送输出。
	 while(!TI);TI=0;					 //等待发送中断
	}
}
/*******************************************************/
void Read_1302(void)
{

      second=R1302(0x81);   //对取 秒 分 时 日 月 星期 年
	  minute=R1302(0x83);
	  hour=R1302(0x85);
	  day=R1302(0x87);
	  month=R1302(0x89);
	  week=R1302(0x8b);
	  year=R1302(0x8d);
     Number[0]=(year/16)*10+(year%16);
	 Number[1]=(month/16)*10+(month%16);
	 Number[2]=(day/16)*10+(day%16);
	 Number[3]=(hour/16)*10+(hour%16);
	 Number[4]=(minute/16)*10+(minute%16);
	 Number[5]=(second/16)*10+(second%16);
	 Number[6]=(week/16)*10+(week%16);
} 
/*******************************************************/
void TiaoZheng(void)
{
    uchar i,j,number=0;
	   for(i=0;i<96;i++)  {HuanCun[i]=0x00;}
	   for(j=0;j<4;j++)
	   {  
           for(i=0;i<32;i++)
	          {
		        HuanCun[96+i+number]=ZaXiang[j][i];
              }
			  number+=32; if(number>128) number=0;
	   }
}
void TiaoZheng1(void)
{
  uchar i,j,number1=0;
      for(j=1;j<7;j++)
	    {
		  for(i=0;i<32;i++)
		    {
		       HuanCun[i+number1]=ZaXiang[j][i];
			}
            number1+=32; if(number1>192) number1=0;
        }
			

           for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[7][i];}
}
void TiaoZheng2(void)
{
  uchar i,j,k,number2=0;
           for(j=5;j<7;j++)
		        {
		           for(i=0;i<32;i++)
		               {
		                  HuanCun[i+number2]=ZaXiang[j][i];
			           }
                    number2+=32; if(number2>64) number2=0;
                }
		   for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[7][i];}
           for(j=0;j<60;j++)
			   {
	              if(Number[0]==j)   {for(k=0;k<32;k++) HuanCun[96+k]=hanzi0[j][k];}   		  
		       }
		   for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[8][i];}
		   
		   for(j=0;j<60;j++)
			   {
	              if(Number[1]==j)   {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];} 
			    }
           for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[9][i];}
}

void TiaoZheng3(void)
{
  uchar i,j,k;
           for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[8][i];}
		   
		   for(j=0;j<60;j++)
			   {
	              if(Number[1]==j)   {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[j][k];} 
			    }
           for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[9][i];}
		   for(j=0;j<60;j++)
			   {
	              if(Number[2]==j)   {for(k=0;k<32;k++) HuanCun[96+k]=hanzi0[j][k];} 
			    }
		   for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[10][i];}
		   
		   for(j=0;j<60;j++)
			   {
	              if(Number[3]==j)   {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];} 
			    }
           for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[11][i];}
}
void TiaoZheng4(void)
{
   
 uchar i,j,k;

           for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[10][i];}
		   
		   for(j=0;j<60;j++)
			   {
	              if(Number[3]==j)   {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[j][k];} 
			    }
           for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[11][i];}	   
		  for(j=0;j<60;j++)
			   {
	              if(Number[4]==j)   {for(k=0;k<32;k++) HuanCun[96+k]=hanzi0[j][k];} 
			    }	  
          for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[12][i];}
		  for(j=0;j<60;j++)
			   {
	              if(Number[5]==j)   {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];} 
			    }
	      for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[13][i];}
}
void TiaoZheng5(void)
{       
    uchar i,j,k;

	      for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[12][i];}
		  for(j=0;j<60;j++)
			   {
	              if(Number[5]==j)   {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[j][k];} 
			    }
	      for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[13][i];}
		  for(i=0;i<32;i++) {HuanCun[96+i]=ZaXiang[14][i];}
		  for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[15][i];}
		  for(j=1;j<8;j++)
			   {
	              if(Number[6]==j)   {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[60+j-1][k];} 
			    }
          for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[16][i];}
}
void TiaoZheng6(void)
{
     uchar i,j,k;    
	      for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[15][i];}
		  for(j=1;j<8;j++)
			   {
	              if(Number[6]==j)   {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[60+j-1][k];} 
			    }
          for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[16][i];}
          for(i=0;i<32;i++) {HuanCun[96+i]=ZaXiang[17][i];}
          for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[19][i];}
		  for(j=0;j<60;j++)
			   {
	              if(temp==j)   {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];} 
			    }
          for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[18][i];}
		
}

⌨️ 快捷键说明

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