当前位置:首页 > 单片机 > 单片机
[导读]显示自定义字符  步骤如下:    1. 先将自定义字符写入CGRAM ; 2. 再将CGRAM中的自定义字符送到DDRAM中显示  很简单的:看好了  查看LCD1602 的CGROM 字符代码表,可以发现 从00000000B~00000111B(00H~

显示自定义字符

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

  首先我们要把所要编写的字符对应于5X8点阵的“字模”提取出来,我们可以通过相关的软件来提取,也可以手工提取。说白了也就是将点阵的某一行中有显示的点用1表示,无显示的点用0表示,以此形成该行对应的字模数据。
设定CGRAM的内容,要一行一行的设定,每一行对应一个CGRAM,5X8点阵,每行5点,共8行,因此要将8行的字模数据都写入CGRAM。写好后,就可像调
用CGROM字符一样来来调用它了。
定义一行的内容,分两步:
1. 设定行地址(CGRAM地址):
用到的命令如下:
          RS R/W DB7 DB6DB5 DB4 DB3DB2 DB1 DB0
           0 0 0 1 DATA
其中:DB5,DB4,DB3为字符号,也就是你将来要显示该字符时要用到的字符地址。
DB2,DB1,DB0为行号。
2. 设定CGRAM数据(内容)指令码如下:
          RS R/WDB7 DB6 DB5DB4 DB3 DB2 DB1 DB0
          1 0 DATA
其中:DB4,DB3,DB2,DB1,DB0对应于每行5点的字模数据。
DB7,DB6,DB5可为任何数据,一般取“000”。

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

30 {

31 for(j=0;j<10;j++);

32 }

33 }

34

35 //---------------------------------------

36 //名称: 1602忙检测函数

37 //-----------------------------------------

38 void lcd_wait_busy(void)

39 {

40 TRISD7=1; //为读状态做准备

41 RSPIN=0; //选择指令寄存器

42 RWPIN=1; //选择读

43 EPIN=1; //使能线电平变化

44 while(RD7==1); //读忙状态,不忙时退出

45 EPIN=0; //恢复使能线电平

46 TRISD7=0;

47 }

48 //---------------------------------------

49 //名称: 1602写命令函数

50 //-----------------------------------------

51 void lcd_write_com(unsigned char combuf)

52 {

53 RSPIN=0; //选择指令寄存器

54 RWPIN=0; //选择写

55 PORTD=combuf; //把命令字送入RD

56 EPIN=1; //使能线电平变化,命令送入1602的8位数据口

57 asm("NOP");

58 EPIN=0; //恢复使能线电平

59 }

60 //---------------------------------------

61 //名称: 1602写命令函数(带忙检测)

62 //-----------------------------------------

63 void lcd_write_com_busy(unsigned char combuf)

64 {

65 lcd_wait_busy(); //调用忙检测函数

66 lcd_write_com(combuf); //调用写命令函数

67 }

68 //---------------------------------------

69 //名称: 1602写数据函数(带忙检测)

70 //-----------------------------------------

71 void lcd_write_data(unsigned char databuf)

72 {

73 lcd_wait_busy(); //调用忙检测函数

74 RSPIN=1; //选择数据寄存器

75 RWPIN=0; //选择写

76 PORTD=databuf; //把数据字送入P2

77 EPIN=1; //使能线电平变化,命令送入1602的8位数据口

78 asm("NOP");

79 EPIN=0; //恢复使能线电平

80 }

81 //---------------------------------------

82 //名称: 1602显示地址写函数

83 //-----------------------------------------

84 void lcd_write_address(unsigned char x,unsigned char y)

85 {

86 x&=0x0f; //列地址限制在0-15

87 y&=0x01; //行地址限制在0-1

88 if(y==0x00)

89 lcd_write_com_busy(x|0x80); //第一行的列地址写入

90 else

91 lcd_write_com_busy((x+0x40)|0x80); //第二行的列地址写入

92 }

93 //---------------------------------------

94 //名称: 1602初始化函数

95 //-----------------------------------------

96 void lcdreset(void)

97 {

98 lcd_write_com_busy(0x38); //8位数据,双列,5*7字形

99 lcd_write_com_busy(0x08); //显示功能关,无光标

100 lcd_write_com_busy(0x01); //清屏指令

101 lcd_write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动

102 lcd_write_com_busy(0x0c); //显示功能开,无光标,

103 }

104 //---------------------------------------

105 //名称: 指定地址写入函数

106 //-----------------------------------------

107 void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf)

108 {

109 lcd_write_address(x,y);

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

May 20, 2024 ---- 据TrendForce集邦咨询研究,三大原厂开始提高先进制程的投片,继存储器合约价翻扬后,公司资金投入开始增加,产能提升将集中在今年下半年,预期1alpha nm(含)以上投片至年底将...

关键字: 晶圆 HBM 存储器

为增进大家对电缆的认识,本文将对电缆老化的原因、电缆常见的故障予以介绍。

关键字: 电缆 指数 变压器

为增进大家对电缆的认识,本文将对电缆的安全要求、电缆的保护措施、电缆的存方法方法等内容予以介绍。

关键字: 电缆 指数 电线

为增进大家对电缆的认识,本文将对电缆的一些工艺特性予以介绍。

关键字: 电缆 指数 电线电缆

为增进大家对减速机的认识,本文将对谐波减速机、行星减速机以及谐波减速机和行星减速机的区别予以介绍。

关键字: 减速机 指数 谐波减速机 行星减速机

为增进大家对减速机的认识,本文将对减速机的安装方法予以介绍。

关键字: 减速机 指数 电机

为增进大家对减速机的认识,本文将对减速机漏油的原因、治理减速机漏油的对策予以介绍。

关键字: 减速机 指数 齿轮

为增进大家对电机的认识,本文将对有刷电机的优点、无刷电机的优点以及二者的区别予以介绍。

关键字: 电机 指数 有刷电机 无刷电机

为增进大家对电机的认识,本文将对变频电机和工频电机的区别予以介绍。

关键字: 变频电机 指数 工频电机

为增进大家对电机的认识,本文将对感应电机和串激电机的优缺点、感应电机和串激电机的区别予以介绍。

关键字: 电机 指数 感应电机 串激电机
关闭
关闭