LCD1602按照5x7点阵显示字符,可显示一些简单的汉字

!本博客是 《LCD1602自定义点阵字符》的学习笔记以及补(chao)充(xie)

LCD1602能存8个自定义字符, 首地址分别为0X40,0X48,0X50,0X58,0X60,0X68,0X70,0X78;

也就是说0x40到0x7F都是用来存自定义字符的

每个字符都是5x7的点阵,以0x40为例
在这里插入图片描述

每个地址为一行(按字节寻址),但是每一行只有第五位有效,行也是前五行有效 行也是前七行有效

存储和显示都是两步实现
一步write_command()确定地址
第二步write_data()确定操作数

write_command()和write_data()都是lcd1602经常写的函数,详见后面代码

要存储自定义字符需要两步

  1. 向lcd1602发送命令,定位行
  2. 写入每行对应的数据

比如将十储存到首地址为0x40

write_command(0x40); // line1
write_data(0x04);
write_command(0x41); // line2
write_data(0x04);
write_command(0x42); // line3
write_data(0x3F);
write_command(0x43); // line4
write_data(0x04);
write_command(0x44); // line5
write_data(0x04);
write_command(0x45); // line6
write_data(0x04);
write_command(0x46); // line7
write_data(0x04);

在这里插入图片描述

显示自定义字符也是这个步骤

  1. write_command(0x80+[0x40第二行]+第几个字符);
  2. write_data(第几个自定义字符,也可以看ascii码表,前八个是自定义字符);

在这里插入图片描述
显示非自定义字符和自定义字符步骤一样

可以取模软件将自定义字符存到一个数组里面,然后两个函数用于修改和显示自定义字符

// custom_code is between on 0 and 7
void ch_custom_char(uchar *char_lattice, uchar custom_code)
{
  int i;
  for(i=0;i<8;i++)
  {
    write_command(0x40+custom_code*8+i); // set to the i-th line
    write_data(char_lattice[i]); // write a line bit
  }
}
void display_custom_char(uchar n, uchar custom_code)
{
  write_command(0x80+n); // set to the n-th char
  write_data(custom_code); // display the custom_code char
}

还可以将显示字符串的函数完善一下,将自定义字符串也自动识别显示。
我就懒得实现了。
下面是一个算是完整能用的代码

/* Main.c file generated by New Project wizard
 *
 * Created:   周四 5月 27 2021
 * Processor: 80C31
 * Compiler:  Keil for 8051
 */

#include <reg51.h>
#include<intrins.h>
#define DATA_BUS  (P0) 
// Define P3 pins
sbit RS = P2^0;
sbit RW=P2^1;
sbit E=P2^2;
// Define new types
typedef unsigned char   uchar;
typedef unsigned int    uint;

// Function Prototypes
void check_busy(void);
void LCD_init(void);
void write_command(uchar com);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
void write_data(uchar _data);
void ch_custom_char(uchar *char_lattice, uchar custom_code);
void display_custom_char(uchar n, uchar custom_code);
uchar lu[] = {0x00,0x01,0x01,0x05,0x01,0x07,0x00};/*"业",2*/
uchar ye2[] = {0x00,0x30,0x34,0xB4,0x28,0xFC,0x00};/*"业",2*/

void main(void)
{
  LCD_init(); 
  while(1)
  { //string(0x80,"1900301517!");
    //string(0xC0,"  LuHongye");
    ch_custom_char(lu,1);
    display_custom_char(0,0);
	ch_custom_char(ye2,2);
    display_custom_char(1,2);

    delay(100); 
    write_command(0x01);
    delay(100);       
  }
 }

/*******************************************
    LCD1602 Driver mapped as IO peripheral
*******************************************/  
// Delay
void delay(uint j)
{ 
  uchar i = 60;
  for(; j>0; j--)
  {
    while(--i);
    i = 59;
    while(--i);
      i = 60;
  }
}

// Test the Busy bit
void check_busy(void)
{ 
  do
  {
     DATA_BUS = 0xff;
     E = 0;
     RS = 0; 
     RW = 1;
     E = 1;
     _nop_();
  } while(DATA_BUS & 0x80);
  E = 0;
 }

// Write a command
void write_command(uchar com)
{ 
  check_busy();
  E = 0;
  RS = 0;
  RW = 0;
  DATA_BUS = com;
  E = 1;
  _nop_();
  E = 0;
  delay(1);
}

// Write Data
void write_data(uchar _data)
{
  check_busy();
  E = 0;
  RS = 1;
  RW = 0;
  DATA_BUS = _data;
  E = 1;
  _nop_();
  E = 0;
  delay(1);   
}

// Initialize LCD controller
void LCD_init(void)
{
  write_command(0x38); // 8-bits, 2 lines, 7x5 dots
  write_command(0x0C); // no cursor, no blink, enable display
  write_command(0x06); // auto-increment on
  write_command(0x01); // clear screen
  delay(1);
}

// Display a string
void string(uchar ad, uchar *s)
{
  write_command(ad);
  while(*s>0)
  {
    write_data(*s++);
    delay(100);
  }
}
// custom_code is between on 0 and 7
void ch_custom_char(uchar *char_lattice, uchar custom_code)
{
  int i;
  for(i=0;i<8;i++)
  {
    write_command(0x40+custom_code*8+i); // set to the i-th line
    write_data(char_lattice[i]); // write a line bit
  }
}

void display_custom_char(uchar n, uchar custom_code)
{
  write_command(0x80+n); // set to the n-th char
  write_data(custom_code); // display the custom_code char
}

参考博客:《LCD1602自定义点阵字符》

2023年5月10日更新
偶尔点进来看了一边,发现好像有很多错误,做了点修改
行也是前五行有效修改为`行也是前七行有效

write_command(0x40); // line1
write_data(0x40);
write_command(0x40); // line2
write_data(0x40);
write_command(0x40); // line3
write_data(0x40);
write_command(0x40); // line4
write_data(0x40);
write_command(0x40); // line5
write_data(0x40);
write_command(0x40); // line6
write_data(0x40);
write_command(0x40); // line7
write_data(0x40);

(我复制粘贴的时候不急的改参数了吧,应该没改错吧)
修改为

write_command(0x40); // line1
write_data(0x04);
write_command(0x41); // line2
write_data(0x04);
write_command(0x42); // line3
write_data(0x3F);
write_command(0x43); // line4
write_data(0x04);
write_command(0x44); // line5
write_data(0x04);
write_command(0x45); // line6
write_data(0x04);
write_command(0x46); // line7
write_data(0x04);
  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1602汉字显示,如有需要可以下载 #include #define uchar unsigned char #define uint unsigned int sbit lcdrs=P1^0; sbit lcden=P1^2; sbit lcdwr=P1^1; uchar CGCODE[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//"年"代码 0x00 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x01 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代码 0x02 0x07,0x04,0x07,0x04,0x07,0x00,0x04,0x07,//"星"左上半部分代码 0x03 0x1F,0x01,0x1F,0x01,0x1F,0x08,0x08,0x1F,//"星"右上半部分代码 0x04 0x08,0x17,0x00,0x1F,0x00,0x00,0x00,0x00,//"星"左下半部分代码 0x05 0x08,0x1F,0x08,0x1F,0x00,0x00,0x00,0x00//"星"右下半部分代码 0x06 }; uchar tab[]={'0','8',0x00,'0','3',0x01,'0','9',0x02};//显示"08年03月09日" void delay(uint t) { uint x,y; for(x=0;x<t;x++) for(y=0;y<110;y++); } void write_com(uchar com)//向1602写指令 { lcdrs=0; P2=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar dat)//向1602写数据 { lcdrs=1; P2=dat; delay(5); lcden=1; delay(5); lcden=0; } void init()//程序初始化 { lcdwr=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void main()//主函数 { int i; init(); lcdrs=0; lcdwr=0; write_com(0x40);//将自定义字符写入CGRAM for(i=0;i<56;i++)//循环56次写入 { write_date(CGCODE[i]); } write_com(0x80);//写入初始地址 for(i=0;i<9;i++) { write_date(tab[i]); } write_com(0x80+9);//用09H和0AH显示"星"上部分 write_date(0x03); write_date(0x04); write_com(0x80+0x40+9);//用49H和4AH显示"星"上部分 write_date(0x05); write_date(0x06); while(1); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值