查看: 162|回复: 8
收起左侧

[51单片机] 单片机驱动1602,线路连接没问题,但是显示的时候,数字正常,小写字母变成大写字母了

[复制链接]
     

45

主题

545

帖子

2264

积分

初级工程师

 楼主| 发表于 2017-9-14 11:29 | 显示全部楼层 |返回版面||阅读模式
电路连接就是网上找的用的最多的,显示的时候发现小写字母变成大写,而且没有联系,例如小写的a变成了Q。而数字能正常显示,显示大写字母的时候,前面一些都没问题,后面的又自动变成其他的小写字母。
不知道则么回事,有遇到过的请指点,谢谢
      

51

主题

1230

帖子

4119

积分

版主

发表于 2017-9-14 12:05 | 显示全部楼层 |返回版面
看下你的数据格式
qq:641208111;技术交流群:377640799
欢迎去大赛专区交流:点我进入()
欢迎加个人QQ:641208111一起交流合作
     

45

主题

545

帖子

2264

积分

初级工程师

 楼主| 发表于 2017-9-14 14:22 | 显示全部楼层 |返回版面
/**等待液晶准备好***/
void LcdWaitReady()
{
        uint8 sta;                //定义一个变量用于存放状态字
        LCD1602_DB=0xff;    //读取之前先置1
    LCD1602_RS=0;       //数据/命令(H/L)
        LCD1602_RW=1;            //读/写(H/L)
        do
        {
                LCD1602_E=1;    //使能位置1
                sta=LCD1602_DB; //读取状态字
                LCD1602_E=0;    //使能位清零       
        }while(sta&0x80);    //BIT7等于1表示液晶正忙,重复检测直到其等于0为止
}

/***向液晶写入一字节的命令,cmd-待写入的命令值***/
void LcdWriteCmd(uint8 cmd)
{
        LcdWaitReady();                //查询是否忙,忙的话继续等待,不忙的话往下进行
    LCD1602_RS=0;                //数据/命令(H/L)
        LCD1602_RW=0;            //读/写(H/L)
        LCD1602_DB=cmd;     //把待写入的命令字节赋给1602数据口
        LCD1602_E=1;        //使能位置1
    LCD1602_E=0;        //使能位清零,目的是产生一个高脉冲,在下降沿的时候会把命令写入
}

/* 向 LCD1602 液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(uint8 dat)
{
        LcdWaitReady();                //查询是否忙,忙的话继续等待,不忙的话往下进行
        LCD1602_RS=1;                //数据/命令(H/L)
        LCD1602_RW=0;            //读/写(H/L)
        LCD1602_DB=dat;     //把待写入的数据字节赋给1602数据口
        LCD1602_E=1;        //使能位置1
    LCD1602_E=0;        //使能位清零,目的是产生一个高脉冲,在下降沿的时候会把命令写入
}

/***设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标***/
void LcdSetCursor(uint8 x,uint8 y)
{
        uint8 addr;        //由输入的屏幕坐标计算显示RAM的地址
        if(y==0)
                addr=0x00+x;    //第一行字符地址从0x00开始
        else
                addr=0x40+x;    //第二行字符地址从0x40开始
        LcdWriteCmd(addr|0x80);  //设置RAM地址
}

/***在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针***/
void LcdSetStr(uint8 x,uint8 y,uint8 *str)
{
        LcdSetCursor(x,y);         //设置起始地址
        while(*str!='\0')
        {
                LcdWriteDat(*str++); //先取str指向的数据,然后str自加1       
        }

}

/***初始化1602液晶***/
void InitLcd1602()
{
        LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据口
        LcdWriteCmd(0x0c);  //显示器开,光标关闭
        LcdWriteCmd(0x06);  //文字不动,地址自加1
        LcdWriteCmd(0x01);  //清屏       
}




+++++++++++++++++++++++++++++++
主函数里面:
InitLcd1602();              //初始化1602
LcdWriteCmd(0x01);         //清屏
LcdSetStr(0,0,"SF:ABCDEFGHIJKLMN");
LcdSetStr(0,1,"1234567890abcdefg");



实际情况显示:上面显示内容中,S显示成c,abcdef显示成QRSTUV,其他显示都对的。

谢谢帮助
做个机器人,欧耶!提高专注力
     

4

主题

1348

帖子

4143

积分

中级工程师

发表于 2017-9-14 15:02 | 显示全部楼层 |返回版面
S=0x53
c=0x63
Bit 5 恒为1
数字中本来bit5就是1,没有影响

点评

牛逼  发表于 2017-9-14 17:20
     

45

主题

545

帖子

2264

积分

初级工程师

 楼主| 发表于 2017-9-14 15:22 | 显示全部楼层 |返回版面
mcu5i51 发表于 2017-9-14 15:02
S=0x53
c=0x63
Bit 5 恒为1

您说的没有影响是什么意思?
做个机器人,欧耶!提高专注力
     

4875

主题

1万

帖子

2万

积分

版主

发表于 2017-9-14 15:27 | 显示全部楼层 |返回版面
xuyaosong 发表于 2017-9-14 14:22
/**等待液晶准备好***/
void LcdWaitReady()
{

一行只能显示16个字符,你的字符串大于16个
21ic公开课,21ic网友共同的学习圈子!
     

45

主题

545

帖子

2264

积分

初级工程师

 楼主| 发表于 2017-9-14 15:52 | 显示全部楼层 |返回版面
解决了,确实是bit5的问题。谢谢
做个机器人,欧耶!提高专注力
     

0

主题

5

帖子

25

积分

实习生

发表于 2017-9-15 09:25 | 显示全部楼层 |返回版面
前些天搞一个从佳能复印机上拆下来的液晶显示模块,LCD2002,两行20个字符的,也是焊插座连线时有一根数据线虚焊,显示错乱,少了一根数据线,送到屏上的ASCII码不对了。
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

关闭

热门推荐上一条 /3 下一条

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