数码之家

 找回密码
 立即注册
搜索
查看: 517|回复: 10

[C51] 小白学51单片机,LCD12864无字库逐字显示一首诗

[复制链接]
发表于 2024-2-22 09:08:31 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hellozwt 于 2024-2-22 09:18 编辑

在前一个程序基础上修改而来,主要优化了显示代码
之前的显示代码是样的,
一行显示一个字,如果64字的内容要写64行,

192612iv1o56o5o5d6j331.png

新的代码是这样的,把中间3个数字全部用变量来代替,

void main(void)
{
    uchar a,b,c;   //a行 b列 c第几个字
    lcd_init();     //初始化
    lcd_clear();  //清屏
    for(c=0;c<32;c++)     //显示前32个字
    {
        if(c>=0&&c<=7)a=0;      //判断字数来确定行数 只写c>=0也可以,
        if(c>=8&&c<=15)a=2;
        if(c>=16&&c<=23)a=4;
        if(c>=24&&c<=31)a=6;
        lcd_write_cn(a,b,c,cn1);  //写出一个字
        b=b+16;         //列位置改变
        if(b==128)b=0;    //列位置归0
        delayms(200);
    }
    lcd_clear();  //清屏         
    for(c=32;c<64;c++)       //显示后32个字
    {
        if(c>=32&&c<=39)a=0;
        if(c>=40&&c<=47)a=2;
        if(c>=48&&c<=55)a=4;
        if(c>=56&&c<=63)a=6;
        lcd_write_cn(a,b,c,cn1);
        b=b+16;
        if(b==128)b=0;
        delayms(200);
    }   
    while(1);   
}


实际效果如下
201134rbj32nypjb3j8xvq.jpg

f59eae74ee64b6c165908ac3ab80eff.jpg



视频如下

3be7889f2a16ee6ef976e2ea2cd38492.mp4 (3.67 MB, 下载次数: 0)

打赏

参与人数 2家元 +39 收起 理由
家睦 + 30
hongo + 9 原創內容

查看全部打赏

发表于 2024-2-22 09:38:48 | 显示全部楼层
恭喜恭喜了!
回复 支持 反对

使用道具 举报

发表于 2024-2-22 09:40:47 | 显示全部楼层
厉害厉害,把这个屏幕手拿把掐了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-22 09:51:54 | 显示全部楼层
刚才有网友提出更简洁的方案,太厉害了,谢谢

void main(void)
{
    uchar b,c;   //a行 b列 c第几个字 a 不用了,直接用C来转换
    lcd_init();     //初始化
    lcd_clear();  //清屏
    for(c=0;c<32;c++)     //显示前32个字
    {
        lcd_write_cn((c>>3)<<1,b,c,cn1);  //写出一个字   
        b=b+16;         //列位置改变
        if(b==128)b=0;    //列位置归0
        delayms(200);
    }
    lcd_clear();  //清屏         
    for(c=32;c<64;c++)       //显示后32个字
    {
        lcd_write_cn((c>>3)<<1,b,c,cn1);
        b=b+16;
        if(b==128)b=0;
        delayms(200);
    }   
    while(1);   
}


回复 支持 反对

使用道具 举报

发表于 2024-2-22 09:57:32 | 显示全部楼层
你这个充分证明了实践是学习的最好方法。
回复 支持 反对

使用道具 举报

发表于 2024-2-22 10:04:28 | 显示全部楼层
编程是个少年活,老人不宜。
回复 支持 反对

使用道具 举报

发表于 2024-2-22 10:12:49 | 显示全部楼层
厉害了。。。值得每人v50
回复 支持 反对

使用道具 举报

发表于 2024-2-22 10:12:51 | 显示全部楼层
本帖最后由 wangbeng 于 2024-2-22 10:21 编辑

还有一个在编程中非常常用的方法可以简化:
   for(c=0;c<32;c++)     //显示前32个字
    {
        if(c>=0&&c<=7)a=0;      //判断字数来确定行数 只写c>=0也可以,
        if(c>=8&&c<=15)a=2;
        if(c>=16&&c<=23)a=4;
        if(c>=24&&c<=31)a=6;

        b=b+16;         //列位置改变
        if(b==128)b=0;    //列位置归0
        delayms(200);
    }


上面循环中的这段可以简化为:
a = (c / 8) * 2   或   (c  >> 3) << 1
b = (c % 8) * 16

回复 支持 反对

使用道具 举报

发表于 2024-2-22 10:16:51 | 显示全部楼层
把 gbk字库 存到外部存储,
16x16 也就 几百KB. 拿个 25p80 就够了.

能干的事更多,也不用废劲取模.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-22 10:30:11 | 显示全部楼层
本帖最后由 hellozwt 于 2024-2-22 10:32 编辑

c右移3位再左移1位,字0-31转换完成后是 0 2 4 6
字32-63转换后本来应该是8 10 12 14 但 前面有对0x07按接位与,所以也是0 2 4 6


回复 支持 反对

使用道具 举报

发表于 2024-2-22 10:52:28 来自手机浏览器 | 显示全部楼层
junyee 发表于 2024-2-22 10:16
把 gbk字库 存到外部存储,
16x16 也就 几百KB. 拿个 25p80 就够了.


还不如加个字库芯片,好像就一块钱多而已。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 23:11 , Processed in 0.202800 second(s), 27 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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