普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1165|回复: 0

[已解决] 记录并分享通过LCD1602液晶屏实验发现的知识点

[复制链接]

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
发表于 2023-7-25 14:33:58 | 显示全部楼层 |阅读模式
本帖最后由 zhong_zhiqi 于 2023-7-25 14:51 编辑

开始进入官方视频的下半部了,在完成P24这一节内容后,感觉讲师展示的代码可以从两点完善:
1- LCD1602显示字符串的函数:在开始先进行参数有效性的检查,既然检查的x、y参数的有效性,还应该验证字符串参数的有效性,否则如果主函数调用时提供的实参超出了显示范围,就会丢失显示内容。
    验证的原则是字符串的长度(不包含最后的\0)应该小于、等于“最大显示长度-32”减去“起始偏移量-x”,并入检查语句就是:if((y>1)||(x>15)||((strlen(str)+x)>32)),这样可以防止字符串超出显示范围,因为超界时程序执行是不会报错的,只会显示到最大长度。strlen()函数是调用string库的标准函数,因此还需要在 public.h 中加上 #include "string.h"。

2- 接下来,显示字符串的函数既然有参数有效性检查的步骤,那么通过返回值体现执行结果给调用的主函数是一个应该有的步骤,否则验证失败后退出函数后,屏幕一片空白,让人莫名其妙。
    所以简单的用0、1代表异常推出和正常执行就好,函数改为:

u8 lcd1602_show_string(u8 x, u8 y, u8 *str)
{
        u8 i=0;

        if((y>1)||(x>15)||((strlen(str)+x)>32))        return 0;


        if(y<1)
        {
                 while(*str!='\0')
                 {
                         if(i<(16-x))
                        {
                                 lcd1602_write_cmd(0x80+x+i);
                        }
                        else
                        {
                                lcd1602_write_cmd(0x80+0x40+x+i-16);
                        }
                        i++;
                        lcd1602_write_data(*str);
                        str++;
                 }
        }
        else
        {
                 while(*str!='\0')
                 {
                         if(i<(16-x))
                        {
                                 lcd1602_write_cmd(0x80+0x40+x+i);
                        }
                        else
                        {
                                // i-=16;
                                lcd1602_write_cmd(0x80+x+i-16);
                        }
                        i++;
                        lcd1602_write_data(*str);
                        str++;
                }                 
        }
        return 1;
}


主函数调用过程改为:
....
        if(!lcd1602_show_string(<x>,<y>,"0123456789012345678901234567890"))
                lcd1602_show_string(0,0,"Wrong argument!");

....
3- 补充一点,J24跳线旁边的电位器是控制LCD1602的显示偏压的,也就是显示字符与背光之间对比度。由于板子设计的原因,一旦把LCD1602子卡插上实验板后,刚好把这个电位器就被挡住了,调节时必须拔掉LCD1602子卡。我的经验是:不要放在水平位置,也不要90度垂直,调节到20-30度的时候显示效果最舒适。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-28 06:28 , Processed in 0.082774 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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