51单片机检测温湿度

2019-07-15 14:04发布

怎么把12864F-1改成12864B的显示程序#ifndef _LCD_12864
#define _LCD_12864
/*****************************预定义**************************************/
#define uchar unsigned char
#define uint unsigned int   

sbit LCD_RST=P0^1;
sbit LCD_SC        =P0^4;
sbit LCD_SI        =P0^3;
sbit LCD_CS        =P0^0;
sbit LCD_A0        =P0^2;

uchar code dis_col=128,dis_page=8;

uchar Simulation=1;        //实物制作时请设置0,仿真测试时请设置1

/***************************12864管脚配置****************************/

/********************************************************************************************
* 函数名称:delayx()
* 功    能:延迟时间=a*1ms
* 入口参数:
* 出口参数:无
*********************************************************************************************/
void delayx(unsigned int ms)       
{                                               
        unsigned char j;
        while(ms--)
        {
                for(j = 0; j < 120; j++);
        }
}

void LCD_Reset(void)
{
   //delayx(50);//delay_ms(10);
   LCD_RST=0;                                        //复位
   delayx(50);//delay_ms(10);                                        //延时 1ms       
   LCD_RST=1;
        delayx(50);//delay_ms(10);
}

//*******************************************************************
//送一个字节程序
//*******************************************************************

void SendBit(uchar dat,uchar bitcnt)
        {
                uchar i;
                for(i=0;i<bitcnt;i++)
                {
                          LCD_SC=0;
                          if(( dat & 0x80 ) == 0)
                          LCD_SI=0;
                          else
                          LCD_SI=1;
                        LCD_SC=1;
                        dat=dat<<1;  
                }
        }


/********************************************************************************************
* 函数名称:Lcd_Write_Command()
* 功    能:写指令代码
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Write_Command(uchar ctrlcode)
{  
   LCD_CS=0;
   LCD_A0=0;
   SendBit(ctrlcode,8);
   LCD_CS=1;  
}

/********************************************************************************************
* 函数名称:Lcd_Write_Byte()
* 功    能:写数据
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Write_Byte(uchar dispdata)
{       
   LCD_CS=0;
   LCD_A0=1;
   SendBit(dispdata,8);
   LCD_CS=1;
}

/********************************************************************************************
* 函数名称:Lcd_Set_X_Y(uchar x, uchar y )
* 功    能:LCD设置x y坐标
* 入口参数:x y
* 出口参数:无
*********************************************************************************************/
void Lcd_Set_X_Y(uchar x, uchar y)
{  

   Lcd_Write_Command(x|0xB0);                        // row address LSB
   Lcd_Write_Command(y>>4|0x10);                                    // column address MSB
   Lcd_Write_Command(y&0x0F|0x00);                            // column address LSB
}


/****************************************************************************
*名称:Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )
*功能:显示16X8字符(字母)         
*入口参数:
*出口参数:
*说明:bit_flag = 1 正常显示  bit_flag = 0 黑白反相显示
****************************************************************************/
void Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )
{
   uchar i , j,temp;
   temp=y;
   if( bit_flag )
   {   
      for( i=0; i<2; i++ )
      {
         x+=i;
             y=temp;
         for( j=0;j<8;j++ )
         {
            Lcd_Set_X_Y( x, y ); y++;
            Lcd_Write_Byte( point[ i*8 + j] );  
         }
      }
   }
   else
   {
      for( i = 0; i < 2; i++ )
      {
         x += i;
         y = temp;
         for( j = 0; j < 8; j++ )
         {
            Lcd_Set_X_Y( x, y ); y++;
            Lcd_Write_Byte( ~point[ i * 8 + j ] );
         }
      }
   }
}
/****************************************************************************
* 名称:Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
* 功能:显示16*16字符(汉字)      
* 入口参数:x y data
* 出口参数:无
*说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示
****************************************************************************/
void Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
{
   uchar i,j,temp ;
   temp=y;
   if( bit_flag )
   {
      for( i=0; i<2; i++ )
      {
         x+=i;
             y=temp;
         for( j=0;j<16;j++ )
         {
            Lcd_Set_X_Y( x, y ); y++;
            Lcd_Write_Byte( point[ i*16 + j] );  
         }
      }
   }
   else
   {
      for( i = 0; i<2; i++ )
      {
         x += i;
         y = temp;
         for( j = 0; j < 16; j++ )
         {
            Lcd_Set_X_Y( x, y ); y++;
            Lcd_Write_Byte( ~ point[ i * 16 + j ] );
         }
      }
   }
}
/****************************************************************************
* 名称:Lcd_Clear(void)
* 功能:清屏        
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Lcd_Clear()
{
   uchar x,y;

   for(x=0;x<dis_page;x++)                        //写dis_page页数据
   {
      Lcd_Set_X_Y(x,0);
      for(y=0;y<132;y++)                         //写132列显示数据
      Lcd_Write_Byte(0x00);                                //写显示数据0x00
   }
}

/*******************************************************************************************
* 函数名称:Lcd_Initial()
* 功    能:初始化LCD
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Initial()
{  
   delayx(50);//delay_ms(50);
   Lcd_Write_Command(0xE2);
   delayx(50);//delay_ms(50);
   Lcd_Write_Command(0xAE);                // set display OFF
   Lcd_Write_Command(0xA2);                // set 1/9 Bias
        if(Simulation==0)
        {
                Lcd_Write_Command(0xA0);            // set ADC=1, SEG output normal direction               
                Lcd_Write_Command(0xC8);            // set SHL=1, COM output reverse direction
        }
        else
        {
                {
                Lcd_Write_Command(0xA1);            // set ADC=1, SEG output normal direction               
                Lcd_Write_Command(0xC0);            // set SHL=1, COM output reverse direction
        }
        }
   Lcd_Write_Command(0xF8);                // set booster ratio
   Lcd_Write_Command(0x00);                // set 00: 2x,3x,4x,        01:5x       
   Lcd_Write_Command(0x25);                // set 1+Rb/Ra(101),5.5
   Lcd_Write_Command(0x81);            // Electronic volume mode set
   Lcd_Write_Command(0x13);/////////////////CH12864F液晶的电源设置//Lcd_Write_Command(0x24);
   Lcd_Write_Command(0x2C);            // set voltage converter(VC) on
   Lcd_Write_Command(0x2E);            // set voltage converter(VC&CR) on
   Lcd_Write_Command(0x2F);                // set VC & VR & voltage follower on
   Lcd_Write_Command(0xAF);                // set display ON
   Lcd_Write_Command(0x40);    //set Start Line
   Lcd_Clear();
}

/****************************************************************************
* 名称:Lcd_Time(uchar * clock_time )
* 功能:显示时间      
* 入口参数:无
* 出口参数:无                 
* 说明    : 时间数组 BCD 码形式
****************************************************************************/
void Lcd_Time(uchar * clock_time )
{
   uchar i=0;
   //显示   "hour时min分sec秒"                                            
   i= * clock_time >> 4;
   Lcd_Character_16X8( 1, 2, 80, letter_logo[i]);    //显示   sec的高位
   i= * clock_time & 0x0f;
   Lcd_Character_16X8( 1, 2, 88, letter_logo[i]);    //显示   sec的低位
   Lcd_Character_16X16( 1, 2, 96 , time_logo[2]);  //显示   秒

   clock_time ++;
   i= *  clock_time >> 4;
   Lcd_Character_16X8( 1, 2, 48, letter_logo[i]);    //显示   min的高位
   i= * clock_time & 0x0f;
   Lcd_Character_16X8( 1, 2, 56, letter_logo[i]);   //显示   min的低位
   Lcd_Character_16X16( 1, 2, 64 , time_logo[1]);  //显示   分

   clock_time ++;
   i= * clock_time >> 4;
   Lcd_Character_16X8( 1, 2, 16 , letter_logo[i]);    //显示   hour的高位
   i= * clock_time & 0x0f;
   Lcd_Character_16X8( 1, 2, 24 , letter_logo[i]);    //显示   hour的低位
   Lcd_Character_16X16( 1, 2, 32 , time_logo[0]);  //显示   分         
}
/****************************************************************************
* 名称:Lcd_Data(uchar * clock_time )
* 功能:显示日期      
* 入口参数:无
* 出口参数:无                 
* 说明    : 时间数组 BCD 码形式
****************************************************************************/
void Lcd_Data(uchar * clock_time )
{
   uchar i=0;
   clock_time += 3;

   //显示   "year 年 month 月 day 日"                                                  
   i= * clock_time >> 4;
   Lcd_Character_16X8( 1, 0, 80, letter_logo[i]);  //显示   day的高位
   i= * clock_time & 0x0f;
   Lcd_Character_16X8( 1, 0, 88, letter_logo[i]);  //显示   day的低位  
   Lcd_Character_16X16( 1, 0, 96, data_logo[2]); //显示   日

   clock_time ++;
   i= * clock_time >> 4 ;
   Lcd_Character_16X8( 1, 0, 48, letter_logo[i]);  //显示   month的高位
   i= * clock_time & 0x0f;
   Lcd_Character_16X8( 1, 0, 56, letter_logo[i]); //显示   month的低位
   Lcd_Character_16X16( 1, 0, 64, data_logo[1]);   //显示   月

   clock_time ++ ;   
   i= * clock_time >>  4;
   Lcd_Character_16X8( 1, 0, 16 , letter_logo[i]); //显示   year的高位
   i= * clock_time & 0x0f;
   Lcd_Character_16X8( 1, 0, 24 , letter_logo[i]); //显示   year的低位
   Lcd_Character_16X16( 1, 0, 32, data_logo[0]);   //显示   年
}
/****************************************************************************
* 名称:Lcd_Data(uchar * clock_time )
* 功能:显示日期      
* 入口参数:无
* 出口参数:无                 
* 说明    : 时间数组 BCD 码形式
****************************************************************************/
void Lcd_Week( uchar week )
{  
   Lcd_Character_16X16( 1, 6, 16-8,  week_logo[7] ); //星
   Lcd_Character_16X16( 1, 6, 32-8, week_logo[8] ); //期
   Lcd_Character_16X16( 1, 6, 48-8, week_logo[  week & 0x0f ] );
}
/******************************************************************************
* 函数名称: Lcd_Clock( uchar *clock_time )
* 功能: 显示时钟
* 入口参数: 时钟地址
* 出口参数: 无
********************************************************************************/
void Lcd_Clock( uchar * clock_time )
{
   Lcd_Data( clock_time ); //显示日期
   Lcd_Time( clock_time ); //显示时间
}
/******************************************************************************
* 名称: void Lcd_Lunar_Calendar( uchar * lunch_calendar )
* 功能: 显示农历
* 入口参数: 农力指针
* 出口参数: 无
*******************************************************************************/
void Lcd_Lunar_Calendar( uchar * lunar_canlendar )
{
   uchar i;
   //农历
   Lcd_Character_16X16( 1, 4, 16, lunar_calendar_logo[0] );
   Lcd_Character_16X16( 1, 4, 32, lunar_calendar_logo[1] );
   //year-mongth-day
   i= * lunar_canlendar >>  4;
   Lcd_Character_16X8( 1, 4, 96, letter_logo[i] ); //农历天的高位
   i= * lunar_canlendar & 0x0f;
   Lcd_Character_16X8( 1, 4, 104, letter_logo[i] ); //农历天的低位
   Lcd_Character_16X8( 1, 4, 88, letter_logo[11] ); //-

   lunar_canlendar ++;
   i= * lunar_canlendar >>  4;
   Lcd_Character_16X8( 1, 4, 72, letter_logo[i] ); //农历月的高位
   i= * lunar_canlendar & 0x0f;
   Lcd_Character_16X8( 1, 4, 80, letter_logo[i] ); //农历月的低位
   Lcd_Character_16X8( 1, 4, 64, letter_logo[11] ); //-

   lunar_canlendar ++;
   i= * lunar_canlendar >>  4;
   Lcd_Character_16X8( 1, 4, 48, letter_logo[i] ); //农历年的高位
   i= * lunar_canlendar & 0x0f;
   Lcd_Character_16X8( 1, 4, 56, letter_logo[i] ); //农历年的地位

}
/*******************************************************************************
* 名称: Lcd_Temperature( uchar * temperture )
* 功能: 显示温度
* 入口参数: 温度
* 出口参数: 无
*********************************************************************************/
void Lcd_RH( uchar * RH_Data )
{
   uchar i1,i2,i3,i4;
         
   i1=RH_Data[0]/10+0x30;//百位数
   i2=RH_Data[0]%10+0x30;//十位数
   i3=RH_Data[1]/10+0x30;//百位数
   i4=RH_Data[1]%10+0x30;//十位数

   Lcd_Character_16X8( 1, 6, 64, letter_logo[ i1 ] );  //负温度显示负号:-
        Lcd_Character_16X8( 1, 6, 72, letter_logo[i2] );  //  小数位
        Lcd_Character_16X8( 1, 6, 80, RH_logo[1] );    //   %
       
        Lcd_Character_16X8( 1, 6, 96, letter_logo[ i3 ] ); //个位
   Lcd_Character_16X8( 1, 6, 104, letter_logo[ i4 ] );  //十位
        Lcd_Character_16X8( 1, 6, 112, RH_logo[2] );    //   C        
}


/***************************************************************************
*名称    :Lcd_Set_Clock( uchar bit_flag, uchar *point )
*功能    :显示调整的时间
*入口参数:指针
*出口参数:无
*说明    :
****************************************************************************/
void Lcd_Set_Clock( uchar temp, uchar *point )
{
   bit year_flag = 1;
   bit month_flag = 1;
   bit day_flag = 1;
   bit hour_flag =1;
   bit minute_flag = 1;
   bit second_flag = 1;
   uchar i;
   if( temp == 1 ) //滚动到 second
     second_flag = 0;
   if( temp == 2 ) //滚动到 minute
      minute_flag = 0;
   if( temp == 3 ) //滚动到 hour
      hour_flag = 0;
   if( temp == 4 ) //滚动到 day
      day_flag = 0;
   if( temp == 5 ) //滚动到 month
      month_flag = 0;
   if( temp == 6 ) //滚动到 year
      year_flag = 0;
   //日期
   Lcd_Character_16X16( 1, 2, 0 , data_time_logo[0] );
   Lcd_Character_16X16( 1, 2, 16, data_time_logo[1] );
   point += 5;    //指向年
   //year
   i = *point >> 4;  
   Lcd_Character_16X8( year_flag, 2, 40, letter_logo[i] );
   i = *point & 0x0f;
   Lcd_Character_16X8( year_flag, 2, 48, letter_logo[i] );
   //-
   Lcd_Character_16X8( 1, 2, 56, letter_logo[11] );
   point --;   //指向月
   //month
   i = *point >>4;
   Lcd_Character_16X8( month_flag, 2, 64, letter_logo[i] );
   i = *point & 0x0f;
   Lcd_Character_16X8( month_flag, 2, 72, letter_logo[i] );      
   //-
   Lcd_Character_16X8( 1, 2, 80, letter_logo[11] );
   point --;   //指向日
   //day   
   i = *point >>4;
   Lcd_Character_16X8( day_flag, 2, 88, letter_logo[i] );
   i = *point & 0x0f;
   Lcd_Character_16X8( day_flag, 2, 96, letter_logo[i] );
   //时间
   Lcd_Character_16X16( 1, 4, 0, data_time_logo[2] );
   Lcd_Character_16X16( 1, 4, 16, data_time_logo[3] );
   point -- ; //指向时
   //hour
   i = *point >>4;
   Lcd_Character_16X8( hour_flag, 4, 40, letter_logo[i] );
   i = *point & 0x0f;
   Lcd_Character_16X8( hour_flag, 4, 48, letter_logo[i] );   
   //:
   Lcd_Character_16X8( 1, 4, 56, letter_logo[10] );
   point -- ;  //指向分
   //minnute
   i = *point >>4;
   Lcd_Character_16X8( minute_flag, 4, 64, letter_logo[i] );
   i = *point & 0xff;
   Lcd_Character_16X8( minute_flag, 4, 72, letter_logo[i] );
   //:
   Lcd_Character_16X8( 1, 4, 80, letter_logo[10] );
   point --;   //指向秒
   //second
   i = *point >> 4;
   Lcd_Character_16X8( second_flag, 4, 88, letter_logo[i] );
   i = * point & 0x0f;
   Lcd_Character_16X8( second_flag, 4, 96, letter_logo[i] );
}
/**************************************************************************************
* 名称: Lcd_Function( uchar temp )
* 功能: 滚动显示 时间设置
* 入口参数: 滚动位置
* 出口参数: 无
**************************************************************************************/
void Lcd_Function( uchar temp )
{
   bit time_flag = 1;
   if( temp == 2 ) //滚动到 时间设置
      time_flag = 0;

   //时间设置
   Lcd_Character_16X16( time_flag, 0, 0, function_logo[0] );
   Lcd_Character_16X16( time_flag, 0, 16, function_logo[1] );
   Lcd_Character_16X16( time_flag, 0, 32, function_logo[2] );
   Lcd_Character_16X16( time_flag, 0, 48, function_logo[3] );

}

/********************************************************************************/
#endif

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。