查看: 3554|回复: 0

[原创] [学习LPC54114] 实验2 驱显黑白LCD

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2017-4-16 17:14:47 | 显示全部楼层 |阅读模式
    本帖最后由 zhjb1 于 2017-4-16 17:35 编辑

    [学习LPC54114] 实验2 驱显黑白LCD
    开发板听得骇人,实际上的引脚数量还是太少,考虑到各种常用口的使用,正真作为IO口的不多,除非硬件复用,还是省了这心吧。因此驱显的这人就落在了串口LCD上,串口LCD黑白和彩色的都有,都不带触摸,因此就用黑白的6903,显示字符不少,屏幕大小适中。参考实验1的IO配置,轻松完成驱显,改动的地方如下,首先在board.h文档中增加一段LCD控制引脚定义:
    //Define LCD CTRL
    #define LCD_DAT GPIO
    #define LCD_DATPO 1U
    #define LCD_DATPI 8U//LCD_DATA
    #define LCD_CLK GPIO
    #define LCD_CLKPO 1U
    #define LCD_CLKPI 9U//LCD_CLOCK
    #define LCD_RES GPIO
    #define LCD_RESPO 1U
    #define LCD_RESPI 10U//LCD_RESET
    #define LCD_REG GPIO
    #define LCD_REGPO 1U
    #define LCD_REGPI 11U//LCD_COM/DATA
    接着创建一个文件夹和一个文件放在里面,文件夹名为:incs,里面存放的是6903.h LCD相关文件:
    #include "board.h"
    #include "fsl_debug_console.h"
    #include "fsl_gpio.h"
    #include "fsl_usart.h"
    #include "pin_mux.h"
    #include <stdbool.h>

    //6903 102X64LCD
    const unsigned char asc2[][6]={//8x6 Dots 32-126[0-94]
    {0x00,0x3E,0x45,0x49,0x51,0x3E},//0
    {0x00,0x00,0x21,0x7F,0x01,0x00},//1
    {0x00,0x31,0x43,0x45,0x49,0x31},//2
    {0x00,0x22,0x49,0x49,0x49,0x36},//3
    {0x00,0x04,0x0C,0x14,0x7F,0x04},//4
    {0x00,0x72,0x51,0x51,0x51,0x4E},//5-5
    {0x00,0x3E,0x49,0x49,0x49,0x06},//6
    {0x00,0x40,0x43,0x4C,0x50,0x60},//7
    {0x00,0x36,0x49,0x49,0x49,0x36},//8
    {0x00,0x30,0x48,0x48,0x48,0x3F},//9
    {0x00,0x1F,0x24,0x64,0x24,0x1F},//A-10
    {0x00,0x41,0x7F,0x49,0x49,0x36},//B
    {0x00,0x3E,0x41,0x41,0x41,0x22},//C
    {0x00,0x41,0x7F,0x41,0x41,0x3E},//D
    {0x00,0x41,0x7F,0x49,0x49,0x63},//E
    {0x00,0x41,0x7F,0x49,0x5C,0x60},//F-15
    {0x00,0x3E,0x41,0x45,0x47,0x24},//G
    {0x41,0x7F,0x08,0x08,0x08,0x7F},//H
    {0x00,0x00,0x41,0x7F,0x41,0x00},//I
    {0x00,0x42,0x41,0x7F,0x40,0x40},//J
    {0x00,0x41,0x7F,0x59,0x24,0x43},//K-20
    {0x00,0x40,0x7F,0x41,0x01,0x03},//L
    {0x00,0x7F,0x20,0x1E,0x20,0x7F},//M
    {0x00,0x7F,0x30,0x18,0x06,0x7F},//N
    {0x00,0x3E,0x41,0x41,0x41,0x3E},//O
    {0x00,0x41,0x7F,0x49,0x48,0x30},//P-25
    {0x00,0x3E,0x41,0x47,0x42,0x3D},//Q
    {0x00,0x41,0x7F,0x49,0x4C,0x33},//R
    {0x00,0x32,0x49,0x49,0x49,0x26},//S
    {0x00,0x60,0x41,0x7F,0x41,0x60},//T
    {0x00,0x7E,0x01,0x01,0x01,0x7E},//U-30
    {0x00,0x7C,0x02,0x01,0x02,0x7C},//V
    {0x00,0x7C,0x03,0x3C,0x03,0x7C},//W
    {0x00,0x43,0x24,0x18,0x24,0x43},//X
    {0x00,0x60,0x18,0x07,0x18,0x60},//Y
    {0x00,0x63,0x45,0x49,0x51,0x63},//Z-35
    {0x00,0x00,0x00,0x01,0x00,0x00},//.
    {0x00,0x14,0x14,0x14,0x14,0x14},//=
    {0x00,0x08,0x08,0x3E,0x08,0x08},//+
    {0x00,0x08,0x08,0x08,0x08,0x08},//-
    {0x00,0x00,0x00,0x24,0x00,0x00},//:-40
    };
    //DELAYER
    void delay0(int counter){
    int i,j;
    for(i=0;i<counter;i++){for(j=0;j<i;j++){;}}
    }
    //Write Plus
    void wri(void){
    GPIO_ClearPinsOutput(LCD_CLK,LCD_CLKPO,1U << LCD_CLKPI);
    GPIO_SetPinsOutput(LCD_CLK,LCD_CLKPO,1U << LCD_CLKPI);
    }
    //a Byte to LCD
    void b2l(unsigned char dt,unsigned char command){
    unsigned char i;
    if(command) GPIO_SetPinsOutput(LCD_REG,LCD_REGPO,1U << LCD_REGPI);
    else GPIO_ClearPinsOutput(LCD_REG,LCD_REGPO,1U << LCD_REGPI);
    for(i=0;i<8;i++){
      if(dt&0x80) GPIO_SetPinsOutput(LCD_DAT,LCD_DATPO,1U << LCD_DATPI);
      else GPIO_ClearPinsOutput(LCD_DAT,LCD_DATPO,1U << LCD_DATPI);
      dt=dt<<1;   
      wri();
    }  
    }
    //Set XY
    void setXY(unsigned char X,unsigned char Y){
    b2l(0x40+Y,0);//column
    b2l(0x80+X,0);//row
    }
    //LCD Clear
    void lcdClear(void){
    unsigned char t,k;
    setXY(0,0);
    for(t=0;t<9;t++){for(k=0;k<102;k++){b2l(0x00,1);}}
    }
    //ASCII->LCD
    void c2l(unsigned char x,unsigned char y,unsigned char c){
    unsigned char line;
    setXY(x*6,y);   
    for(line=0;line<6;line++)b2l(asc2[c][line],1);
    }
    //LCD6903 Initial
    void lcdInit(void){
    GPIO_ClearPinsOutput(LCD_RES,LCD_RESPO,1U << LCD_RESPI);
    delay0(1500);
    GPIO_SetPinsOutput(LCD_RES,LCD_RESPO,1U << LCD_RESPI);
    delay0(1500);        
    b2l(0x25,0);//00100 PD=1dcOn|=0Dcoff V=0Up|=1Left H==1
    delay0(20);
    b2l(0x14,0);//Plus W=L000~111=1/6-1/7-1/8-1/9//14=1/7
    delay0(20);
    b2l(0xAC,0);//VOP-8.96V
    delay0(20);
    b2l(0x20,0);//PD=0,H=0,V=0
    b2l(0x0C,0);//LCD Ok
    delay0(20);
    }
    //Display ASCII Test
    void dispAsc(void){
    int i,j,k=0;
    for(i=0;i<8;i++){
      for(j=0;j<17;j++){
       c2l(j,i,k);
       if(k>39){k=0;}else{k++;}
      }
    }
    }
    //END Files//
    接着是main.c,为了留有余地,赋值了一个改名为mainLcd.c,代码如下:
    #include "board.h"
    #include "fsl_debug_console.h"
    #include "fsl_gpio.h"
    #include "fsl_usart.h"
    #include "pin_mux.h"
    #include "6903.h"
    #include <stdbool.h>
    //Definitions

    //Prototypes
    gpio_pin_config_t config={kGPIO_DigitalOutput,LOGIC_LED_OFF};
    //Variables/
    uint8_t ledTime=1;
    //Code
    void delay(int counter){
    volatile uint32_t i,j;
    for(i=0;i<counter;++i){for(j=0;j<i;j++){;}}//__asm("NOP");
    }
    //GPIO Initial
    void ioInit(void){
    GPIO_PinInit(BOARD_LED1_GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    GPIO_PinInit(BOARD_LED2_GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    GPIO_PinInit(BOARD_LED3_GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    GPIO_PinInit(BOARD_LED4_GPIO, BOARD_LED4_GPIO_PORT, BOARD_LED4_GPIO_PIN,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});

    GPIO_PinInit(LCD_DAT,LCD_DATPO,LCD_DATPI,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    GPIO_PinInit(LCD_CLK,LCD_CLKPO,LCD_CLKPI,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    GPIO_PinInit(LCD_RES,LCD_RESPO,LCD_RESPI,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    GPIO_PinInit(LCD_REG,LCD_REGPO,LCD_REGPI,&(gpio_pin_config_t){kGPIO_DigitalOutput,(LOGIC_LED_ON)});
    }
    //LED TEST Program
    void led(void){
    if(ledTime){
      GPIO_ClearPinsOutput(BOARD_LED1_GPIO, BOARD_LED1_GPIO_PORT,1U << BOARD_LED1_GPIO_PIN);
      ledTime=0;
    }else{
      GPIO_SetPinsOutput(BOARD_LED1_GPIO, BOARD_LED1_GPIO_PORT,1U << BOARD_LED1_GPIO_PIN);
      ledTime=1;
    }
    }
    //Main function
    int main(void){
    //attach 12 MHz clock to FLEXCOMM0
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    BOARD_InitPins();
    BOARD_BootClockHSRUN();
    BOARD_InitDebugConsole();
    SystemCoreClockUpdate();
    CLOCK_EnableClock(kCLOCK_Gpio0);
    CLOCK_EnableClock(kCLOCK_Gpio1);
    ioInit();
    lcdInit();
    lcdClear();
    while(true){
      dispAsc();
      led();
      delay(3000);
    }
    }
    编译下载运行结果见照片21,22。最后将屏幕改成将来实验用到的基本界面为照片23。

    照片21

    照片21

    照片22

    照片22

    照片23

    照片23
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 02:53 , Processed in 0.087803 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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