久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1477|回復: 6
收起左側

請教LCD12864顯示溫度負數的問題

[復制鏈接]
ID:891876 發表于 2024-6-7 09:44 | 顯示全部樓層 |閱讀模式
程序能正常顯示溫度,當溫度負數時變量閃爍,請問怎樣在主函數里顯示“—”號?

#include <STC32G.H>
#include <intrins.h>  
typedef         unsigned char        u8;
typedef         unsigned int        u16;

#define MAIN_Fosc        24000000UL

#if (MAIN_Fosc >= 24000000L)
    #define usrNOP() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
#endif

#define LCD_data  P2             //數據口
sbit LCD_RS  =  P4^1;            //寄存器選擇輸入
sbit LCD_RW  =  P4^2;            //液晶讀/寫控制
sbit LCD_EN  =  P4^4;            //液晶使能控制
sbit LCD_PSB =  P4^5;            //串/并方式控制
sbit LCD_RST =  P3^7;
sbit DQ_1= P1^0;  //18B20氣溫數據口

bit MinusFlag=0;       //負數標志,0:正數,1:負數

u16 QW;    //氣溫變量
u8 mun_char_table[]={"0123456789"};
u8 code dis1[] = {"氣溫:       ℃"};
u8 code dis2[] = {"氣溫: -     ℃"}; //零下氣溫

void delay_ms(u16 z)    //延時ms
{
   u16 x,y;
   for(x=z;x>0;x--)
   for(y=614;y>0;y--);
}

void delay_us(u8 us)
{
    do{
        usrNOP();
        usrNOP();
      }
        while(--us);
}

/**************************************
復位DS18B20,并檢測設備是否存在
**************************************/
void DS18B20_Reset()
{
    CY = 1;
    while (CY)
     {  
        DQ_1 = 0;                     //送出低電平復位信號
        delay_us(240);              //延時至少480us
        delay_us(240);
        DQ_1 = 1;                     //釋放數據線
        delay_us(60);               //等待60us
        CY = DQ_1;                    //檢測存在脈沖
        delay_us(240);              //等待設備釋放數據線
        delay_us(240);
     }
}

/**************************************
從DS18B20讀1字節數據
**************************************/
u8 DS18B20_ReadByte()
{
    u8 i;
    u8 dat = 0;

    for (i=0; i<8; i++)             //8位計數器
    {
        dat >>= 1;
        DQ_1 = 0;                     //開始時間片
                delay_us(1);          //延時等待
        DQ_1 = 1;                     //準備接收
                delay_us(1);           //接收延時
        if (DQ_1) dat |= 0x80;        //讀取數據
        delay_us(60);                 //等待時間片結束
        DQ_1 = 1;

    }

    return dat;
}

/**************************************
向DS18B20寫1字節數據
**************************************/
void DS18B20_WriteByte(u8 dat)
{
    char i;

    for (i=0; i<8; i++)             //8位計數器
    {
        DQ_1 = 0;                     //開始時間片
        delay_us(1);                //延時等待
        dat >>= 1;                  //送出數據
        DQ_1 = CY;
        delay_us(60);               //等待時間片結束
        DQ_1 = 1;                     //恢復數據線
        delay_us(1);                //恢復延時
    }
}
//========================================================================
// 函數: u16 ReadTemperature()
// 描述: 讀取溫度函數。
// 參數: none.
// 返回: 溫度值.
//========================================================================
u16 ReadTemperature()   //氣溫
{
    u16 TempH, TempL, Temperature;
        
    DS18B20_Reset_1();                //設備復位
    DS18B20_WriteByte_1(0xCC);        //跳過ROM命令
    DS18B20_WriteByte_1(0x44);        //開始轉換命令
    while (!DQ_1);                    //等待轉換完成        
    DS18B20_Reset_1();                //設備復位
    DS18B20_WriteByte_1(0xCC);        //跳過ROM命令
    DS18B20_WriteByte_1(0xBE);        //讀暫存存儲器命令
    TempL = DS18B20_ReadByte_1();     //讀溫度低字節
    TempH = DS18B20_ReadByte_1();     //讀溫度高字節
        
   if(TempH & 0xf8)    //判斷是否位負數
    {
        MinusFlag = 1;  //設置負數標志
        Temperature = (TempH<<8) | TempL;
        Temperature = ~Temperature + 1;
        Temperature *= 0.625;       //0.0625 * 10,保留1位小數點
        }
   else
    {
        MinusFlag = 0;  //清除負數標志
        Temperature = (((TempH<<8) | TempL) * 0.625); //0.0625 * 10,保留1位小數點
    }

    return Temperature;
}

//////////////以下是LCD12864驅動程序////////////////

/*******************************************************************/
/*                                                                 */
/*檢查LCD忙狀態                                                    */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
{

    bit result;
    P2=0X00;              //關掉數據口信號。阻止LCD受到P2口信號的影響
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delay_ms(1);
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*寫指令數據到LCD                                                  */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(u8 cmd)
{   

   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P2 = cmd;
    delay_ms(1);
    LCD_EN = 1;
    delay_ms(1);
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*寫顯示數據到LCD                                                  */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(u8 dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P2 = dat;
    delay_ms(1);
    LCD_EN = 1;
    delay_ms(1);
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化設定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{

    LCD_PSB = 1;         //并口方式
    lcd_wcmd(0x34);      //擴充指令操作
    delay_ms(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay_ms(5);
    lcd_wcmd(0x0C);      //顯示開,關光標
    delay_ms(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay_ms(5);
}
/*********************************************************/
/*                                                       */
/* 設定顯示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(u8 X,u8 Y)
{                          
   u8  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcmd(pos);     //顯示地址
}
/*---------------------以上是LCD12864驅動程序-----------------------*/

void main()//主函數模塊//   
{      
    u8 i=0;
    P1M0 = 0x00; P1M1 = 0x00;  
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    lcd_init();            //LCD初始化
    LCD_RST=1;
    delay_ms(100);
    LCD_RST=0;
/*-------------------------------------------------------------------*/
           
  if(MinusFlag==0)
   {
      lcd_pos(0,0);             //設置顯示位置為第1行的第1個字符
      i = 0;
     while(dis1 != '\0')
        {                         //顯示字符
           lcd_wdat(dis1);
           i++;
        }

         }
    else
      {
         lcd_pos(0,0);             //設置顯示位置為第1行的第1個字符
         i = 0;
        while(dis2 != '\0')
         {                         //顯示字符
            lcd_wdat(dis2);
            i++;
                        
          }
      }
        
  while(1)     
    {  
                                                   
        QW=ReadTemperature();
        lcd_pos(0,4);   
        lcd_wdat(mun_char_table[QW/1000%10]);
        lcd_wdat(mun_char_table[QW/100%10]);
        lcd_wdat(mun_char_table[QW/10%10]);  
      //lcd_wdat(mun_char_table[QW%10]);
                                                                                         
        }  
}

回復

使用道具 舉報

ID:619259 發表于 2024-6-7 10:40 | 顯示全部樓層
18B20程序中有負溫度標志,當標志有效時,顯示“-”
回復

使用道具 舉報

ID:1124188 發表于 2024-6-7 12:30 | 顯示全部樓層
if(TempH & 0xf8)    //判斷是否位負數
    {
        MinusFlag = 1;  //設置負數標志
        Temperature = (TempH<<8) | TempL;
        Temperature = ~Temperature + 1;
        Temperature *= 0.625;       //0.0625 * 10,保留1位小數點
        }
   else
    {
        MinusFlag = 0;  //清除負數標志
        Temperature = (((TempH<<8) | TempL) * 0.625); //0.0625 * 10,保留1位小數點
    }
看看你的這行代碼,這是負數標志位的設置
回復

使用道具 舉報

ID:1109793 發表于 2024-6-7 13:28 | 顯示全部樓層
小于0就顯示-
回復

使用道具 舉報

ID:891876 發表于 2024-6-7 14:33 | 顯示全部樓層
LotusVirginMary 發表于 2024-6-7 12:30
if(TempH & 0xf8)    //判斷是否位負數
    {
        MinusFlag = 1;  //設置負數標志

試過了,,,在主程序中判斷負數標志位,加人程序后溫度變量閃爍變暗,應該是while語句造成的

while(dis2[ i] != '\0')
         {                         //顯示字符
            lcd_wdat(dis2[ i]);
            i++;
回復

使用道具 舉報

ID:1109793 發表于 2024-6-7 19:26 | 顯示全部樓層
芙蓉焊料 發表于 2024-6-7 14:33
試過了,,,在主程序中判斷負數標志位,加人程序后溫度變量閃爍變暗,應該是while語句造成的

while(d ...

液晶啊,寫完了就在那里顯示了,又不是動態的數碼管。會收到延時的影響
回復

使用道具 舉報

ID:879809 發表于 2024-6-8 15:57 | 顯示全部樓層
芙蓉焊料 發表于 2024-6-7 14:33
試過了,,,在主程序中判斷負數標志位,加人程序后溫度變量閃爍變暗,應該是while語句造成的

while(d ...

這里明明應該用if,用while是給自己找不自在。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频一区在线 | 国产免费色 | 欧美黄在线观看 | www.久草 | 国产小视频精品 | 久久久久亚洲 | www国产亚洲精品久久网站 | 国产一区二区三区精品久久久 | 涩爱av一区二区三区 | 中文字幕精品视频 | 亚洲二区视频 | 男女啪啪网址 | 日韩a视频 | 久久9久| 国产网站久久 | 91色综合 | 中文字幕免费在线 | 亚洲www.| 久久精品视频在线观看 | 欧美精品中文字幕久久二区 | 国产精品1区| 亚洲精品二区 | 影视一区 | 国产永久免费 | 国产1区| 国产精品视频网站 | 欧美一级二级视频 | 日韩精品一区二区三区视频播放 | 无码一区二区三区视频 | 午夜久久久久久久久久一区二区 | 国产精品色av | 免费在线一区二区三区 | 国产人成精品一区二区三 | 欧美日本韩国一区二区 | av黄色免费在线观看 | 亚洲二区在线观看 | 亚洲精品国产一区 | 国产99视频精品免视看9 | 国产成人在线视频 | 久久精品亚洲精品国产欧美 | 一级美国黄色片 |