超强的LCD控制四位八位控制函数全集写入字库_第1页
超强的LCD控制四位八位控制函数全集写入字库_第2页
超强的LCD控制四位八位控制函数全集写入字库_第3页
超强的LCD控制四位八位控制函数全集写入字库_第4页
超强的LCD控制四位八位控制函数全集写入字库_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 风骚的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库LCD1602写字库在文档后面。LCD1602演示程序(很多函数哦)控制芯片为HD44780 函数都是经过测试的,实物显示都通过了,呵呵,请大家放心使用_呵呵,支持四线数据接口模式,可以任意切换编程,只须改模式选择Port_Type_Select就可以咯!很方便的。     并且我说一下我的个人体会,希望大家在写程序的时候,最好考虑一下程序的可移植性,而且要方便更改参数和硬件资源的选择,最好使用条件编译,任意切换硬件资源,可以方便以后更改参数,就会省去以后不少的不必要的麻烦和错

2、误以及宝贵的时间!里面有标准测试,如果您觉得好的话,请您帮忙顶一下,希望有更多的朋友能知道的更多,更好,学习得更快_一起努力加油,写出更好的功能函数。先简单介绍一下功能函数吧:/*-*/ /模式选择(条件编译)#define Port_Type_Select 1 /=1, 选择八位数据模式        /=0, 选择四位数据模式, LCD高四位接MCU端口高四位/*-*/ /函数声明void LCD_busy  (void);     

3、;        /检测LCD是否忙void LCD_init  (void);             /LCD初始化void LCD_cmd   (unsigned char cmd);          /写入指令void LCD_dat &#

4、160; (unsigned char dat);          /写入数据void LCD_pos   (unsigned char x, unsigned char y);      /显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c);  /定位输出字符void LCD_prints(unsigne

5、d char x, unsigned char y, unsigned char *s); /定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); /定位输出16位二进制数字unsigned char LCD_current_addr(void);         /读出AC当前地址(DB6DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(voi

6、d);        /读出AC当前地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y);   /读出AC指定地址的数据void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat);    /指定地址(x: 0-7)写入8bytes数据CGRAM/*-*/光标、画面移动,不影响DDRAM#define LCD_LE

7、FT_MOVE   LCD_cmd(0x18); /LCD显示左移一位#define LCD_RIGHT_MOVE   LCD_cmd(0x1c); /LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); /光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cmd(0x14); /光标右移一位/*-*/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON   

8、; LCD_cmd(0x0c); /LCD开显示#define LCD_DISPLAY_OFF   LCD_cmd(0x08); /LCD关显示#define LCD_CURSOR_ON   LCD_cmd(0x0e); /光标显示#define LCD_CURSOR_OFF   LCD_cmd(0x0c); /光标不显示#define LCD_CURSOR_BLINK_ON  LCD_cmd(0x0f); /光标闪烁#define L

9、CD_CURSOR_BLINK_OFF LCD_cmd(0x0e); /光标不闪烁#define LCD_GO_HOME    LCD_cmd(0x02); /AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR     LCD_cmd(0x01); /LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*-*/工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0

10、x38); /两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); /单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); /两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE LCD_cmd(0x20); /单行显示4-bits/*-*/输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); /数据读、

11、写操作后,AC自动加 1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); /数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLE   LCD_cmd(0x07); /数据读、写操作,画面平移#define LCD_MOVE_DISENABLE  LCD_cmd(0x06); /数据读、写操作,画面不动 以下是液晶驱动头文件:/*-*/File: LCD1602_8A.H/Time: 20:10/Modi:

12、0;09-5-17/*-*/ /防止被重复定义#ifndef _LCD1602_8A_H_   #define _LCD1602_8A_H_/*-*/ /模式选择(条件编译)#define Port_Type_Select 1 /=1, 选择八位数据模式        /=0, 选择四位数据模式, LCD高四位接MCU端口高四位#define Int_Transfer  1 /=1,   允许中断服务函数调用

13、0;       /=0, 不允许中断服务函数调用/*-*/ /LCD1602与单片机接口定义sfr  LCD_IO = 0x80;   /P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;sbit LCD_RS = P20;   /LCD数据/命令选择端(H/L)sbit LCD_RW = P21;   /LCD  读/写  选择端(H/L)sbit 

14、LCD_EN = P22;   /LCD使能控制端 /*-*/工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0x38); /两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); /单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); /两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE

15、0;LCD_cmd(0x20); /单行显示4-bits/*-*/输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); /数据读、写操作后,AC自动加 1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); /数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLE   LCD_cmd(0x07); /数据读、写操作,画面平移#define LCD_MOVE_DISENABLE  L

16、CD_cmd(0x06); /数据读、写操作,画面不动 /*-*/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON    LCD_cmd(0x0c); /LCD开显示#define LCD_DISPLAY_OFF   LCD_cmd(0x08); /LCD关显示#define LCD_CURSOR_ON   LCD_cmd(0x0e); /光标显示#define LCD_CURSOR_OFF   LCD_cmd(0

17、x0c); /光标不显示#define LCD_CURSOR_BLINK_ON  LCD_cmd(0x0f); /光标闪烁#define LCD_CURSOR_BLINK_OFF LCD_cmd(0x0e); /光标不闪烁#define LCD_GO_HOME    LCD_cmd(0x02); /AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR     LCD_cmd(0x01); /LC

18、D清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位? /*-*/光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE   LCD_cmd(0x18); /LCD显示左移一位#define LCD_RIGHT_MOVE   LCD_cmd(0x1c); /LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); /光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cm

19、d(0x14); /光标右移一位 /*-*/LCD1602地址相关/*#define LINE1_HEAD  0x80  /第一行DDRAM起始地址#define LINE2_HEAD  0xc0  /第二行DDRAM起始地址#define LINE1   0   /第一行#define LINE2   1   /第二行#define LINE_LENGTH 

20、0;16   /每行的最大字符长度(40-DDRAM) /*-*/ /函数声明void LCD_busy  (void);             /检测LCD是否忙void LCD_init  (void);             /LCD初始化void LCD_cmd

21、60;  (unsigned char cmd);          /写入指令void LCD_dat   (unsigned char dat);          /写入数据void LCD_pos   (unsigned char x, unsigned char y);      

22、;/显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c);  /定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); /定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); /定位输出16位二进制数字unsigned char LCD_current_addr(void);&#

23、160;        /读出AC当前地址(DB6DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void);        /读出AC当前地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y);   /读出AC指定地址的数据void LCD_pos_CG(unsigned char x

24、, unsigned char *CGRAM_dat);    /指定地址(x: 0-7)写入8bytes数据CGRAM/*-*/ /读出AC当前地址(DB6DB0)或忙标志位DB7#if Port_Type_Select /选择八位数据模式unsigned char LCD_current_addr(void) unsigned char ac_addr; LCD_EN = 0; LCD_RS = 0;   /指令 LCD_RW = 1;   

25、/读出 LCD_IO = 0xff;  /端口置为输入方式(P0) LCD_EN = 1; ac_addr = LCD_IO; LCD_EN = 0; return (ac_addr);#else     /选择四位数据模式unsigned char LCD_current_addr(void) unsigned char ac_addr; LCD_EN = 0; LCD_RS = 0;     

26、/指令 LCD_RW = 1;     /读出 LCD_IO |= 0xf0;    /端口置为输入方式(P0) LCD_EN = 1; ac_addr = LCD_IO & 0xf0; /高四位 LCD_EN = 0; LCD_EN = 1; ac_addr |= LCD_IO >> 4;  /低四位 LCD_EN = 0; return (ac_addr);#en

27、dif/*-*/ /检测LCD忙状态#if Int_Transfer   /允许中断服务函数调用  void LCD_busy(void) unsigned char ac_dat; unsigned char busy_flag; do   ac_dat = LCD_current_addr();  busy_flag = ac_dat & 0x80; while(busy_flag);  /=1表示忙, =0表示空闲#els

28、e      /不允许中断服务函数调用void LCD_busy(void) unsigned char ac_dat; bit busy_flag; do   ac_dat = LCD_current_addr();  busy_flag = (bit)(ac_dat & 0x80); while(busy_flag);  /=1表示忙, =0表示空闲#endif/*-*/ /读出AC当前地址的数据#if Port_

29、Type_Select  /选择八位数据模式unsigned char LCD_current_addr_dat(void) unsigned char addr_dat;/ unsigned char i; LCD_busy();    /或者检查忙最可靠/ for(i = 0; i < 3; i+) /要连续读出三次才会有效   LCD_EN = 0;  LCD_RS = 1;   /数据

30、0; LCD_RW = 1;   /读出  LCD_IO = 0xff;  /端口置为输入方式(P0)  LCD_EN = 1;  addr_dat = LCD_IO;  LCD_EN = 0;  return (addr_dat);#else      /选择四位数据模式unsigned char LCD_current_addr_dat(void) unsigne

31、d char addr_dat;/ unsigned char i; LCD_busy();      /或者检查忙最可靠/ for(i = 0; i < 3; i+)   /要连续读出三次才会有效   LCD_EN = 0;  LCD_RS = 1;     /数据  LCD_RW = 1;     

32、/读出  LCD_IO |= 0xf0;    /端口置为输入方式(P0)  LCD_EN = 1;  addr_dat = LCD_IO & 0xf0; /高四位  LCD_EN = 0;  LCD_EN = 1;  addr_dat |= LCD_IO >> 4; /低四位  LCD_EN = 0;  return (addr_dat);#endif/*

33、-*/ /写入指令#if Port_Type_Select  /选择八位数据模式void LCD_cmd(unsigned char cmd) LCD_busy();    /检测忙 LCD_RS = 0;    /指令 LCD_RW = 0;    /写入 LCD_EN = 1; LCD_IO = cmd;   /传指令 LCD_EN = 0;  

34、;  /下降沿有效#else      /选择四位数据模式void LCD_cmd(unsigned char cmd) LCD_busy();    /检测忙 LCD_IO &= 0x0f;   /清高四位 LCD_RS = 0;    /指令 LCD_RW = 0;    /写入 LCD_EN = 1;&#

35、160;LCD_IO |= cmd & 0xf0; /写高四位 LCD_EN = 0;    /下降沿有效 cmd <<= 4;    /低四位移到高四位 LCD_IO &= 0x0f;   /清高四位 LCD_EN = 1; LCD_IO |= cmd & 0xf0; /写高四位 LCD_EN = 0;    /下降沿有效#end

36、if/*-*/ /写入数据#if Port_Type_Select  /选择八位数据模式void LCD_dat(unsigned char dat) LCD_busy();    /检测忙 LCD_RS = 1;    /数据 LCD_RW = 0;    /写入 LCD_EN = 1; LCD_IO = dat;   /传数据 LCD_EN = 0; &

37、#160;  /下降沿有效#else      /选择四位数据模式void LCD_dat(unsigned char dat) LCD_busy();    /检测忙 LCD_IO &= 0x0f;   /清高四位 LCD_RS = 1;    /数据 LCD_RW = 0;    /写入 LCD_EN =

38、1; LCD_IO |= dat & 0xf0; /写高四位 LCD_EN = 0;    /下降沿有效 dat <<= 4;    /低四位移到高四位 LCD_IO &= 0x0f;   /清高四位 LCD_EN = 1; LCD_IO |= dat & 0xf0; /写高四位 LCD_EN = 0;    /下降沿有效

39、#endif/*-*/ /显示定位DDRAMvoid LCD_pos(unsigned char x, unsigned char y) if(y) LCD_cmd(x|0xc0);/y=1第二行显示,y=0第一行显示 0<=x<16(40-DDRAM) else LCD_cmd(x|0x80);/数据指针=80+地址码(00H27H,40H67H)/*-*/ /指定地址(x: 0-7)写入8bytes数据CGRAMvoid LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat)&

40、#160;unsigned char i;   x <<= 3;    /转化为6位数据的高三位 x |=  0x40; LCD_cmd(x);    /写入地址 for(i = 0; i < 8; i+)  LCD_dat(CGRAM_dati); /写入数据/*-*/ /读出AC指定地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned

41、 char y) unsigned char addr_dat;  LCD_pos(x, y);      /定位 addr_dat = LCD_current_addr_dat(); /读出数据 return (addr_dat);/*-*/ /定位输出字符void LCD_printc(unsigned char x, unsigned char y, unsigned char c) LCD_pos(x, y); LCD_dat(c);/*-*/ /

42、定位输出字符串void LCD_prints(unsigned char x, unsigned char y, unsigned char *s) LCD_pos(x, y); while(*s)   LCD_dat(*s);  s+; /*-*/ /定位输出16位二进制数字/ 0<= num <65536void LCD_printn(unsigned char x, unsigned char y, unsigned int num) char i; unsigned char

43、 ii; unsigned char dat6; for(i = 0; i < 6; i+) dati = 0; i = 0; /初始化数据 while(num / 10)        /拆位   dati = num % 10;      /最低位  num /= 10; i+;    dati = num; 

44、;       /最高位 ii = i;          /保存dat的位数 for(; i >= 0; i-) dati += 48;   /转化成ASCII LCD_prints(x, y, "     ");     /清显示区域

45、60;LCD_pos(x, y); for(i = ii; i >= 0; i-) LCD_dat(dati); /输出数字字符/*-*/ /LCD初始化void LCD_init(void)#if Port_Type_Select   /选择八位数据模式 LCD_DISPLAY8_DOUBLE_LINE /设置LCD为16X2显示,5X7点阵,八位数据接口#else LCD_DISPLAY4_DOUBLE_LINE /设置LCD为16X2显示,5X7点阵,四位数据接口#endif LCD

46、_AC_AUTO_INCREMENT  /LCD显示光标移动设置(光标地址指针加1,整屏显示不移动) LCD_DISPLAY_ON    /LCD开显示及光标设置(光标不闪烁,不显示"_") LCD_CLR      /清屏/*-*/ 原创 液晶1602 显示汉字研究液晶, 汉字, 研究1602是一款最常用也是最便宜的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。1602可以显示内部常用字符(包括阿拉伯数字,英文字母

47、大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。一、显示常用字符。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”十进制    十六进制    ASCII字符       

48、 十进制    十六进制    ASCII字符        十进制    十六进制    ASCII字符    00    00    自定义字符1        56    38    8        96  &#

49、160; 60        01    01    自定义字符2        57    39    9        97    61    a    02    02    自定义字符3       &

50、#160;58    3A    :        98    62    b    03    03    自定义字符4        59    3B    ;        99    63   

51、; c    04    04    自定义字符5        60    3C    <        100    64    d    05    05    自定义字符6        61 

52、  3D    =        101    65    e    06    06    自定义字符7        62    3E    >        102    66    f 

53、   07    07    自定义字符8        63    3F    ?        103    67    g    08    08    自定义字符1        64    40

54、60;           104    68    h    09    09    自定义字符2       65    41    A        105    69    i    10    0A&

55、#160;   自定义字符3        66    42    B        106    6A    j    11    0B    自定义字符4        67    43    C   &#

56、160;    107    6B    k    12    0C    自定义字符5        68    44    D        108    6C    l    13    0D    自定

57、义字符6        69    45    E        109    6D    m    14    0E    自定义字符7        70    46    F      

58、0; 110    6E    n    15    0F    自定义字符8        71    47    G        111    6F    o    32    20    空格   &#

59、160;                  72    48    H        112    70    p    33    21    !                

60、            73    49    I        113    71    q    34    22    "                      

61、;      74    4A    J        114    72    r    35    23    #                          75  &

62、#160; 4B    K        115    73    s    36    24    $                          76    4C    L  &#

63、160;     116    74    t    37    25    %                        77    4D    M        117   

64、; 75    u    38    26    &                          78    4E    N        118    76    v  &#

65、160; 39    27    '                            79    4F    O        119    77    w    40    28

66、60;   (                          80    50    P        120    78    x    41    29    )    

67、                     81    51    Q        121    79    y    42    2A    *            

68、              82    52    R        122    7A    z    43    2B    +                   

69、       83    53    S        123    7B        44    2C    ,                          8

70、4    54    T        124    7C    |    45    2D    -                          85    55    U

71、        125    7D        46    2E    .                          86    56    V       &

72、#160;126    7E        47    2F    /                          87    57    W               &

73、#160;    48    30    0                          88    58    X                    49&#

74、160;   31    1                          89    59    Y                    50    32   

75、2                          90    5A    Z                    51    33    3      &

76、#160;                   91    5B                        52    34    4            

77、0;             92    5C                        53    35    5                   

78、      93    5D                        54    36    6                         

79、0;94    5E                        55    37    7                          95    5F  &#

80、160; _                    显示操作的过程:首先确认显示的位置,即在第几行,第几个字符开始显示。也就是要显示的地址,如下表所示的显示地址。第一行的显示地址是0x800x8F,第二行的显示地址是0xC00xCF。例如想要在第2行,第3个位置显示一个字符,那么地址码就是 0xC2。在编程过程中,通常编写一个函数确定在某行某个位置显示数据。函数需要 行参数(y),和 列参数(x)来确定显示位置。程序参考如下/*设置显示位置*/ void

81、LCD_set_xy( unsigned char x, unsigned char y ) unsigned char address;     if (0 = y) x |= 0x80; /当要显示第一行时地址码+0x80;    else x |= 0xC0; /在第二行显示是地址码+0xC0;    Write_com(x); /发送地址码 0x80-0x8F 或者0xC00xCF    以上地址码,在显示过程中,可以直接应用,至于地址码的计算原理,如果想要研究,请参考其它资料,这里不做描述。其次设置要显示

82、的内容,即上面提到的CGROM内的字符编码。如显示“A”,将编码41H写入到液晶屏显示即可。通常设置地址和显示内容用一个函数来完成。代码参考如下:/功能:按指定位置显示一个字符/输入:列显示地址x(取值范围0-15) 行显示地址y(取值范围0-1), 指定字符void DisplayOneChar(unsigned char x, unsigned char y, unsigned char Data)    if (0 = y) x |= 0x80; /当要显示第一行时地址码+0x80;    else x |= 0xC0; /在第二行显示是地址码+0xC0;    Write_com(x); /发送地址码  &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论