程序能正常顯示溫度,當溫度負數時變量閃爍,請問怎樣在主函數里顯示“—”號?
#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]);
}
}
|