微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用LCD1602时,屏幕一直闪烁,只显示第二行的一个数字

用LCD1602时,屏幕一直闪烁,只显示第二行的一个数字

时间:10-02 整理:3721RD 点击:
用LCD1602时,屏幕一直闪烁,只显示第二行的一个数字,求大神指导?/* 数据转换与温度显示                                              *//*******************************************************************/
Disp_Temperature()
{
  display[4]=temp_data[0]&0x0f ;
  display[0]=ditab[display[4]]+0x30 ;     //查表得小数位的值
  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  display[3]=display[4]/100+0x30 ;
  display[1]=display[4]%100 ;
  display[2]=display[1]/10+0x30 ;
  display[1]=display[1]%10+0x30 ;
    if(display[3]==0x30)        //高位为0,不显示
   {
     display[3]=0x20 ;              
     if(display[2]==0x30)      //次高位为0,不显示
     display[2]=0x20 ;
   }
     lcd_pos(0x48) ;            
     lcd_wdat(display[3]) ;        //百位数显示
     lcd_pos(0x49) ;            
     lcd_wdat(display[2]) ;        //十位数显示
  lcd_pos(0x4a) ;            
     lcd_wdat(display[1]) ;        //个位数显示
  lcd_pos(0x4c) ;            
     lcd_wdat(display[0]) ;        //小数位数显示
    temp=display[4];                //整数部分
}  
/*******************************************************************/
/* 蜂鸣器响一声                 */
/*******************************************************************/
void beep()
  {
    unsigned char y ;
    for (y=0 ;y<100 ;y++)
    {
      Delay(60) ;
      BEEP=!BEEP ;                //BEEP取反
    }
    BEEP=1 ;                      //关闭蜂鸣器
Delay(40000) ;
  }
/* DS18B20 OK 显示菜单                                             */
/*******************************************************************/
void  Ok_Menu ()
{
    uchar  m ;
    lcd_init() ;                //初始化LCD
    lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
     m = 0 ;
    while(cdis1[m] != '\0')
     {                         //显示字符
       lcd_wdat(cdis1[m]) ;
       m++ ;
     }
    lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
     m = 0 ;
    while(cdis2[m] != '\0')
     {
       lcd_wdat(cdis2[m]) ;      //显示字符
       m++ ;
     }
     writetab() ;               //自定义字符写入CGRAM
     delay1(5) ;
     lcd_pos(0x4d) ;
     lcd_wdat(0x00) ;          //显示自定义字符
}

/* DS18B20 ERROR 显示菜单                             */
/*******************************************************************/
void  Error_Menu ()
{
     uchar  m ;
     lcd_init() ;                //初始化LCD
    lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
     m = 0 ;
     while(cdis3[m] != '\0')
     {                         //显示字符
       lcd_wdat(cdis3[m]) ;
       m++ ;
     }
     lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
     m = 0 ;
     while(cdis4[m] != '\0')
     {
       lcd_wdat(cdis4[m]) ;      //显示字符
       m++ ;
     }
}
/****************键盘输入********************/
    keyscan()
    {
       if(K2==0)                                                        //判断K2是否按下
         {      
          delay1(10);                                                //延时判断K2是否按下
                  if(K2==0)
                 {
                        SET++;                                                //设定温度加1
                        if(SET==35)
                        SET=20;
                       }                        
           while(!K2);
               }
          if(K3==0)                                               //判断K3是否按下
          {                  
                delay1(10);                                                //延时判断K3是否按下
                if(K3==0)
                {
                        SET--;                                                //设定温度减1
                        if(SET==0)
                        SET=20;
                   }
                        while(!K3);
                   }
       return(SET);
     }

/*************显示设定温度****************/
  Disp_SET()
   {
    keyscan();        
    lcd_wdat(SET);             //显示设定温度
     }

/**************主程序***************/
void main()        
{
   TMOD=0x01;
   TH0=(65536-10000)/256;
   TL0=(65536-10000)%256;
   EA=1;
   ET0=1;
   IN1=1;
   IN2=0;
  Ok_Menu () ;
  do
  {
   lcd_init();           //将液晶初始化
   delay1(1);            //延时1ms给硬件一点反应时间
   Read_Temperature() ;      //读取温度
   Disp_Temperature() ;     // 显示温度
     keyscan();                     //读取键盘子程序
     lcd_wdat(SET);         
     delay1(2);
     if((temp>SET)&&(temp<38))         
             {
              high=Count_high ();
              TR0=1;
                }
           else if(temp>=38)        //温度过高--报警
                  {
                      delay1(5);
                      BEEP=0;        
                  delay1(60) ;
                   BEEP=1 ;         //关闭蜂鸣器
                     }                                    
     }      
  while(!presence)  ;
  Error_Menu () ;
do
  {  
    Init_DS18B20() ;
    beep() ;
     }
   while(!presence)  ;
     }
         

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top