淡漠清愁*& 2022-06-12 23:34 采纳率: 57.1%
浏览 37
已结题

LCD显示脉宽,程序出现错误


#include <reg51.h>

#define LCD1602_DB P0
sbit LCD1602_RS = P2^5;
sbit LCD1602_RW = P2^6;
sbit LCD1602_EN = P2^7;
#define LCD_MODE_PIN8 0x38//8位数据口,两行,5*8点阵
#define LCD_MODE_PIN4 0x28//4位数据口,两行,5*8点阵
#define LCD_SCREEN_CLR 0x01//清屏
#define LCD_CURSOR_RST 0x02//光标复位
#define LCD_DIS_CUR_BLK_ON 0x0F
#define LCD_DIS_CUR_ON     0x0E
#define LCD_DIS_ON         0x0C
#define LCD_DIS_OFF 0x08
#define LCD_CURSOR_RIGHT 0x06
#define LCD_CURSOR_LEFT 0x04
#define LCD_DIS_MODE_LEFT 0x07
#define LCD_DIS_MODE_RIGHT 0x05
#define LCD_CUR_MOVE_LEFT 0x10 //光标左移
#define LCD_CUR_MOVE_RIGHT 0x14 //光标右移
#define LCD_DIS_MOVE_LEFT 0x18 //显示左移
#define LCD_DIS_MOVE_RIGHT 0x1C //显示右移


//void timer3_Init(void) //100微秒
//{
//    TMOD &= 0x0f;
//    TMOD |= 0x;
//}

//void timer3_ISR(void) interrupt 3
//{
//
//}


//下边是测量脉冲宽度代码

unsigned int High,Low;
sbit K=P3^3;

void Init_T3()
{
    TMOD=0x90;
    TH1=0;
    TL1=0;
}


void Message_Width()
{
    while(K);
    TR1=1;
    while(!K);
    while(K);
    TR1=0;
    High=TH1;
    Low=TL1;
}




//下边是LCD显示操作代码
void DelayXms(unsigned int xms)
{
    unsigned int i,j;
      for(i=xms;i>0;i--)
      {
        for(j=124;j>0;j--)
        {
      
        }
      }
}

void LCDReadBF()//忙位检测,state最高位为1时,程序在忙,等待
{
    unsigned char state;
    unsigned char i;
    LCD1602_DB = 0xFF;//IO口先置1,做输入
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do
    {
    LCD1602_EN = 1;
    state = LCD1602_DB; 
    LCD1602_EN = 0;
    i++;
    if(i>50)
        break;//防止忙位信号出现问题
    }
      while(state & 0x80);
}

void LCDWriterCmd(unsigned char cmd)
{
    LCDReadBF();//等待忙检测,不忙时操作
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_EN = 1;
    LCD1602_EN = 0;//单片机执行速度为1ms,大于150ns
}

void LCDWriterData(unsigned char dat)
{
    LCDReadBF();//等待忙检测,不忙时操作
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_EN = 1;
    LCD1602_EN = 0;//单片机执行速度为1ms,大于150ns
}
void LCDInit()
{
    LCDWriterCmd(LCD_MODE_PIN8);//显示模式设置,为2行,5*8点阵
    LCDWriterCmd(LCD_DIS_ON);//显示开,光标关
    LCDWriterCmd(LCD_CURSOR_RIGHT);//光标右移
    LCDWriterCmd(LCD_SCREEN_CLR);//清屏
}
void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str)
{
     if(y == 0)
     {
         LCDWriterCmd(0x80 | x);
    }
    else
     {
        LCDWriterCmd(0x80 | (0x40 + x));
    }
    while(*str != '\0')
    {
        LCDWriterData(*str);
        str++;
    }
}


void main()
{
    unsigned char str[] = "Hello LCD 1602";
    //****************
    unsigned int num;
    unsigned char stg[] = {};

    Init_T3();
    Message_Width();
    num = High*256+Low;
    itoa(num,stg,10);
    //****************

    LCDInit();
    DelayXms(10);
    LCDShowStr(0,0,stg);
    while(1);
}

img


请问大家,为什么会出现这样的问题呢,弄了半天还没整好

  • 写回答

2条回答 默认 最新

  • Tristan Tsai 2022-06-13 06:48
    关注

    unsigned char stg[] = {};

    这条语句这么初始化定义看起来不对。要么给stg后面的中括号[]里面指定长度。要么大括号{}里面赋值,也可以指定长度。

    就像143行这句定义
    unsigned char str[] = "Hello LCD 1602";

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

报告相同问题?

问题事件

  • 系统已结题 6月27日
  • 已采纳回答 6月19日
  • 创建了问题 6月12日

悬赏问题

  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了