[51单片机]

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

[复制链接]
1848|8
手机看帖
扫描二维码
随时随地手机跟帖
看下你的数据格式

使用特权

评论回复
xuyaosong|  楼主 | 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,其他显示都对的。

谢谢帮助

使用特权

评论回复
mcu5i51| | 2017-9-14 15:02 | 显示全部楼层
S=0x53
c=0x63
Bit 5 恒为1
数字中本来bit5就是1,没有影响

使用特权

评论回复
评论
zhaoyu2005 2017-9-14 17:20 回复TA
牛逼 
xuyaosong|  楼主 | 2017-9-14 15:22 | 显示全部楼层
mcu5i51 发表于 2017-9-14 15:02
S=0x53
c=0x63
Bit 5 恒为1

您说的没有影响是什么意思?

使用特权

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

一行只能显示16个字符,你的字符串大于16个

使用特权

评论回复
xuyaosong|  楼主 | 2017-9-14 15:52 | 显示全部楼层
解决了,确实是bit5的问题。谢谢

使用特权

评论回复
chineseboyzxy| | 2017-9-15 09:25 | 显示全部楼层
前些天搞一个从佳能复印机上拆下来的液晶显示模块,LCD2002,两行20个字符的,也是焊插座连线时有一根数据线虚焊,显示错乱,少了一根数据线,送到屏上的ASCII码不对了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

550

帖子

0

粉丝