LM016L的显示程序.docx

上传人:b****5 文档编号:8347047 上传时间:2023-01-30 格式:DOCX 页数:10 大小:16.45KB
下载 相关 举报
LM016L的显示程序.docx_第1页
第1页 / 共10页
LM016L的显示程序.docx_第2页
第2页 / 共10页
LM016L的显示程序.docx_第3页
第3页 / 共10页
LM016L的显示程序.docx_第4页
第4页 / 共10页
LM016L的显示程序.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

LM016L的显示程序.docx

《LM016L的显示程序.docx》由会员分享,可在线阅读,更多相关《LM016L的显示程序.docx(10页珍藏版)》请在冰豆网上搜索。

LM016L的显示程序.docx

LM016L的显示程序

#include

#include

#defineucharunsignedchar

#defineuint  unsignedint

sbitDQ=P2^7;                     //定义DS18B20端口DQ 

voidreset();                        //DS18B20复位函数 

voidwrite_byte(ucharval);          //DS18B20写命令函数 

ucharread_byte(void);               //DS18B20读1字节函数 

voidread_temp();                    //温度读取函数  

voidwork_temp();                    //温度数据处理函数   

sbitBEEP=P2^5;                     //蜂鸣器驱动线 

bitpresence  ;

sbitLCD_RS=P3^5;            

sbitLCD_RW=P3^6;

sbitLCD_EN=P3^7;

ucharcode  cdis1[]={"  SETTEMP:

 50.C  "};

ucharcode  cdis2[]={"  TESTTEMP:

    .  C"};

ucharcode  cdis3[]={"DS18B20  ERR0R"};

ucharcode  cdis4[]={"  PLEASECHECK "};

unsignedchardata  temp_data[2]={0x00,0x00};

unsignedchardata  display[5]=   {0x00,0x00,0x00,0x00,0x00};

unsignedcharcode  ditab[16]=    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

voidbeep();

unsignedcharcode  mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};

#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};

/*******************************************************************/

voiddelay1(intms)

{

unsignedchary;

  while(ms--)

{

  for(y=0;y<250;y++)

  {

   _nop_();

   _nop_();

   _nop_();

   _nop_();

  }

}

}

/******************************************************************/

/*检查LCD忙状态                                                   */

/*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

   */

/******************************************************************/

bitlcd_busy()

{                         

    bitresult;

    LCD_RS=0;

    LCD_RW=1;

    LCD_EN=1;

    delayNOP();

    result=(bit)(P1&0x80);

    LCD_EN=0;

    return(result);

}

/*写指令数据到LCD                                                  */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

          */

/*******************************************************************/

voidlcd_wcmd(ucharcmd)

{                         

   while(lcd_busy());

    LCD_RS=0;

    LCD_RW=0;

    LCD_EN=0;

    _nop_();

    _nop_();

    P1=cmd;

    delayNOP();

    LCD_EN=1;

    delayNOP();

    LCD_EN=0; 

}

/*******************************************************************/

/*写显示数据到LCD                            */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。

       */

/*******************************************************************/

voidlcd_wdat(uchardat)

{                         

   while(lcd_busy());

    LCD_RS=1;

    LCD_RW=0;

    LCD_EN=0;

    P1=dat;

    delayNOP();

    LCD_EN=1;

    delayNOP();

    LCD_EN=0;

}

/*  LCD初始化设定                                                  */

/*******************************************************************/

voidlcd_init()

{

    delay1(15);  

    lcd_wcmd(0x01);      //清除LCD的显示内容            

    lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据 

    delay1(5);

    lcd_wcmd(0x38);        

    delay1(5);

    lcd_wcmd(0x38);        

    delay1(5);

    lcd_wcmd(0x0c);      //显示开,关光标 

    delay1(5);

    lcd_wcmd(0x06);      //移动光标 

    delay1(5);

    lcd_wcmd(0x01);      //清除LCD的显示内容  

    delay1(5);

}

/*  设定显示位置                                    */

/*******************************************************************/

voidlcd_pos(ucharpos)

{                         

  lcd_wcmd(pos|0x80);  //数据指针=80+地址变量  

}

/*自定义字符写入CGRAM                                   */

/*******************************************************************/

void  writetab() 

    unsignedchari;

    lcd_wcmd(0x40);            //写CGRAM 

    for(i=0;i<8;i++)      

    lcd_wdat(mytab[i]);       

}

/*us级延时函数                                        */

/*******************************************************************/

voidDelay(unsignedintnum)

{

  while(--num);

}

/*初始化ds1820                                      */

/*******************************************************************/

Init_DS18B20(void)

     DQ=1;      //DQ复位

     Delay(8);    //稍做延时 

     DQ=0;      //单片机将DQ拉低  

     Delay(90);   //精确延时大于480us  

     DQ=1;       //拉高总线 

     Delay(8);

     presence=DQ;    //如果=0则初始化成功=1则初始化失败     

     Delay(100);

     DQ=1;

    

     return(presence);//返回信号,0=presence,1=nopresence 

}

/*读一个字节                     */

/*******************************************************************/

ReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

  {

    DQ=0;//给脉冲信号 

    dat>>=1;

    DQ=1;//给脉冲信号 

    if(DQ)

     dat|=0x80;

    Delay(4);

  }

    return(dat);

}

/*写一个字节                                         */

/*******************************************************************/

WriteOneChar(unsignedchardat)

{

  unsignedchari=0;

  for(i=8;i>0;i--)

  {

    DQ=0;

    DQ=dat&0x01;

    Delay(5);

    DQ=1;

    dat>>=1;

  }

}

/*读取温度                            */

/*******************************************************************/

Read_Temperature(void)

{

     Init_DS18B20();

 

     WriteOneChar(0xCC);  //跳过读序号列号的操作   

     WriteOneChar(0x44);  //启动温度转换 

     Init_DS18B20();

     WriteOneChar(0xCC);  //跳过读序号列号的操作   

     WriteOneChar(0xBE);  //读取温度寄存器  

     temp_data[0]=ReadOneChar();   //温度低8位 

     temp_data[1]=ReadOneChar();   //温度高8位 

}

/*数据转换与温度显示                                              */

/*******************************************************************/

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]);        //小数位数显示  

/*******************************************************************/

/*蜂鸣器响一声                 */

/*******************************************************************/

voidbeep()

  {

    unsignedchary;

    for(y=0;y<100;y++)

    {

      Delay(60);

      BEEP=!

BEEP;                //BEEP取反

    }

    BEEP=1;                      //关闭蜂鸣器 

Delay(40000);

  }

/*DS18B20OK显示菜单                                             */

/*******************************************************************/

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);          //显示自定义字符  

}

/*DS18B20ERROR显示菜单                             */

/*******************************************************************/

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++;

     }

}

/*主函数     */

/************************************/

voidmain()

{

     Ok_Menu();

do

  {

      Read_Temperature();

   Disp_Temperature();

     }

    while(!

presence)  ;

     Error_Menu();

do

  { 

    Init_DS18B20();

    beep();

     }

while(presence);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1