博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PIC18F452之1602自定义字符
阅读量:6349 次
发布时间:2019-06-22

本文共 3346 字,大约阅读时间需要 11 分钟。

 

显示自定义字符

  步骤如下:

    1. 先将自定义字符写入CGRAM ; 2. 再将CGRAM中的自定义字符送到DDRAM中显示
  很简单的:看好了
  查看LCD1602 的CGROM 字符代码表,可以发现 从00000000B~00000111B00H~07H)地址的内容是没有定义的,它是留给用户自己定义的,用户可以通过先定义LCD1602的CGRAM中的内容,然后就可以同调用CGROM字符一样来调用自定义好的字符(这里提示一下,自定义的字符最多可写8个),那么如何设定CGRAM中的内容呢?

  首先我们要把所要编写的字符对应于5X8点阵的“字模”提取出来,我们可以通过相关的软件来提取,也可以手工提取。说白了也就是将点阵的某一行中有显示的点用1表示,无显示的点用0表示,以此形成该行对应的字模数据。 

    设定CGRAM的内容,要一行一行的设定,每一行对应一个CGRAM,5X8点阵每行5点,共8行,因此要将8行的字模数据都写入CGRAM。写好后,就可像调
用CGROM字符一样来来调用它了。
    定义一行的内容,分两步: 
     1. 设定行地址(CGRAM地址): 
        用到的命令如下: 
          RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
           0   0   0      1       DATA 
其中:DB5,DB4,DB3为字符号,也就是你将来要显示该字符时要用到的字符地址
        DB2,DB1,DB0为行号
      2. 设定CGRAM数据(内容)指令码如下: 
          RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
          1     0                    DATA
其中:DB4,DB3,DB2,DB1,DB0对应于每行5点的字模数据
         DB7,DB6,DB5可为任何数据,一般取“000”。

 

View Code
1 #include 
//调用头文件,可以去PICC18软件下去查找PIC18FXX2.H 2 __CONFIG(1,XT) ; //晶振为外部4M 3 __CONFIG(2,WDTDIS) ; //看门狗关闭 4 __CONFIG(4,LVPDIS) ; //禁止低电压编程 5 6 #define RSPIN RB5 //Data or Instrument Select 7 #define RWPIN RB4 //Write or Read 8 #define EPIN RB3 //6800 mode Enable single 9 unsigned char table[]="LCD check ok"; //要显示的内容1放入数组tablel 10 11 //此函数定义八个字符分别写入CGRAM的八个地址 12 unsigned char pic[]={ 13 0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 14 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 15 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 16 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E, 17 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00, 18 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01, 19 0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00, 20 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00 21 22 }; 23 ///--------------------------------------- 24 //名称: 延时函数 25 //----------------------------------------- 26 void delay(unsigned int t) 27 { 28 unsigned int i,j; 29 for(i=0;i

 

使用4线数据传输

画完自定义字符这是第三步,在液晶屏刷新率不高的情况下,我们可以用1602的另一种4线数据传输可减少io口的使用数量。希望大家喜欢,由于没有找到相关资料这里只将程序贴出来给大家参考参考
#include<reg52.h>
#include<intrins.h>
sbit lcd1602_rs=P0^7;
sbit lcd1602_rw=P0^6;
sbit lcd1602_e=P0^5;
/*#define lcd1602_io_writ lcd1602_rw=0;
#define lcd1602_io_read lcd1602_rw=1;

 #define lcd1602_io_com lcd1602_rs=0;

#define lcd1602_io_dat lcd1602_rs=1;
#define lcd1602_io_able lcd1602_e=0;
#define lcd1602_io_unable lcd1602_e=1;
*/
sbit lcd1602_dat1=P0^0;
sbit lcd1602_dat2=P0^1;
sbit lcd1602_dat3=P0^2;
sbit lcd1602_dat4=P0^3;
//unsigned char code table[]="ball hahhahhaha";
//unsigned char code table1[]="THE BEST!";
void delay(unsigned int z)
{
  unsigned int a,b;
  for(a=z;a>0;a--)
    for(b=114;b>0;b--);
}
void lcd1602_write(bit cd,unsigned char dat)//cd=0,指令;c
{
  int i;
  unsigned char j;
  lcd1602_rs=cd;
  for(j=0;j<2;j++)
  {
  lcd1602_e=1;
  for(i=0;i<200;i++)
    _nop_();
  lcd1602_dat4=dat&0x80;
  lcd1602_dat3=(dat<<1)&0x80;
  lcd1602_dat2=(dat<<2)&0x80;
  lcd1602_dat1=(dat<<3)&0x80;
  lcd1602_e=0;
  //lcd1602_e=1;
    dat<<=4;
 
  }
}
 
/*unsigned char lcd1602_read_dat(unsigned char add)
{
  unsigned char dat;
return dat;
}*/
void main()
{
lcd1602_rw=0;
lcd1602_e=0;
lcd1602_write(0,0x28);
lcd1602_write(0,0x0f);
lcd1602_write(0,0x06);
lcd1602_write(0,0x01);
lcd1602_write(0,0x80);
lcd1602_write(1,'q');
while(1);
}

 

转载于:https://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/07/13/2590841.html

你可能感兴趣的文章
迁移至个人blog
查看>>
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
查看>>
雨巷-戴望舒
查看>>
OpenCms创建网站过程图解——献给OpenCms的初学者们
查看>>
C++ 异常处理机制的实现
查看>>
Freebsd的ports命令
查看>>
分布式系统---幂等性设计
查看>>
【转】时钟周期,机器周期,指令周期的区别
查看>>
MYSQL 更新时间自己主动同步与创建时间默认值共存问题
查看>>
android 屏幕适配
查看>>
Android Activity的4种启动模式
查看>>
leetcode第一刷_Minimum Depth of Binary Tree
查看>>
pm2-webshell —— 基于浏览器的终端控制台
查看>>
Mysql基准测试
查看>>
Session 撰改演示
查看>>
【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)
查看>>
事务隔离级别(图文详解)
查看>>
canvas系列教程08-canvas各种坑
查看>>
浅析package.json中的devdependencies 和 dependencies
查看>>
又一个 iOS 侧边栏组件: SideMenu
查看>>