完整的實驗文檔下載:
基于LPC1788的液晶顯示.docx
(113.49 KB, 下載次數: 17)
2017-2-10 17:07 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
實驗二 液晶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.001.jpg (14.93 KB, 下載次數: 121)
下載附件
2017-2-10 21:56 上傳
1.002.jpg (13.32 KB, 下載次數: 128)
下載附件
2017-2-10 21:56 上傳
圖 1
1.003.jpg (30.69 KB, 下載次數: 129)
下載附件
2017-2-10 21:56 上傳
圖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;
- }
-
復制代碼 |