找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 52|回复: 0
打印 上一主题 下一主题
收起左侧

为什么LCD不显示字

[复制链接]
跳转到指定楼层
楼主
本帖最后由 工藤新一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";// 内容
uchar xianshi2[] ="000%            ";// 内容
uint    wendu=0;
uchar count;
uchar jd=5;
bit work;        //开关标志

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.数据端口
        void delay(uint z)
{
   uint a,b;
   for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND                        0      // Command
#define LCD_DATA                        1      // Data
#define LCD_CLEAR_SCREEN        0x01      // 清屏
#define LCD_HOMING                  0x02      // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
        LcdEn=0;
        LcdRs=style;
        LcdRw=0;                _nop_();//写入LCD
        DBPort=input;        _nop_();//数据写入p0口
        LcdEn=1;                _nop_();//LCD读取数据
        LcdEn=0;                _nop_();//完成写入
delay(1);
}

//设置显示模式************************************************************
#define LCD_SHOW                        0x04    //显示开
#define LCD_HIDE                        0x00    //显示关         

#define LCD_CURSOR                        0x02         //显示光标
#define LCD_NO_CURSOR                0x00    //无光标                     

#define LCD_FLASH                        0x01    //光标闪动
#define LCD_NO_FLASH                0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
        LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        //0x08为基础命令码
}//进行组合显示,向LCD发送命令字
//设置输入模式************************************************************
#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为基础命令码
}//组合输入,向LCD发送命令字
//初始化LCD************************************************************
void LCD_Initial()
{
        LcdEn=0;
        LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
        delay(5);
        LCD_Write(LCD_COMMAND,0x38);
        delay(5);
        LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
        delay(5);
        LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
        delay(5);
        LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //地址计数器递增, 画面不动
        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);//数据写入
                str++;
                delay(1);
        }
}
void init()// 定时器初始化
{
        TMOD=0x01;
  TH0=TL0=(256-200); //高八位寄存器和低八位寄存器初始值为56即0x38
  ET0=1;//开定时器0中断
        TR0=1;
        EA=1;//开总中断
}

void Delay_DS18B20(int num);

/*****初始化DS18B20*****/  //探头1
void Init_DS18B20()
{
  unsigned char x;//用于存储从DS18B20读取的状态
  DQ=1;                //DQ复位
  Delay_DS18B20(8);    //稍做延时
  DQ = 0;         //单片机将DQ拉低
  Delay_DS18B20(80);   //精确延时,大于480us
  DQ = 1;         //拉高总线
  Delay_DS18B20(14);
  x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  Delay_DS18B20(20);
}


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


/*****写一个字节*****/
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;
  }
}

/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DQ = 0;     // 给脉冲信号
    dat>>=1;
    DQ = 1;     // 给脉冲信号
    if(DQ)
    dat|=0x80;
    Delay_DS18B20(4);
  }
  return(dat);
}



/*****读取温度*****/
unsigned int ReadTemperature(void)         //读取温度并转换
{
  unsigned char a=0;
  unsigned char b=0;
  unsigned int t=0;
         unsigned int tempb20;
  float f_temp=0;
        
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳过读序号列号的操作
  WriteOneChar(0x44);  //启动温度转换
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳过读序号列号的操作
  WriteOneChar(0xBE);  //读取温度寄存器
  a=ReadOneChar();     //读低8位
  b=ReadOneChar();    //读高8位

tempb20=b;//组合温度值
        tempb20<<=8;
        tempb20=tempb20|a;

        if((b&0xfc)==0xfc)//负温度
   {
            flang=1;
                   tempb20=((~tempb20)+1);//处理负温度
                          f_temp=tempb20*0.0625;//转换成浮点数
                                 tempb20=f_temp*10+0.5;//转换成整数

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

}
         return tempb20;
}

main()
{        

        uchar k;
        LCD_Initial();
        
        PWM1=0;//设置电机控制
        IN1=0;
        IN2=1;
        init();

while(1)
{                        
          if(k==0)
                        {
                                EA=0;
        wendu=ReadTemperature();//读取温度数据
                                EA=1;
                   }
                if(k++>25) k=0;//每26次循环读取一次温度值,确保温度读取不会过于频繁

        if(k1)//如果温度超过27°C,计算PWM占空比(自动模式),jd范围0-10
        {               
                if(wendu>=270)
                {
                 jd=(wendu/10)-27;
                }
                else jd=0;
        }
        else
        {
        

                 if(k2==0)//PWM+(手动模式)
            {
                   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)//表示温度是负数
                xianshi1[10]='-';
                else
                xianshi1[10]=' ';        

    xianshi1[11]=wendu/100+0x30;//百位
          xianshi1[12]=wendu/10%10+0x30;//十位
          xianshi1[14]=wendu%10+0x30;//个位
               
               
          xianshi2[0]=jd/10+0x30;//个位
          xianshi2[1]=jd%10+0x30;//十位
         

                GotoXY(0,0);//坐标位置
                Print(xianshi1);
                GotoXY(0,1);
                Print(xianshi2);        
               
}
}
void time0(void) interrupt 1 //更新占空状态
{
     TH0=0xfc;
     TL0=0x18;
                 if(count<jd)                //判断1ms次数是否小于角度标识         
                 PWM1=1;                   //确实小于,PWM输出高电平
                 else
                 PWM1=0 ;//PORTA=0;        //大于则输出低电平
                 
                count=(count+1);          //1ms次数加1
                if(count>=10)
                count=0;
}               

1.png (47.06 KB, 下载次数: 0)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表