找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 221|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

為什么LCD不顯示字

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 工藤新一1 于 2025-7-1 21:31 編輯


#include<REG52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=0;
bit flang;
sbit IN1=P3^5;
sbit IN2=P3^6;
sbit PWM1 =P3^7;

uchar xianshi1[] ="TEMP       00.0C";// 內(nèi)容
uchar xianshi2[] ="000%            ";// 內(nèi)容
uint    wendu=0;
uchar count;
uchar jd=5;
bit work;        //開關(guān)標(biāo)志

sbit k1=P1^0; //
sbit k2=P1^1; //
sbit k3=P1^2; //
sbit DQ=P2^0; //定義DS18B20總線I/O

//Port Definitions**********************************************************
sbit LcdRs                = P2^5;
sbit LcdRw                = P2^6;
sbit LcdEn          = P2^7;
sfr  DBPort         = 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口
        void delay(uint z)
{
   uint a,b;
   for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}
//向LCD寫入命令或數(shù)據(jù)************************************************************
#define LCD_COMMAND                        0      // Command
#define LCD_DATA                        1      // Data
#define LCD_CLEAR_SCREEN        0x01      // 清屏
#define LCD_HOMING                  0x02      // 光標(biāo)返回原點(diǎn)
void LCD_Write(bit style, unsigned char input)
{
        LcdEn=0;
        LcdRs=style;
        LcdRw=0;                _nop_();//寫入LCD
        DBPort=input;        _nop_();//數(shù)據(jù)寫入p0口
        LcdEn=1;                _nop_();//LCD讀取數(shù)據(jù)
        LcdEn=0;                _nop_();//完成寫入
delay(1);
}

//設(shè)置顯示模式************************************************************
#define LCD_SHOW                        0x04    //顯示開
#define LCD_HIDE                        0x00    //顯示關(guān)         

#define LCD_CURSOR                        0x02         //顯示光標(biāo)
#define LCD_NO_CURSOR                0x00    //無光標(biāo)                     

#define LCD_FLASH                        0x01    //光標(biāo)閃動(dòng)
#define LCD_NO_FLASH                0x00    //光標(biāo)不閃動(dòng)

void LCD_SetDisplay(unsigned char DisplayMode)
{
        LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        //0x08為基礎(chǔ)命令碼
}//進(jìn)行組合顯示,向LCD發(fā)送命令字
//設(shè)置輸入模式************************************************************
#define LCD_AC_UP                        0x02
#define LCD_AC_DOWN                        0x00      // default

#define LCD_MOVE                        0x01      // 畫面可平移
#define LCD_NO_MOVE                        0x00      //default

void LCD_SetInput(unsigned char InputMode)
{
        LCD_Write(LCD_COMMAND, 0x04|InputMode);//0x04為基礎(chǔ)命令碼
}//組合輸入,向LCD發(fā)送命令字
//初始化LCD************************************************************
void LCD_Initial()
{
        LcdEn=0;
        LCD_Write(LCD_COMMAND,0x38);           //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
        delay(5);
        LCD_Write(LCD_COMMAND,0x38);
        delay(5);
        LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標(biāo)
        delay(5);
        LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
        delay(5);
        LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //地址計(jì)數(shù)器遞增, 畫面不動(dòng)
        delay(5);
}
//液晶字符輸入的位置************************
void GotoXY(unsigned char x, unsigned char y)//定義x范圍0-15,y范圍0-1
{
        if(y==0)
                LCD_Write(LCD_COMMAND,0x80|x);//第一行顯示,地址范圍0x80-0x8F
        if(y==1)
                LCD_Write(LCD_COMMAND,0x80|(x-0x40));//第二行顯示,地址范圍0xC0-0xCF
}
//將字符輸出到液晶顯示
void Print(unsigned char *str)//指向要顯示的字符串的指針
{
        while(*str!='\0')
        {
                LCD_Write(LCD_DATA,*str);//數(shù)據(jù)寫入
                str++;
                delay(1);
        }
}
void init()// 定時(shí)器初始化
{
        TMOD=0x01;
  TH0=TL0=(256-200); //高八位寄存器和低八位寄存器初始值為56即0x38
  ET0=1;//開定時(shí)器0中斷
        TR0=1;
        EA=1;//開總中斷
}

void Delay_DS18B20(int num);

/*****初始化DS18B20*****/  //探頭1
void Init_DS18B20()
{
  unsigned char x;//用于存儲(chǔ)從DS18B20讀取的狀態(tài)
  DQ=1;                //DQ復(fù)位
  Delay_DS18B20(8);    //稍做延時(shí)
  DQ = 0;         //單片機(jī)將DQ拉低
  Delay_DS18B20(80);   //精確延時(shí),大于480us
  DQ = 1;         //拉高總線
  Delay_DS18B20(14);
  x = DQ;           //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
  Delay_DS18B20(20);
}


/*****延時(shí)子程序*****/
void Delay_DS18B20(int num)
{
  while(num--) ;
}


/*****寫一個(gè)字節(jié)*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    Delay_DS18B20(5);
    DQ = 1;
    dat>>=1;
  }
}

/*****讀一個(gè)字節(jié)*****/
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DQ = 0;     // 給脈沖信號(hào)
    dat>>=1;
    DQ = 1;     // 給脈沖信號(hào)
    if(DQ)
    dat|=0x80;
    Delay_DS18B20(4);
  }
  return(dat);
}



/*****讀取溫度*****/
unsigned int ReadTemperature(void)         //讀取溫度并轉(zhuǎn)換
{
  unsigned char a=0;
  unsigned char b=0;
  unsigned int t=0;
         unsigned int tempb20;
  float f_temp=0;
        
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  WriteOneChar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  WriteOneChar(0xBE);  //讀取溫度寄存器
  a=ReadOneChar();     //讀低8位
  b=ReadOneChar();    //讀高8位

tempb20=b;//組合溫度值
        tempb20<<=8;
        tempb20=tempb20|a;

        if((b&0xfc)==0xfc)//負(fù)溫度
   {
            flang=1;
                   tempb20=((~tempb20)+1);//處理負(fù)溫度
                          f_temp=tempb20*0.0625;//轉(zhuǎn)換成浮點(diǎn)數(shù)
                                 tempb20=f_temp*10+0.5;//轉(zhuǎn)換成整數(shù)

  }
  else//正溫度
  {
                flang=0;
                f_temp=tempb20*0.0625;
                tempb20=f_temp*10+0.5;

}
         return tempb20;
}

main()
{        

        uchar k;
        LCD_Initial();
        
        PWM1=0;//設(shè)置電機(jī)控制
        IN1=0;
        IN2=1;
        init();

while(1)
{                        
          if(k==0)
                        {
                                EA=0;
        wendu=ReadTemperature();//讀取溫度數(shù)據(jù)
                                EA=1;
                   }
                if(k++>25) k=0;//每26次循環(huán)讀取一次溫度值,確保溫度讀取不會(huì)過于頻繁

        if(k1)//如果溫度超過27°C,計(jì)算PWM占空比(自動(dòng)模式),jd范圍0-10
        {               
                if(wendu>=270)
                {
                 jd=(wendu/10)-27;
                }
                else jd=0;
        }
        else
        {
        

                 if(k2==0)//PWM+(手動(dòng)模式)
            {
                   delay(10);        
                     jd++;
                                if(jd>=10)jd=10;
                         while(k2==0);
                        }
                        
                        if(k3==0)//PWM-
            {
                    delay(10);
                          if(jd>0) jd--;
                          while(k3==0);
                        }               
        }

                if(flang==1)//表示溫度是負(fù)數(shù)
                xianshi1[10]='-';
                else
                xianshi1[10]=' ';        

    xianshi1[11]=wendu/100+0x30;//百位
          xianshi1[12]=wendu/10%10+0x30;//十位
          xianshi1[14]=wendu%10+0x30;//個(gè)位
               
               
          xianshi2[0]=jd/10+0x30;//個(gè)位
          xianshi2[1]=jd%10+0x30;//十位
         

                GotoXY(0,0);//坐標(biāo)位置
                Print(xianshi1);
                GotoXY(0,1);
                Print(xianshi2);        
               
}
}
void time0(void) interrupt 1 //更新占空狀態(tài)
{
     TH0=0xfc;
     TL0=0x18;
                 if(count<jd)                //判斷1ms次數(shù)是否小于角度標(biāo)識(shí)         
                 PWM1=1;                   //確實(shí)小于,PWM輸出高電平
                 else
                 PWM1=0 ;//PORTA=0;        //大于則輸出低電平
                 
                count=(count+1);          //1ms次數(shù)加1
                if(count>=10)
                count=0;
}               

1.png (47.06 KB, 下載次數(shù): 0)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:584814 發(fā)表于 2025-7-2 09:30 | 只看該作者
要么上傳整個(gè)工程文件,要么大街上聽算命
回復(fù)

使用道具 舉報(bào)

板凳
ID:985643 發(fā)表于 2025-7-2 14:35 | 只看該作者
man1234567 發(fā)表于 2025-7-2 09:30
要么上傳整個(gè)工程文件,要么大街上聽算命

回復(fù)

使用道具 舉報(bào)

地板
ID:996773 發(fā)表于 2025-7-3 08:50 | 只看該作者
一個(gè)新手搞這么大工程干嘛,又是中斷又是定時(shí)器,又是18B20,好像還有個(gè)電機(jī),我一個(gè)天才都
不敢一口吃這么大,老老實(shí)實(shí)把多余的去掉,就留一個(gè)屏和單片機(jī),屏上面顯示一個(gè)A字再說吧,
循序漸進(jìn)這四個(gè)多讀幾遍
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表