找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4273|回复: 0
打印 上一主题 下一主题
收起左侧

基于LPC1788的12864液晶显示

[复制链接]
跳转到指定楼层
楼主
完整的实验文档下载:
基于LPC1788的液晶显示.docx (113.49 KB, 下载次数: 17)

实验二   液晶12864实验
一、实验目的
1.熟悉液晶显示的操作。
2.掌握LPC1788 GPIO口数据输入、输出的方法。
3.了解实验系统板有关12864的硬件机构。
二、实验内容
1. 阅读液晶12864文档,掌握液晶12864显示的工作原理。
2. 阅读SN74LVC4245A芯片文档,掌握SN74LVC4245A芯片的工作原理。
3. 编写液晶12864显示程序。
三、实验设备

硬件部分:PC机(宿主机)、LPC1788实验板、液晶12864、JLINK仿真器。

软件部分:PC机WINDOWS系统、MDK KEIL软件、JLINK仿真调试驱动程序

四、实验电路
图 1

图3
图1中,当总线收发芯片SN74LVC4245A的DIR引脚复位时,数据由MCU
传输给液晶12864;DIR置位时,数据由液晶12864传输给MCU。
六、代码分析


  1. #include "12864.h"

  2. #include "lpc177x_8x.h"



  3. #define LCD_RS_1()     LPC_GPIO2->SET|= (1uL<<13)            /* p2.13 H:Data    L:Instruction  */

  4. #define LCD_RS_0()                  LPC_GPIO2->CLR|= (1uL<<13)                                         

  5. #define LCD_RW_1()              LPC_GPIO1->SET|= (1uL<<26)              /* P1.26    H:Read    L:Write */

  6. #define LCD_RW_0()              LPC_GPIO1->CLR|= (1uL<<26)

  7. #define LCD_E_1()     LPC_GPIO1->SET|= (1uL<<27)      

  8. /*  P1.27    H:Enable  L:Disable */

  9. #define LCD_E_0()                  LPC_GPIO1->CLR|= (1uL<<27)

  10. #define LCD_DIR_1()                LPC_GPIO1->SET|= (1uL<<29)      

  11.                /* P1.29 SN74LV4245A总线收发器方向控制位

  12.                                                         H: 数据由 12864到MCU    L:  数据由 MCU到 12864  */

  13. #define LCD_DIR_0()   LPC_GPIO1->CLR|= (1uL<<29)     



  14. void delay(uint32_t x) //延时 x ms

  15. {

  16.               uint32_t i,j;

  17.               for(i=x;i>0;i--)

  18.                   for(j=110;j>0;j--);

  19. }



  20. void Clr_Screen(void)//清屏函数,注意要经常调用清屏函数,即使在刚刚初始化后;

  21. {

  22.    LCD_Wcmd(0x30);   

  23.    LCD_Wcmd(0x01);

  24. }



  25. void LCD_Init(void)                              //液晶屏初始化,包括CPU的相关端口设置

  26. {                                                                                                                                                                                                                                             

  27. LPC_GPIO1->DIR  |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28));            /*     所有管脚配置为数字输出       */

  28.                  LPC_GPIO2->DIR  |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));

  29.                            

  30. LPC_GPIO1->SET  |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28));            /*  所有管脚配置为数字输出   */

  31.                             LPC_GPIO2->SET  |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));

  32.                             LCD_DIR_0();                      /*数据由 MCU到 12864     */

  33.                  LCD_Wcmd(0x30);              //8位MPU接口,默认基本指令集,参见12864数据手册

  34.                  LCD_Wcmd(0x0C);              //开显示,关光标,不闪烁

  35.                             LCD_Wcmd(0x06); //指定在资料写入或读取时,光标的移动方向

  36.                             LCD_Wcmd(0x01);



  37. void check_busy(void)                       //检测忙状态

  38. {

  39.                             LPC_GPIO2->SET |= (1uL<< 7);          //DB7状态位置1

  40.                             delay(1);

  41.                             LCD_DIR_1();                       //数据由 12864  到 MCU

  42.                             LCD_RS_0();

  43.                             LCD_RW_1();                         //读忙状态

  44.                             delay(1);

  45.                             LPC_GPIO2->DIR  &= ((0x0<< 0 )&(0x0<< 1 )& (0x0<< 2 )&(0x0<< 3)&(0x0<< 4)& (0x0<< 5)&(0x0<< 6)&(0x0<<7));   //数据口设为输入         

  46.                             LCD_E_1();

  47.                             while((LPC_GPIO2->PIN&0x00000080)==0x00000080);     //一直等待,直到DB7状态位为0;

  48.                             LCD_E_0();

  49. LPC_GPIO1->DIR  |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28));            /*   所有管脚配置为数字输出   */

  50.                             LPC_GPIO2->DIR  |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));

  51.                             LCD_DIR_0();      

  52. }



  53. void LCD_Wcmd(uint8_t cmd)                 //写命令

  54. {                           

  55.                             check_busy();

  56.                             delay(1);

  57.                             LCD_DIR_0();

  58.     LCD_RS_0();               

  59.     LCD_RW_0();             //写命令

  60.                             delay(1);

  61.                            

  62.     LCD_E_1();

  63.                             LPC_GPIO2->MASK=~0x000000FF;

  64.     LPC_GPIO2->PIN=cmd;                 //命令写到 P2_0~P2_7

  65.                             LPC_GPIO2->MASK=0;

  66.                             delay(50);

  67.     LCD_E_0();

  68.                             delay(50);            //使能的下降沿将信号传给12864

  69. }



  70. void LCD_Wdata(uint8_t data)   //写数据,时序参考PDF

  71. {

  72.                             check_busy();

  73.                             LCD_DIR_0();

  74.                  LCD_RS_1();

  75.                             LCD_RW_0();              //写数据

  76.                            

  77.      LCD_E_1();

  78.                             LPC_GPIO2->MASK=~0x000000FF;

  79.     LPC_GPIO2->PIN=data;                 //数据写到 P2_0~P2_7

  80.                             LPC_GPIO2->MASK=0;

  81.                             delay(50);

  82.      LCD_E_0();

  83.                             delay(50);            //使能的下降沿将信号传给12864

  84. }



  85. //注意:中文显示时空格符或数字ASCII码必需两个一起用,标点符号注意中英文

  86. void LCD_Write_Str(uint8_t x, uint8_t y, uint8_t *str) //向某行某列写字符串

  87. {

  88.     uint8_t addr;

  89.     if(1==x){addr=0x80;}

  90.     if(2==x){addr=0x90;}

  91.     if(3==x){addr=0x88;}

  92.     if(4==x){addr=0x98;}

  93.     addr=addr+y;

  94.                             delay(1);

  95.     LCD_Wcmd(addr);

  96.     while(*str)

  97.     {

  98.                   LCD_Wdata(*str);            

  99.                                           delay(35);            

  100.                                           str++;

  101.     }

  102. }



  103. void Menu(void)                              

  104. {   

  105.               Clr_Screen();

  106.               LCD_Write_Str(1,0,"LPC1788 嵌入式");

  107.               delay(5);

  108.               LCD_Write_Str(2,0,"自动化学院欢迎您");

  109.               delay(5);

  110.               LCD_Write_Str(3,1,"!@#$%^&*");

  111.               delay(5);

  112.               LCD_Write_Str(4,2,"11234567");

  113.               delay(5);

  114. }



  115. int main(void)

  116. {

  117.                             LCD_Init();            

  118.                             Menu();

  119.                 return 0;

  120. }

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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