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

📄 yejing.c

📁 DS18B20温度采集然后红外发射出去,接收板接收红外并LCD显示接收的数据信息,有完整的发射接收程序
💻 C
字号:
/**************************************************************************
文件名:YEJING.C
功能:在指定位置显示单个字符,字符串,汉字和数值 
编程者:0
时间:
**************************************************************************/
/**********************文件包含*******************************************/
#include <reg51.h>
#include <intrins.h>//////用到_nop_();///////
#include <math.h>////用到取绝对值/////
#include "yejing.h"

/**********************变量定义 **********************************/
#define Busy	0x80

#define DataPort  P1	  /* 定义LCD模块数据端口 */
sbit	RS	= P3^6;       /* 定义LCD模块控制引脚,可根据需要进行修改 */
sbit	RW	= P3^5;
sbit	E   = P3^4;

//#define DataPort P0	  /* 定义LCD模块数据端口 */
//sbit	RS	= P3^7;       /* 定义LCD模块控制引脚,可根据需要进行修改 */
//sbit	RW	= P3^6;
//sbit	E   = P3^5;


//code uchar array4[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x2b,0x2d};
                   //  0    1    2    3    4    5    6    7    8    9    .    +    -  //
//上面用{}的方式定义数组在程序中不容易处理,并且要查字符的代码值,很复杂//////
//code char  array1[]="我爱马海莉! %";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
//code char  array2[]="我爱汪亲朋! %";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
//code char  array3[]="welcome!%";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
code char array4[]="0123456789.+- %";//数组结束一定要检查是否需要加空格接着才有%作为结束标志//////
                                    ///////此处不要轻易改动//////
code char array5[]="数值超范围! %";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
//code char array6[]="";//     
/****************************** 短延时函数 ******************************/
void Delay5Ms(void) 
{
	uint i = 5552;
	while(i--);
}

/****************************** 长延时函数 ******************************/
void Delay400Ms(void) 
{	
    uchar i = 5;
	uint j;
	while(i--) 
	 {     
    	j=7269;
		while(j--);
	 };
}

/****************************** 读忙状态函数 ****************************
* 功能:在正常读写操作之前检测LCD模块的忙状态, 
*       DB7 = 0:LCD控制器空闲;DB7 = 1:LCD控制器忙
*************************************************************************/
void WaitForEnable( void ) 
{
	DataPort = 0xff;
	RS =0; 
	RW = 1; 
	_nop_();
	E = 1; 
	_nop_(); 
	_nop_();
	while( DataPort & Busy );////如果Busy的值为1,则一直在此处等待,直到为0/////
	E = 0;
}	
                       
/****************************** 命令写入函数 ****************************
* 功能:向LCD模块写入命令字符CMD,
* 若 AttribC = 1 检测忙信号,若 AttribC = 0 不检测忙信号
************************************************************************/
void LcdWriteCommand(uchar CMD,uchar AttribC) 
{
	if (AttribC) WaitForEnable();	///检测忙信号/////
	RS = 0;	
	RW = 0; 
	_nop_(); 
	DataPort = CMD;                /// 将命令字符送往数据口 ///
    _nop_();		              
	E = 1;
	_nop_();
	_nop_();
	E = 0;
}
	
/**************************** 光标定位函数 ******************************
* 功能: 将显示光标定位到posx,posy坐标处
************************************************************************/
/*void LocateXY( char posx,char posy) 
 {
   uchar temp;
   temp = posx & 0x0f;////????//////
  // posy &= 0x01;
   switch(posy)
     {
       	case 0: temp+=0x80;
		        break;
	    case 1: temp+=0xc0;
		        break;
	    case 2: temp+=0x94;
		        break;
	    case 3: temp+=0xd4;
		        break;
	   default: break;		
     }
  LcdWriteCommand(temp,1);///要检测忙信号/////
}*/
/**************************** 光标定位函数 ******************************
* 功能: 将显示光标定位到posx,posy坐标处
************************************************************************/
void LocateXY( char posx,char posy)
{
  uchar temper;////temper为在哪行哪个位置显示的液晶的命令值//////
  temper = posx & 0x07;//对于HD44780、YLF12232F液晶的第一行为00-07/////
                ///////第二行为10-17//////////
  posy &= 0x01;//////液晶只有两行, posy 的值只能为0和1//////
  if ( posy )temper |= 0x10;////如果为第二行,temp的值为90-97/////
  temper |= 0x80;           ////如果为第一行,temp的值为80-87/////
  LcdWriteCommand(temper,1);///要检测忙信号/////
}
/***************************** 显示字符写入函数 ***************************
* 功能:在当前光标位置显示一个字符
**************************************************************************/
void LcdWriteData( char dataW ) 
{
	WaitForEnable();				////检测忙信号////
	RS = 1; 
	RW = 0; 
	_nop_();        
    DataPort = dataW;               ///将显示字符的代码送往数据口////
	_nop_();                        
	E = 1; 
	_nop_(); 
	_nop_(); 
	E = 0;	
}

/**************************** 显示字符串函数 *****************************
* 功能:从坐标x,y处开始显示指针ptr指定的字符串
**************************************************************************/
void Disp_strings(uchar x,uchar y, uchar *ptr)
{
  while (*ptr != '%')////利用数组最后有空格作为信息结束的判断/////
     {      
       LocateXY( x, y );	// 定位显示地址///
       LcdWriteData(*ptr++ );////对于汉字一个地址要连续写两次,才能构成一个完整的汉字//////
       LcdWriteData(*ptr++ );////对于字母、数字一个地址可写一次,显示时中间有一个空格//////
	   ///////////////////////////当然也可连续写两次,显示时中间没有空格///////
      // LcdWriteCommand(0x18,1);//当主程序只有文字信息显示时,此处可用于滚屏显示/////,
      // Delay400Ms();       //////滚屏显示要注意延时///////
       x++;////连续写两次后,地址(横坐标)加1////////
	  }
} 

/**************************** 显示数值函数 *****************************
* 功能:从指定的坐标位置x,y处开始显示"-999.999---+999.999"范围的一个数值.
**************************************************************************/
void Disp_data(uchar x,uchar y, float ndata)
{
  unsigned long  z;   
  uchar tab1[10],tab2[10];
   if(ndata<0) //////////////////第一个if-else结构开始///////////////////////////  
         {                     //
          tab1[0]=array4[12];  //
	      ndata=fabs(ndata);   //对正负数分别赋符号///////
         }                     //
   else{tab1[0]=array4[11];} ////第一个if-else结构结束/////////////////////////// 
////////////////////////////////////////////////////////////////////////////////
//////////////////第二个if-else结构开始/////////////////////////////////////////   
if((ndata<1000)&&(ndata>=0.001))////显示的数其绝对值必须在0.001-1000之间
  {
    z=(unsigned long)(ndata*1000);////强制类型转换//////
     //tab1[0]是符号位////////////////下面是获取各位数值///////
    tab1[1]=array4[z/100000];      ////获得千位信息'0-9'中的某一个/////
    tab1[2]=array4[z%100000/10000];////获得百位信息'0-9'中的某一个/////
    tab1[3]=array4[z%10000/1000];  ////获得十位信息'0-9'中的某一个///// 
    tab1[4]=array4[10];/////tab1[4]是小数点位////////
    tab1[5]=array4[z%1000/100];    ////获得十分位信息'0-9'中的某一个/////
    tab1[6]=array4[z%100/10];      ////获得百分位信息'0-9'中的某一个/////
    tab1[7]=array4[z%10];          ////获得千分位信息'0-9'中的某一个/////
    tab1[8]=array4[13];            ////tab1[9]表示的是空格字符/////
    tab1[9]=array4[14];            ////tab1[8]表示的是'%'字符,数组结束必须有'%'/////
////////////////////////////////////
   if(tab1[1]=='0')              ////考虑千位为'0'的情况////注意应该是tab1[1]=='0'////
      {                                                 ////而不是tab1[1]==0/////////
           if(tab1[2]=='0')      ////考虑百位为'0'的情况////
	         {                   //
               tab2[0]=tab1[0];  //符号位////
               tab2[1]=tab1[3];  //个位////
               tab2[2]=tab1[4];  //小数点////
               tab2[3]=tab1[5];  //十分位///     
               tab2[4]=tab1[6];  //百分位///
               tab2[5]=tab1[7];  //千分位///
               tab2[6]=tab1[8];  ////数组结束必须有%/////
		     } 	                  //    	 	   
           else                   ////百位不为'0'的情况////
             {                    //
	           tab2[0]=tab1[0];   ////符号位////
               tab2[1]=tab1[2];   ////十位///
               tab2[2]=tab1[3];   ////个位////
               tab2[3]=tab1[4];   ////小数点////       
               tab2[4]=tab1[5];   ////十分位///
               tab2[5]=tab1[6];   ////百分位///
               tab2[6]=tab1[7];    ////千分位///
               tab2[7]=tab1[8];    /////根据实际情况添加的空格//与Disp_strings()有关////
               tab2[8]=tab1[9];   ////数组结束必须有%/////
 	   	     }                    //
       }                          //
   else  ////千位不为'0'的情况////
    {
     tab2[0]=tab1[0];//符号位////
     tab2[1]=tab1[1];//千位///
     tab2[2]=tab1[2];//百位///
     tab2[3]=tab1[3];//个位////
     tab2[4]=tab1[4];//小数点////
     tab2[5]=tab1[5];//十分位///
     tab2[6]=tab1[6];//百分位///
     tab2[7]=tab1[7];//千分位///
     tab2[8]=tab1[9]; ////数组结束必须有%/////
    }  
////////////////////////////////////   
   Disp_strings(x,y,tab2);/////////////////显示数值////
  }
 else{ Disp_strings(x,y,array5);}//////数值超过显示范围,报错! 
////////////////////////////////////////////////////////////////////////////////
//////////////////第二个if-else结构结束/////////////////////////////////////////    
}

/****************************** 初始化函数 ******************************
* 功能:向LCD模块写入不同命令,完成必要的初始化过程
*************************************************************************/
void Lcd_initilize( void ) 
{
   	LcdWriteCommand( 0x38, 0);  /* 设置显示模式(不检测忙信号) */
	Delay5Ms();					/* 短延时 */
	LcdWriteCommand( 0x38, 0);	/* 共进行三次 */
	Delay5Ms();
	LcdWriteCommand( 0x38, 0);
	Delay5Ms();			       
	LcdWriteCommand( 0x38, 1);	/* 设置显示模式(以后均检测忙信号) */
    LcdWriteCommand( 0x08, 1);	/* 显示关闭 */
   	LcdWriteCommand( 0x01, 1);	/* 显示清屏 */
	LcdWriteCommand( 0x06, 1);	/* 设置显示光标移动 */
	LcdWriteCommand( 0x0c, 1);	/* 设置显示开及光标位置 */
}

⌨️ 快捷键说明

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