数码之家

 找回密码
 立即注册
搜索
查看: 1858|回复: 5

[C51] 小白自学C51单片机编程,LCD1602显示字符

[复制链接]
发表于 2024-1-2 11:38:33 | 显示全部楼层 |阅读模式
本帖最后由 hellozwt 于 2024-1-2 17:04 编辑

先从最简单的开始,今天的任务是LCD1602显示字符,
先看资料,再看网上的例程,按自己的理解写最简单的程序,
以下为效果



以下为代码


//LCD1062显示字符,d0-d7接P2口
#include<reg52.h>    //头文件
typedef unsigned char u8;    //类型定义,无符号字符0-255
typedef unsigned int u16;    //类型定义,无符号整形0-65535

sbit LCD_RS = P0^4;   //位定义,数字或命令选择,         
sbit LCD_RW = P0^3;      //位定义,读写选择
sbit LCD_EN = P0^2;      //位定义使能

u8 code  table[ ] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"};        //要显示的字符

void delayms(u16 xms);    //声明子函数延时
void lcd1602_write_cmd(u8 cmd);    //声明子函数写命令
void lcd1602_write_dat(u8 dat);    //声明子函数写数据
void lcd1602_init();    //声明子函数初始化

void main()
{
     u16 i,j;    //声明2个变量,用于显示2行字符,
    lcd1602_init();    //调用初始化子函数
    lcd1602_write_cmd(0x80); //调用写命令子函数,从第一行第1位开始显示
    for(i=0;i<16;i++)    // 调用前16个字符
    {
         lcd1602_write_dat(table);    //调用写数据,
        delayms(5);
    }
    lcd1602_write_cmd(0xc0);    //第二行第1位开始显示
    for(j=16;j<32;j++)
    {
         lcd1602_write_dat(table[j]);    //调用写数据,
        delayms(5);
    }

    while(1);
}

void delayms(u16 xms)
{
     u8 i;    //定义一个变量
    while(xms--)    //设定值自减
    {
         for(i=0;i<113;i++);
    }
}

void lcd1602_write_cmd(u8 cmd)    //写命令
{
    LCD_RW=0;    //0写1读
    LCD_RS=0;    //0写命令1写数据
    P2=cmd;    //    把命令送到P2口
    delayms(5);    //
    LCD_EN=1;    // 使能
    delayms(5);    //
    LCD_EN=0;    // 关使能        
}

void lcd1602_write_dat(u8 dat)     //写数据
{
    LCD_RW=0;    //0写1读   
    LCD_RS=1;    //1写数据0写命令
    P2=dat;    //     把数据送到P2口
    delayms(5);    //
    LCD_EN=1;    // 使能
    delayms(5);    //
    LCD_EN=0;    //    关使能        
}

void lcd1602_init()       //初始化
{
    lcd1602_write_cmd(0x38);    //00111000显示2行5*7点阵8位数据
    lcd1602_write_cmd(0x0c);    //00001100开显示,光标关,无闪烁
    lcd1602_write_cmd(0x06);    //00000110写入一个字符后,光标右移,整屏不移
    lcd1602_write_cmd(0x01);    //00000001清屏
//    lcd1602_write_cmd(0x0f);    //00001111开显示,光标开,闪烁
//    lcd1602_write_cmd(0x80);    //第一行第1位开始显示
//    lcd1602_write_cmd(0xc0);    //第二行第1位开始显示
}

刚开始的时候我把所有字符输出,结果只显示第一行,后来才改成把字符分2行显示,


本帖子中包含更多资源

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

x
发表于 2024-1-2 11:58:03 | 显示全部楼层
这种屏是不是固定了单个字符显示位置?
回复 支持 反对

使用道具 举报

发表于 2024-1-2 13:39:45 | 显示全部楼层
搞得不错,继续学习
回复 支持 反对

使用道具 举报

发表于 2024-1-2 14:28:48 | 显示全部楼层
alangxl 发表于 2024-1-2 11:58
这种屏是不是固定了单个字符显示位置?

16 * 2 * (5px * 8px),每个字符固定在 16*2 的框架里。

当然可以自己在 5px*8px 的点阵里绘图,但一屏最多允许 8 个自定义点阵
回复 支持 反对

使用道具 举报

发表于 2024-1-2 16:23:06 | 显示全部楼层
这玩意是猪小呆的最爱。
@猪小呆
回复 支持 反对

使用道具 举报

发表于 2024-1-2 21:54:38 | 显示全部楼层
给你推荐一个B站的教程 51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili


我还是读书的时候学过51单片机,不过那个时候是AT的大片子。
现在都是STC的天下了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-9 17:01 , Processed in 0.202801 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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