找回密码
 注册
关于网站域名变更的通知
查看: 397|回复: 1
打印 上一主题 下一主题

基于LPC1788的12864液晶显示

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-10-30 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    基于LPC1788的12864液晶显示1 d1 I6 m& O6 @; U" Z9 V

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

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

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

    游客,如果您要查看本帖隐藏内容请回复

    四、实验电路
    图 1

    . m7 [" K" ]) W$ L' S) \
    图3
    图1中,当总线收发芯片SN74LVC4245A的DIR引脚复位时,数据由mcu
    传输给液晶12864;DIR置位时,数据由液晶12864传输给MCU。
    六、代码分析

    ; X! ~" v: c& E
    • #include "12864.h"
    • #include "lpc177x_8x.h"
    • #define LCD_RS_1()     LPC_GPIO2->SET|= (1uL<<13)            /* p2.13 Hata    L:Instruction  */
    • #define LCD_RS_0()                  LPC_GPIO2->CLR|= (1uL<<13)
    • #define LCD_RW_1()              LPC_GPIO1->SET|= (1uL<<26)              /* P1.26    H:Read    L:Write */
    • #define LCD_RW_0()              LPC_GPIO1->CLR|= (1uL<<26)
    • #define LCD_E_1()     LPC_GPIO1->SET|= (1uL<<27)      
    • /*  P1.27    H:Enable  Lisable */
    • #define LCD_E_0()                  LPC_GPIO1->CLR|= (1uL<<27)
    • #define LCD_DIR_1()                LPC_GPIO1->SET|= (1uL<<29)      
    •                /* P1.29 SN74LV4245A总线收发器方向控制位
    •                                                         H: 数据由 12864到MCU    L:  数据由 MCU到 12864  */
    • #define LCD_DIR_0()   LPC_GPIO1->CLR|= (1uL<<29)
    • void delay(uint32_t x) //延时 x ms
    • {
    •               uint32_t i,j;
    •               for(i=x;i>0;i--)
    •                   for(j=110;j>0;j--);
    • }
    • void Clr_Screen(void)//清屏函数,注意要经常调用清屏函数,即使在刚刚初始化后;
    • {
    •    LCD_Wcmd(0x30);
    •    LCD_Wcmd(0x01);
    • }
    • void LCD_Init(void)                              //液晶屏初始化,包括CPU的相关端口设置
    • {                                                                                                                                                                                                                                             
    • LPC_GPIO1->DIR  |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28));            /*     所有管脚配置为数字输出       */
    •                  LPC_GPIO2->DIR  |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
    • LPC_GPIO1->SET  |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28));            /*  所有管脚配置为数字输出   */
    •                             LPC_GPIO2->SET  |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
    •                             LCD_DIR_0();                      /*数据由 MCU到 12864     */
    •                  LCD_Wcmd(0x30);              //8位MPU接口,默认基本指令集,参见12864数据手册
    •                  LCD_Wcmd(0x0C);              //开显示,关光标,不闪烁
    •                             LCD_Wcmd(0x06); //指定在资料写入或读取时,光标的移动方向
    •                             LCD_Wcmd(0x01);
    • void check_busy(void)                       //检测忙状态
    • {
    •                             LPC_GPIO2->SET |= (1uL<< 7);          //DB7状态位置1
    •                             delay(1);
    •                             LCD_DIR_1();                       //数据由 12864  到 MCU
    •                             LCD_RS_0();
    •                             LCD_RW_1();                         //读忙状态
    •                             delay(1);
    •                             LPC_GPIO2->DIR  &= ((0x0<< 0 )&(0x0<< 1 )& (0x0<< 2 )&(0x0<< 3)&(0x0<< 4)& (0x0<< 5)&(0x0<< 6)&(0x0<<7));   //数据口设为输入         
    •                             LCD_E_1();
    •                             while((LPC_GPIO2->IN&0x00000080)==0x00000080);     //一直等待,直到DB7状态位为0;
    •                             LCD_E_0();
    • LPC_GPIO1->DIR  |= ((1uL<< 26)|(1uL<< 27)|(1uL<< 29)|(1uL<< 28));            /*   所有管脚配置为数字输出   */
    •                             LPC_GPIO2->DIR  |= ((1uL<< 0 )|(1uL<< 1 )|(1uL<< 2 )|(1uL<< 3)|(1uL<< 4 )|(1uL<< 5 )|(1uL<< 6 )|(1uL<< 7 )|(1uL<< 13 ));
    •                             LCD_DIR_0();
    • }
    • void LCD_Wcmd(uint8_t cmd)                 //写命令
    • {
    •                             check_busy();
    •                             delay(1);
    •                             LCD_DIR_0();
    •     LCD_RS_0();
    •     LCD_RW_0();             //写命令
    •                             delay(1);
    •     LCD_E_1();
    •                             LPC_GPIO2->MASK=~0x000000FF;
    •     LPC_GPIO2->IN=cmd;                 //命令写到 P2_0~P2_7
    •                             LPC_GPIO2->MASK=0;
    •                             delay(50);
    •     LCD_E_0();
    •                             delay(50);            //使能的下降沿将信号传给12864
    • }
    • void LCD_Wdata(uint8_t data)   //写数据,时序参考PDF
    • {
    •                             check_busy();
    •                             LCD_DIR_0();
    •                  LCD_RS_1();
    •                             LCD_RW_0();              //写数据
    •      LCD_E_1();
    •                             LPC_GPIO2->MASK=~0x000000FF;
    •     LPC_GPIO2->IN=data;                 //数据写到 P2_0~P2_7
    •                             LPC_GPIO2->MASK=0;
    •                             delay(50);
    •      LCD_E_0();
    •                             delay(50);            //使能的下降沿将信号传给12864
    • }
    • //注意:中文显示时空格符或数字ASCII码必需两个一起用,标点符号注意中英文
    • void LCD_Write_Str(uint8_t x, uint8_t y, uint8_t *str) //向某行某列写字符串
    • {
    •     uint8_t addr;
    •     if(1==x){addr=0x80;}
    •     if(2==x){addr=0x90;}
    •     if(3==x){addr=0x88;}
    •     if(4==x){addr=0x98;}
    •     addr=addr+y;
    •                             delay(1);
    •     LCD_Wcmd(addr);
    •     while(*str)
    •     {
    •                   LCD_Wdata(*str);            
    •                                           delay(35);            
    •                                           str++;
    •     }
    • }
    • void Menu(void)
    • {   
    •               Clr_Screen();
    •               LCD_Write_Str(1,0,"LPC1788 嵌入式");
    •               delay(5);
    •               LCD_Write_Str(2,0,"自动化学院欢迎您");
    •               delay(5);
    •               LCD_Write_Str(3,1,"!@#$%^&*");
    •               delay(5);
    •               LCD_Write_Str(4,2,"11234567");
    •               delay(5);
    • }
    • int main(void)
    • {
    •                             LCD_Init();            
    •                             Menu();
    •                 return 0;
    • }
      3 h/ u9 C- Z# i) n
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-21 13:47 , Processed in 0.125976 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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