提供的代码,不是显示部分,无法判断。另仿真正常也会出现问题的 |
鬼影与单片机和显示有关系 |
既然仿真通过了,说明代码没问题。那仔细确认电路板上的管脚连接有没有问题。因为是第二行显示在第一行,说明显示地址出了问题,那就确认第一行和第二行的地址上的区别和对应的数据管脚有没有短路或者开路现象 |
啤酒瓶子老大 发表于 2021-12-19 09:30 但是在proteus上仿真是正常显示的 |
wc86110 发表于 2021-12-19 05:39 这是超声波的代码,在proteus上显示是正常的 uint GetDistance1(void) { uint ss; // 用于记录测得的距离 TH2=0; TL2=0; HCSR04_Trig=1; // 给超声波模块1一个开始脉冲 Delay_function(1); HCSR04_Trig=0; while(!HCSR04_Echo); // 等待超声波模块1的返回脉冲 TR2=1; // 启动定时器,开始计时 while(HCSR04_Echo); // 等待超声波模块1的返回脉冲结束 TR2=0; // 停止定时器,停止计时 ss=((TH2*256+TL2)*0.034)/2; // 距离cm=(时间us * 速度cm/us)/2 return ss; } |
#include <REGX52.H> //引脚配置: sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7; sbit LCD1602_BUSY=P0^7; //检测状态引脚P0.7 #define LCD_DataPort P0 //函数定义: /** * @brief LCD1602延时函数,12MHz调用可延时1ms * @param 无 * @retval 无 */ void LCD_Delay() { unsigned char i, j; i = 9; j = 244; do { while (--j); } while (--i); } void lcd1602_check_busy()//判忙 { P0=0xff; do { LCD_RS=0; LCD_RW=1; LCD_EN=0; LCD_EN=1; } while(LCD1602_BUSY==1); LCD_EN=0; } /** * @brief LCD1602写命令 * @param Command 要写入的命令 * @retval 无 */ void LCD_WriteCommand(unsigned char Command) { LCD_RS=0; LCD_RW=0; LCD_DataPort=Command; LCD_Delay(); LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } /** * @brief LCD1602写数据 * @param Data 要写入的数据 * @retval 无 */ void LCD_WriteData(unsigned char Data) { LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_Delay(); LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } /** * @brief LCD1602设置光标位置 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @retval 无 */ void LCD_SetCursor(unsigned char Line,unsigned char Column) { if(Line==1) { LCD_WriteCommand(0x80|(Column-1)); } else if(Line==2) { LCD_WriteCommand(0x80|(Column-1+0x40)); } } /** * @brief LCD1602初始化函数 * @param 无 * @retval 无 */ void LCD_Init() { LCD_Delay(); LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵 LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关 LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动 LCD_WriteCommand(0x01);//光标复位,清屏 } /** * @brief 在LCD1602指定位置上显示一个字符 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @param Char 要显示的字符 * @retval 无 */ void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char) { LCD_SetCursor(Line,Column); LCD_WriteData(Char); } /** * @brief 在LCD1602指定位置开始显示所给字符串 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param String 要显示的字符串 * @retval 无 */ void LCD_ShowString(unsigned char Line,unsigned char Column,char *String) { unsigned char i; LCD_SetCursor(Line,Column); for(i=0;String[i]!='\0';i++) { LCD_WriteData(String[i]); } } /** * @brief 返回值=X的Y次方 */ int LCD_Pow(int X,int Y) { unsigned char i; int Result=1; for(i=0;i<Y;i++) { Result*=X; } return Result; } /** * @brief 在LCD1602指定位置开始显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~65535 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */ void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0'); } } 能帮忙看下有啥问题不 |
好像把应该显示在第二行的数据显示在第一行了。 |
应该是程序问题 |
屏幕里出现鬼影不知道这超声波代码怎写的 |