历史上的今天

今天是:2025年11月12日(星期三)

正在发生

2022年11月12日 | 【51单片机】1602自定义字符原理及示例(”汉“、爱心及摄氏度示例)

发布者:真诚相伴 来源: csdn关键字:51单片机 手机看文章 扫描二维码
随时随地手机看文章

原理



设置1602屏幕的对比度的时候我们能够看到5*8的点阵,其实液晶显示的都是字符的字模(下图),而CGROM里面都是已经定义好的,只能读不能写,而RAM是可以读写的所以我们只要将我们自定义的字符字模写入对应的CGRAM中就好,CGRAM一共有8个对应的地址分别为(0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78),因为每个字模对应8行所以每写完一个字模以后要加8,按照指令写入CGRAM时需要加0x40所以对应地址就如上了,然而其实CGRAM的实际地址是0x00-0x07所以在后面写入数据的时候需要按照实际地址来写入。CGROM中的字模也是同样的原理

     

字模代码:1602显示模式为5*7点阵型,字模代码对应于字模图形的8行,每行的前三位都是0,最后一行都是0x00,所以摄氏度的字符代码为:0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00


字模代码的获取可以用ZIMO221字模提取软件。                      


示例代码

#include

 

#include   //strlen头文件

 

//为各不同位数变量类型定义自定义符号

 

#define uint8    unsigned char

 

#define uint16   unsigned short int

 

#define uint32   unsigned long int

 

#define int8     signed char

 

#define int16    signed short int

 

#define int32    signed long int

 

#define uint64   unsigned long long int

 

#define int64    signed long long int

 

//定义1602中一些常用的指令,方便不同的读者可以根据自己的修改

 

#define SETMODE   0x38          //16*2显示,5*7点阵,8位数据接口

 

#define DISOPEN   0x0C          //显示开,不显示光标,光标不闪烁

 

#define DISMODE   0x06          //读写字符后地址加1,屏显不移动

 

#define SETADDR   0x80          //设置数据地址指针初始值

 

#define CLEAR     0x01          //清屏,数据指针清零

 

#define RET       0x02          //回车,数据指针清零 

 

#define PORT      P0            //I/O口 

 

sbit RS = P3^5;

 

sbit E = P3^4; 

 

sbit dula = P2^6;

 

sbit wela = P2^7;

 

 

void delay(uint16 time);

 

void Write1602_Com(uint8 com);

 

void Write1602_Dat(uint8 dat);

 

void Init1602(void);

 

void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf);

 

uint8 code xin[8]={ //心字模

0x00,0x1B,0x1F,0x1F,0x1F,0x0E,0x04,0x00

};

 

uint8 code hot[8]={                                  //摄氏温度字模

 

0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00

 

};

 

uint8 code zuo[8]={ //汉的左部分字模

0x00,0x02,0x01,0x02,0x01,0x01,0x02,0x00

};

 

uint8 code you[8]={ //汉的右部分字模

0x00,0x1e,0x12,0x0c,0x0a,0x11,0x00,0x00             

};

 

uint8 i; 

 

void main()

 

{

 

    Init1602();                                      //初始化1602 

 

    //自定义CGRAM

 

    Write1602_Str(0x40,8,hot);                                           //摄氏温标->CGRAM的内存000中

 

    Write1602_Str(0x48,8,zuo); //汉的左部分->CGRAM的内存001中

 

    Write1602_Str(0x50,8,you); //汉的右部分->CGRAM的内存010中

 

    Write1602_Str(0x58,8,xin); //心->CGRAM的内存011中

 

    Write1602_Com(0x80); //设置DDRAM地址,即显示的位置

 

    for(i=0;i<8;i++)

 

       Write1602_Dat(0);

 

for(i=0;i<8;i++)

 

       Write1602_Dat(3);

 

    Write1602_Com(0xc0);                             //同上

 

    for(i=0;i<16;i++)

 

       Write1602_Dat(1+i%2);

 

    while(1);

 

 

void delay(uint16 time)

 

{

    uint8 i,j;

 

for(i=time;i>0;i--)

 

for(j=0;j<110;j++);

 

 

void Init1602(void)

 

{

dula=0;    //关闭数据管的显示,因为我的51对应的是数据管的输入

 

wela=0;    //所以需要锁存器锁定来关闭影响

 

    Write1602_Com(SETMODE);     //模式设置

 

    delay(5);

 

    Write1602_Com(DISOPEN);     //显示设置

 

    delay(5);

 

    Write1602_Com(DISMODE);     //显示模式

 

    delay(5);

 

    Write1602_Com(CLEAR);       //清屏

 

    delay(5);

 

 

void Write1602_Dat(uint8 dat)

 

{

 

    E=0;

 

    RS=1;                    //数据

 

    delay(5);               //延时

 

    PORT=dat;                //端口赋值

 

    delay(5);

 

    E=1;                     //高脉冲

 

    delay(5);

 

    E=0;

 

 

void Write1602_Com(uint8 com)

 

{

 

    E=0;

 

    RS=0;                    //命令

 

    delay(5);               //延时

        

    PORT=com;                //端口赋值

 

    delay(5);

 

    E=1;                     //高脉冲

 

    delay(5);

 

    E=0;

 

}

 

void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf)

 

{

 

    uint8 i; 

 

    Write1602_Com(addr);

 

    for(i=0;i 

    {

 

       Write1602_Dat(pbuf[i]);

 

    }

 


效果

有点丑。。。。字模的问题,所以大家可以自己去设计。


总结:


1.设计自定义字符的字模并获取字符代码


2.在CGRAM对应的位置写入字符代码


3.在DDRAM中写入CGRAM对应的地址

关键字:51单片机 引用地址:【51单片机】1602自定义字符原理及示例(”汉“、爱心及摄氏度示例)

上一篇:【51单片机】1602 CGRAM、CGROM及DDRAM的作用
下一篇:STC89C52单片机学习(一)----点亮LED

推荐阅读

集微网消息, 5G 商用已经如箭在弦,各大手机厂商早已磨拳擦掌,为了成为首批提供 5G 手机的手机厂商这一,此前一加手机 CEO 刘作虎已经表示,一加将会率先推出支持 5G 网络的旗舰产品。        据外媒 CNET 报道,作为高通合作厂商之一,一加手机将在明年年初推出 5G 手机。但对于 5G 手机,一加似乎更希望 5G 新机型可以开拓一...
(文章来源:中科罗伯特机器人学院) 工业机器人市场在全球保持了多年的快速增长,在2018年全球机器人销量出现了大幅减缓,中国市场的销量也有了下降。在工业机器人使用最为广泛的汽车和3C行业里,在过去的这一年表现欠佳,这也导致了我国的工业机器人销量下降的原因。 我国机器人市场一直都是以外资品牌为主,国产工业机器人在精度、寿命和可靠性方...
自科创板去年开市以来,可以说为国内半导体产业发展的腾飞插上了新的“翅膀”。据相关统计,科创板运行将近一年半的时间,到10月底为止,总共有400多家企业完成了申报,已经上市190多家企业,总市值达到三万多亿元,而半导体企业不仅市场表现有目共睹,也为科创板的“硬科技”含量添加了浓墨重彩。在科创板上市的半导体企业中,目前已涉及材料、设备、大硅...
电机是目前世界上最大的电力消耗者,并且占比非常大。荷兰能源研究中心(ECN)估计,全球发电量的45%是由电机消耗的。因此,为了推动效率的提高,各国正通过立法手段来提高电机的效率标准。2021年7月,欧盟开始实施“电机和变速驱动装置条例(EU) 2019/1781”,对之前被排除在标准之外的一些电机增加了最低效率限值,并缩短了为其他类型电机符合效率要求...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved