一、实验目的 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。 六、代码分析
- #include "12864.h"
- #include "lpc177x_8x.h"
-
- #define LCD_RS_1() LPC_GPIO2->SET|= (1uL<<13) /* p2.13 H:Data 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 L:Disable */
- #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->PIN&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->PIN=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->PIN=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;
- }
-
复制代码 |