社区导航

 

搜索
查看: 11013|回复: 31

[讨论] 1602的学习总结(菜鸟入门级)

[复制链接]

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2009-10-12 10:01 | 显示全部楼层 |阅读模式
先来叙述一些概念。

LCMLCD的区别

LCMLiquid Crystal Module】液晶显示模块,通常包括显示驱动电路,接口电路等等。往往做成一个整体模块的形式,包括LCD液晶屏,屏的框架,线路板,驱动IC,控制IC等一系列,一般还有背光电路,其中IC的封装形式有硬封装和软封装的。顺便介绍下这两种封装形式,现在一般的电路板上可看到的,引脚是焊接的,都是硬封装芯片,而那种在电路板上黑色的一个疙瘩,传说中也称作牛屎芯片的,便是软封装的片子了,(咱80后幼时都很爱玩的FC,所用卡带的电路板上就有这种软封装的芯片,不知喜爱电子的你有拆开研究过吗?呵呵)其实术语是COB邦定【Chip On Board】,通过邦定将IC裸片固定到PCB上,邦定是英文”bonding”的音译,是芯片生产工艺中一种打线方式,在封装前,将芯片内部电路用金线与封装管脚连接,之后,用黑色胶体将芯片封装。

LCDLiquid Crystal Display】液晶显示器,是在两片平行的玻璃中放置液态的晶体,其中有很多水平和垂直放置的细小电线,它们的是否通电控制晶体分子的运动方向,将光线折射出来,产生画面。

好的,再回来,前段时间在
http://item.taobao.com/auction/item_detail-0db2-a978dfe0fe1f268f26085c77f4b3d4bc.htm
(店铺名为:广东yleee电子 bbs.yleee.net )买到16022402,感觉性价比很不错,后者酷酷的,不知什么原因已经下架了,有点可惜。

图片非本人原创,均出自广东yleee电子的淘宝店铺。


20090624_a24d445635431033b4415tszujOUMWdT_jpg_thumb.jpg


20090624_ac6b0df8b76bed9b972fVt5eqReG1J9S_jpg_thumb.jpg


20090624_a8d065ef83b0481d86d3TYFmioclGgmd_jpg_thumb.jpg




此款LCM1602的引脚功能表见下表


Pin Assignment

No.

Symbol.

Function.

No.

Symbol.

Function.

1

VSS

GND, 0V

10

DB3

Data Bus Line

2

VDD

+4V ~ 6V

11

DB4

Data Bus Line

3

VEE

For LCD Drive

12

DB5

Data Bus Line

4

RS

Function Select

13

DB6

Data Bus Line

5

R/W

Read/Write

14

DB7

Data Bus Line

6

E

Enable Signal

15

LED K(-)

LED Supply

7-9

DB0-DB2

Data Bus Line

16

LED A(+)

LED Supply


需要注意的是,一般的LCM160215脚是背光LED的正极,16脚背光LED的负极,而此款1602刚好相反。


来源:EEWorld 单片机板块,转载请附上链接


485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-12 10:10 | 显示全部楼层
绝大部分的字符型液晶模块都是基于HD44780芯片的,有的也标注控制芯片与HD44780兼容,控制原理都是相同的。HD44780内置了DDRAMData Display Random Access Memory】,CGRAMCharacter Generation Random Access Memory】,CGROMCharacter Generation Read Only Memory】。

下面先介绍1602的指令集,再叙述以上的三个家伙。

特别温馨小贴士:刚开始看这些指令时,头会大,心想,说的都是什么啊,蒙蒙的感觉,所以提醒大家,可以参考学语文时的方法,呵呵,别着急,先略读一遍,即先通读,做到稍微熟悉,然后在读程序的同时,再返回到指令集这里,精读之,便可充分理解了。




1602指令表.JPG




1.   清屏

清除屏幕上全部内容,光标回到屏的左上方,地址计数器【Address Counter】清零。

2.  光标返回

光标回到屏的左上方,地址计数器【Address Counter】清零,DDRAM的内容保持不变。

3输入模式

设定每次显示一个字符后,光标的移动方向,以及整体内容的移动方向。I/D0时,表示写入新字符后,光标左移,1时,光标右移。

4.   显示开/关控制

控制显示器是否显示,光标是否显示,光标是否闪烁。D0时,关闭显示,为1时,开启显示。C0时,无光标,为1时,有光标。B0时,光标不闪烁,为1时,光标闪烁。

5.   光标或字符移位

使光标移位或使整个显示屏幕移位。S/CR/L的值的组合控制功能选择。

S/C              R/L                                    
功能
  0                  0                     光标左移1格,且AC值减1
  0                  1                     光标右移1格,且AC值加1
  1                  0            显示器上字符全部左移一格,但光标不动
  1                  1            显示器上字符全部右移一格,但光标不动

6.  置功能

设定数据总线位数、显示的行数及字型。DL0时,数据总线为4位,为1时,数据总线为8位。N0时,显示一行,为1时,显示两行。F0时,5×7点阵/每字符,为1时,5×10点阵/每字符。

7.  置字符发生存贮器(CGRAM)地址

8.  置数据存贮器(DDRAM)地址

9.   读忙标志或地址

10.  写数据到DDRAMCGRAM

11.  DDRAMCGRAM读数据


注意第七条名为“置字符发生存贮器地址”的指令,它的D6位为“1“。

注意第八条名为“置数据存贮器地址”的指令,它的D7位为“1“。

后面的叙述中要用到这两个重要的东东!!

[ 本帖最后由 springvirus 于 2009-10-12 11:04 编辑 ]


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-12 10:11 | 显示全部楼层
DDRAM,中文可称之为显示缓存,存储待显示字符的ASCII码,共80字节。显示屏与之对应的关系为第一行的四十列的地址为00H27H,第二行的四十列的地址为40H67H,在1602中,每一行只用到前16个地址,即第一行为00H0FH,第二行为40H4FH。此时需特别注意,第八条名为“置数据存贮器地址”的指令,它的D7位为“1,即在置显示地址时,D7位始终为1,故在程序中置第一行第一列的显示地址时,应该为0000 0000B(00H)1000 0000B(80H)1000 0000B(80H),同理依此类推,1602的各显示单元区域的显示地址为

0X80   0X81   0X82 …………  0X8F

0XC0  0XC1  0XC2  ………… 0XCF

下面来看CGROM,可以这样理解它,就是在模块中固化了的存贮器,其中有已经定义好的字符,它们都有对应的ASCII码,好,看下面的表格,表格的题目有些罗嗦,还是直接看内容吧,呵呵




CGRAM字符码表.JPG


4位和低4位组成各字符对应的8位码,如果我们想在1602的第一行第一列显示数字1,可以这样进行:先把显示地址0X80写入,再写入字符1对应的代码00110001,就欧了!!虽然原理简单,关键看程序是如何实现的。所以要彻头彻尾地读程序!!

最后来看CGRAM,这个东东,它就不是预先定义好了的,而是我们用户根据自己的需要,定义我们想要显示的字符,而字符对应的代码(00H0FH)已经给我们预留好了,仔细看上面表格的最左侧一列,一共是16个代码,实际只有8个(00H07H)可用,(顺便说下,1602的显示单元为5×7点阵时,可定义8组,为5×10点阵时,可定义4组)那么如何向这8个单元写入我们想要定义的字符呢? 这就用到了第七条名为“置字符发生存贮器地址”的指令,注意它的D6位为“1“,所以第一个自定义字符的CGRAM地址为0X400X47,第二个自定义字符的CGRAM地址为0X480X4F,类推到第八个自定义字符的CGRAM地址为0X780X7F

小结:显示单元为5×7点阵时,可自定义8个字符,字符的对应码为0X000X07,每个字符的CGRAM地址为8个字节,所以在程序中设置自定义字符的CGRAM地址时,就要注意了。

HD44780相兼容芯片时序如下:注意,写数据函数和写指令函数中对这个时序有所体现。

读状态    输入为   RS=0  R/W=1   E=1    输出为   D0D7为状态字

写指令    输入为   RS=0  R/W=0   E为高脉冲(上升沿)  D0D7为指令码   输出

读数据    输入为   RS=1  R/W=1   E=1    输出为   D0D7为数据
写数据    输入为   RS-1   R/W=0   E为高脉冲(上升沿    D0D7为指令码   输出

这个时序表在写指令函数和写数据函数中就有体现了!!


[ 本帖最后由 springvirus 于 2009-10-12 11:04 编辑 ]


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-12 10:14 | 显示全部楼层
好,上个程序,可以让这8个自定义字符显示出一个心的图案:
本程序出自http://hi.baidu.com/txz01,非本人原创,其中注释为本人所加。


/ * 心形图案分成8个部分显示 * /


#include
unsigned char table1 [] =(

0x03,为0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,

/ /心的左上角部分,字符对应码(表格中)为0X00
0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

/ /心的中上左部分,字符对应码(表格中)为0X01
为0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

/ /心的中上右部分,字符对应码(表格中)为0X02
0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,

/ /心的右上角部分,字符对应码(表格中)为0X03
0x0f,为0x07,0x03,0x01,0x00,0x00,0x00,0x00,

/ /心的左下角部分,字符对应码(表格中)为0X04
0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,为0x07,0x01,

/ /心的中下左部分,字符对应码(表格中)为0X05
0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,

/ /心的中下右部分,字符对应码(表格中)为0X06
0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00

/ /心的右下角部分,字符对应码(表格中)为0X07

)/ /心形图案


#include CLEARSCREEN LCD_write_command(0x01)

/ /清显示,返回到指令集表格,复习第一条清显示指令。


/**************定义接口************************/

#define     LCDIO      P2
sbit LCD1602_RS=P3^0;
sbit LCD1602_RW=P3^1;   
sbit LCD1602_EN=P3^2; / /
返回到1602的引脚功能表,复习各引脚功能

/**************定义函数************************/
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//
写入数据函数
void LCD_set_xy( unsigned char x, unsigned char y );//
设置显示位置函数
void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);//
显示一个字符函数
void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);//
显示字符串函数
void LCD_init(void);//
初始化函数
void delay_nms(unsigned int n);//
延时函数

/********************************************/

/************初始化函数****************/
void LCD_init(void)
{
CLEARSCREEN; / /
清屏
LCD_write_command(0x38); / /
第六条,置功能指令,此值设置为8位数据总线,显示2行,5×7点阵字符

LCD_write_command(0x0c); / /第四条,显示开关控制指令,此值设置为开显示,无光标,光标不闪烁

LCD_write_command(0x80); / /第八条,设置数据存储器起始显示地址,此值设置为从第一行第一列开始显示

CLEARSCREEN; / /清屏

}







[ 本帖最后由 springvirus 于 2009-10-12 11:09 编辑 ]


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-12 10:14 | 显示全部楼层
/****************************************************/
/**************写指令函数********************************/
void LCD_write_command(unsigned char command)
{
      LCDIO=command; //
返回看,与HD44780相兼容芯片的时序
      LCD1602_RS=0;
      LCD1602_RW=0;
      LCD1602_EN=0;
     LCD1602_EN=1;
      delay_nms(10);
}
/***************************************************/
/****************写数据函数************************/
void LCD_write_dat(unsigned char dat)
{
LCDIO=dat;
//
返回看,与HD44780相兼容芯片的时序
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_EN=0;
delay_nms(1);
LCD1602_EN=1;
}
/****************************************************/
/***************设置显示位置**************************/
void LCD_set_xy( unsigned char x, unsigned char y ) //x
的值表示列,y的值表


示行
{
unsigned char address;
if (y == 1)
// x
的值决定在第一行的哪一列
     address = 0x80 + x; //
返回复习1602的各显示单元区域的显示地址
else
//x
的值决定在第二行的哪一列
        address =0xc0+ x; //
返回复习1602的各显示单元区域的显示地址
LCD_write_command(address);
//
写指令函数通过总线写入指令
}
/***************************************************/
/****************显示一个字符**********************/
void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );

//
设置显示位置
LCD_write_dat(dat);
//
写数据函数通过总线写入数据
}


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-12 10:15 | 显示全部楼层
/**********************************************/

/***************显示字符串函数***************/
void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)
{
       LCD_set_xy( X, Y );
       while (*s)  
       {
         LCD_write_dat(*s);   
         s ++;
       }
}
/***********************************************/

/********** 延时**********************/
void delay_nms(unsigned int n)      
{
       unsigned int i=0,j=0;
       for (i=n;i>0;i--)
       for (j=0;j<10;j++);  
}
/**************************************/

/***********主函数**************/
void main(void)
{
unsigned char i,j,k,tmp;
LCD_init();
delay_nms(100);
tmp=0x40;
//
设置CGRAM初始地址值,为什么是0x40,呵呵,请返回复 CGRAM的地址

k=0;
for(j=0;j<8;j++)
// j
07循环8次后,tmp的值从0x400x7Ftable1[k]

中的64个数据写入到了这64个地址单元中
     {
        for(i=0;i<8;i++)
         {
           LCD_write_command(tmp+i); //
设置自定义字符的 CGRAM 地址  
           delay_nms(2);
           LCD_write_dat(table1[k]); //
CGRAM写入自定义字符表的数据
           k++;
           delay_nms(2);
         }
        tmp=tmp+8;
      }
     LCD_dsp_string(1,1,"LCD TEST        ");//
在第一行第一列显示“LCD TEST”
     LCD_dsp_string(1,2,"SUCCESSFUL      ");//
在第二行第一列显示 “SUCCESSFUL”

     for (i=0;i<4;i++)
       {
         LCD_dsp_char( 12+i,1,i); //
从第一行第12列位置起显示心图案的上半部,这里的i可看成是自定义字符的代码00H03H
         delay_nms(1);


}
     for (i=4;i<8;i++)
       {
         LCD_dsp_char( 12+i-4,2,i); //
从第二行第12列位置起显示心图案的下半部,这里的i可看成是自定义字符的代码04H07H
         delay_nms(1);
       }
     while (1);
}
/********************************************************************/


[ 本帖最后由 springvirus 于 2009-10-12 10:29 编辑 ]


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-12 10:31 | 显示全部楼层
呵呵,只是我学习的总结,本人菜鸟一个,想与众菜鸟分享下,还请多多指教!!


回复

使用道具 举报

49

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2009-10-13 21:36 | 显示全部楼层
写的很好啊!


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-14 07:52 | 显示全部楼层
谢谢了!有什么不足之处,还请大家指正啊


回复

使用道具 举报

11

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-10-15 15:05 | 显示全部楼层
学习了,谢谢


回复

使用道具 举报

11

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-10-15 15:06 | 显示全部楼层
学习了,谢谢


回复

使用道具 举报

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

发表于 2009-10-15 17:02 | 显示全部楼层
写的真好,跟着楼主学到了很多

楼主能不能在写一下12864等液晶的学习总结呢


回复

使用道具 举报

17

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-10-15 22:09 | 显示全部楼层
有没得VHDL语言控制1602的程序啊?我写的老是不显,不晓得什么原因,,
另外傻傻的问下,控制字写入的时间间隔小了不行,大了可以不啊!?


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-16 07:54 | 显示全部楼层

回复 12楼 tiankai001 的帖子

我也是刚接触液晶显示这块的内容,折腾完1602后,就准备进军12864了,咱们相互学习啊,呵呵

我正在学AVR,到时若有问题,还得多多请教您!!

[ 本帖最后由 springvirus 于 2009-10-16 09:34 编辑 ]


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-16 08:01 | 显示全部楼层

回复 13楼 aboutnow 的帖子

呵呵,我也是初学者,所以水平有限啊,抱歉,没学过VHDL语言
另外实践过后的结果最具有说服力了,可以试一下不同的控制字写入的时间间隔了……


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-10-16 08:09 | 显示全部楼层
楼主学习精神可嘉,分享精神可贵!


回复

使用道具 举报

485

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

 楼主| 发表于 2009-10-16 08:11 | 显示全部楼层

回复 16楼 c.xiyan 的帖子

过奖了! 咱们同学习,共进步!!


回复

使用道具 举报

36

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2009-10-16 18:59 | 显示全部楼层
呵呵, 真的不错!


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-10-16 20:02 | 显示全部楼层
又长学问了,不断向先知们学习。


回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-10-17 21:14 | 显示全部楼层


回复

使用道具 举报

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

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-19 20:50 , Processed in 0.529638 second(s), 19 queries , Gzip On, MemCache On.

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