在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 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。
|
|