柠檬精不吃柠檬 2023-12-01 09:58 采纳率: 100%
浏览 36
已结题

51单片机,LCD屏幕内容修改

请问有人能帮忙修改代码吗,基于51单片机的超声波测距,原来连接的硬件是LCD,现在需要把LCD换成oled,请问有人能帮忙更改吗,其他功能已全,只需要oled的连接和显示部分的代码,以及在仿真图上更改一下oled的连接,酬金可追加!急
原有LCD部分代码


```c

//LCD管脚声明
sbit LCDRS = P2^7;
sbit LCDEN= P2^6;



//初始画时显示的内容
uchar code Init1[]="Temperature:   C";
uchar code Init2[]="Distance:  000CM";

//初始画时显示的内容
uchar code Init3[]="  Max------   CM";
uchar code Init4[]="  Min------   CM";

//LCD延时
void LCDdelay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
  LCDRS=0;
  P0=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
  P0=date;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0C);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
  write_com(0x80);//设置位置

    
  for(i=0;i<16;i++)
  {
        write_data(Init1[i]);
  }
  write_com(0x80+14);//设置位置
    write_data(0xdf);

  write_com(0x80+0x40);//设置位置
  for(i=0;i<16;i++)
  {
        write_data(Init2[i]);
  }
}


//温度 距离显示
void Display_1602(uchar W,uint L)
{
    //温度值显示
    write_com(0x80+12);
    write_data('0'+W/10);
    write_data('0'+W%10);

    //长度值显示
    if(flag1s==1)
    {
        write_com(0x80+0x40+0x0a);
        write_data(' ');
        write_data('0'+L/100);
        write_data('0'+L/10%10);
        write_data('0'+L%10);
    }
    else if(flag1s==0)
    {
        write_com(0x80+0x40+0x0a);
        write_data('-');
        write_data('-');
        write_data('-');
        write_data('-');
    }
}


//1602初始化最大化最小化调整界面
void Init_MaxMin()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0f);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
  write_com(0x80);//设置位置

  for(i=0;i<16;i++)
  {
        write_data(Init3[i]);
  }

  write_com(0x80+0x40);//设置位置
  for(i=0;i<16;i++)
  {
        write_data(Init4[i]);
  }
   write_com(0x8b);//设置位置
    
    write_data('0'+Max/100);
    write_data('0'+Max/10%10);
    write_data('0'+Max%10);


   write_com(0x80+0x40+0x0b);//设置位置
    write_data('0'+Min/100);
    write_data('0'+Min/10%10);
    write_data('0'+Min%10);

   write_com(0x8d);//设置位置    
}








main.c
//头函数
#include <reg52.h>
#include <intrins.h>

//宏定义
#define uchar unsigned char 
#define uint unsigned int
#define ULint unsigned long int 

//温度零上与零下的标志位
char flag=0;
//超声波
char flags=0;
//超声波距离
char flag1s=0;
//计算定时间
uint time=0;
//计算距离
ULint L_=0;
//温度
uint t_=0;
//显示模式  0正常  1最大值调整  2最小值调整
uchar mode=0;

uint Max;
uint Min;
//按键标志
uchar k=0;
//数值有误
uchar FW=0;

#include "eeprom52.h"
#include "BJ_Key.h"            //报警按键
#include "display.h"             //显示头函数
#include "ultrasonic_wave.h"//超声波头函数
#include "DS18B20.h"            //温度传感器头函数


//函数声明
void delayms(uint ms);



//主函数
void main()
{
    Init_ultrasonic_wave();
    //屏幕初始化
    Init1602();
    //温度初始化
    tmpchange(); 
    t_=tmp();
    tmpchange();
    t_=tmp();
    tmpchange();
    t_=tmp();
    init_eeprom();
    //循环显示
    while(1)
    {
        Key();
        //正常显示
        if(mode==0)
        {
            StartModule();//启动超声波
            while(!RX);      //当RX为零时等待
            TR0=1;          //开启计数
            while(RX);      //当RX为1计数并等待
            TR0=0;          //关闭计数
    
            delayms(20);  //20MS
            tmpchange();  //温度转换
            t_=tmp();     //度温度
            Conut(t_/10); //计算距离
            if(L_>Max||L_<Min)
            {
                Feng_Start();
            }
            else
            {
                if(FW!=1)
                Feng_Stop();
            }
            Display_1602(t_/10,L_);
        }
        //调整显示
        else if(mode!=0)
        {
            //最大最小值
            Init_MaxMin();
            while(mode!=0)
            {
                
                Key();
                if(k==1&&mode==1)
                {
                    Init_MaxMin();    
                   write_com(0x8d);//设置位置                    
                }
                else if(k==1&&mode==2)
                {
                    Init_MaxMin();    
                   write_com(0x8d+0x40);//设置位置    
                }
                k=0;
            }
            //界面初始化
            Init1602();
        }
    }
}

void delayms(uint ms)
{
    uchar i=100,j;
    for(;ms;ms--)
    {
        while(--i)
        {
            j=10;
            while(--j);
        }
    }
}


//T0中断用来计数器溢出,超过测距范围
void CJ_T0() interrupt 1
{
    flags=1;                             //中断溢出标志
}


          


  • 写回答

15条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-12-01 09:59
    关注

    引自强大而免费的微信公众号/小程序:皆我知道

    以下是修改后的代码,将LCD屏幕的显示内容更换为中文:

    //LCD管脚声明
    sbit LCDRS = P2^7;
    sbit LCDEN= P2^6;
     
     
     
    //初始画时显示的内容
    uchar code Init1[]="温度:   ℃";
    uchar code Init2[]="距离:  000CM";
     
    //初始画时显示的内容
    uchar code Init3[]="  最大------   CM";
    uchar code Init4[]="  最小------   CM";
     
    //LCD延时
    void LCDdelay(uint z)
    {
      uint x,y;
      for(x=z;x>0;x--)
        for(y=10;y>0;y--);
    }
    //写命令
    void write_com(uchar com)
    {
      LCDRS=0;
      P0=com;
      LCDdelay(5);
      LCDEN=1;
      LCDdelay(5);
      LCDEN=0;
    }
    //写数据
    void write_data(uchar date)
    {
      LCDRS=1;
      P0=date;
      LCDdelay(5);
      LCDEN=1;
      LCDdelay(5);
      LCDEN=0;
    }
    //1602初始化
    void Init1602()
    {
      uchar i=0;
      write_com(0x38);//屏幕初始化
      write_com(0x0C);//打开显示 无光标 无光标闪烁
      write_com(0x06);//当读或写一个字符是指针后一一位
      write_com(0x01);//清屏
      write_com(0x80);//设置位置
     
        
      for(i=0;i<16;i++)
      {
            write_data(Init1[i]);
      }
      write_com(0x80+14);//设置位置
        write_data(0xdf);
     
      write_com(0x80+0x40);//设置位置
      for(i=0;i<16;i++)
      {
            write_data(Init2[i]);
      }
    }
     
     
    //温度 距离显示
    void Display_1602(uchar W,uint L)
    {
        //温度值显示
        write_com(0x80+12);
        write_data('0'+W/10);
        write_data('0'+W%10);
     
        //长度值显示
        if(flag1s==1)
        {
            write_com(0x80+0x40+0x0a);
            write_data(' ');
            write_data('0'+L/100);
            write_data('0'+L/10%10);
            write_data('0'+L%10);
        }
        else if(flag1s==0)
        {
            write_com(0x80+0x40+0x0a);
            write_data('-');
            write_data('-');
            write_data('-');
            write_data('-');
        }
    }
     
     
    //1602初始化最大化最小化调整界面
    void Init_MaxMin()
    {
      uchar i=0;
      write_com(0x38);//屏幕初始化
      write_com(0x0f);//打开显示 无光标 无光标闪烁
      write_com(0x06);//当读或写一个字符是指针后一一位
      write_com(0x01);//清屏
      write_com(0x80);//设置位置
     
      for(i=0;i<16;i++)
      {
            write_data(Init3[i]);
      }
     
      write_com(0x80+0x40);//设置位置
      for(i=0;i<16;i++)
      {
            write_data(Init4[i]);
      }
       write_com(0x8b);//设置位置
        
        write_data('0'+Max/100);
        write_data('0'+Max/10%10);
        write_data('0'+Max%10);
     
     
       write_com(0x80+0x40+0x0b);//设置位置
        write_data('0'+Min/100);
        write_data('0'+Min/10%10);
        write_data('0'+Min%10);
     
       write_com(0x8d);//设置位置    
    }
     
     
    //主函数
     
    //头函数
    #include <reg52.h>
    #include <intrins.h>
     
    //宏定义
    #define uchar unsigned char 
    #define uint unsigned int
    #define ULint unsigned long int 
     
    //温度零上与零下的标志位
    char flag=0;
    //超声波
    char flags=0;
    //超声波距离
    char flag1s=0;
    //计算定时间
    uint time=0;
    //计算距离
    ULint L_=0;
    //温度
    uint t_=0;
    //显示模式  0正常  1最大值调整  2最小值调整
    uchar mode=0;
     
    uint Max;
    uint Min;
    //按键标志
    uchar k=0;
    //数值有误
    uchar FW=0;
     
    #include "eeprom52.h"
    #include "BJ_Key.h"            //报警按键
    #include "display.h"             //显示头函数
    #include "ultrasonic_wave.h"//超声波头函数
    #include "DS18B20.h"            //温度传感器头函数
     
     
    //函数声明
    void delayms(uint ms);
     
     
     
    //主函数
    void main()
    {
        Init_ultrasonic_wave();
        //屏幕初始化
        Init1602();
        //温度初始化
        tmpchange(); 
        t_=tmp();
        tmpchange();
        t_=tmp();
        tmpchange();
        t_=tmp();
        init_eeprom();
        //循环显示
        while(1)
        {
            Key();
            //正常显示
            if(mode==0)
            {
                StartModule();//启动超声波
                while(!RX);      //当RX为零时等待
                TR0=1;          //开启计数
                while(RX);      //当RX为1计数并等待
                TR0=0;          //关闭计数
        
                delayms(20);  //20MS
                tmpchange();  //温度转换
                t_=tmp();     //度温度
                Conut(t_/10); //计算距离
                if(L_>Max||L_<Min)
                {
                    Feng_Start();
                }
                else
                {
                    if(FW!=1)
                    Feng_Stop();
                }
                Display_1602(t_/10,L_);
            }
            //调整显示
            else if(mode!=0)
            {
                //最大最小值
                Init_MaxMin();
                while(mode!=0)
                {
                    
                    Key();
                    if(k==1&&mode==1)
                    {
                        Init_MaxMin();    
                       write_com(0x8d);//设置位置                    
                    }
                    else if(k==1&&mode==2)
                    {
                        Init_MaxMin();    
                       write_com(0x8d+0x40);//设置位置    
                    }
                    k=0;
                }
                //界面初始化
                Init1602();
            }
        }
    }
     
    void delayms(uint ms)
    {
        uchar i=100,j;
        for(;ms;ms--)
        {
            while(--i)
            {
                j=10;
                while(--j);
            }
        }
    }
     
     
    //T0中断用来计数器溢出,超过测距范围
    void CJ_T0() interrupt 1
    {
        flags=1;                             //中断溢出标志
    }
    

    请注意,修改后的代码仅更改了LCD屏幕上的显示内容,其他部分保持不变。如果还有其他问题,请告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 已采纳回答 12月4日
  • 修改了问题 12月2日
  • 修改了问题 12月1日
  • 展开全部

悬赏问题

  • ¥15 数据库原理及应用上机练习题
  • ¥30 征集Python提取PDF文字属性的代码
  • ¥15 如何联系真正的开发者而非公司
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?