收拾工位时翻出一块闲置已久的lcd5110,分辨率只有84*48,颗粒感太强被弃用了,碰巧前几天收到一块LPC812MAX,顺便尝试下使用LPC812软硬件SPI进行驱动,程序如下:
- #include "LPC8xx.h"
- #include "lpc8xx_syscon.h"
- #include "lpc8xx_swm.h"
- #include "lpc8xx_spi.h"
- #define u_char unsigned char
- #define LCD_CE 1<<12
- #define LCD_DC 1<<16
- #define LCD_CLK 1<<15
- #define LCD_DIN 1<<14
- extern const u_char pig[];
- extern const u_char asic[][6];
- void delay_us(int i){
- int j=1000*i;
- for (;j>0;j--);
- }
- void GPIO_Set(int i){
- LPC_GPIO_PORT->SET0 = i;
- }
- void GPIO_Reset(int i){
- LPC_GPIO_PORT->CLR0 = i;
- }
- ////////////////////////////////////////////soft spi/////////////////////////////////////////////
- void LCD_SPI_soft_init(void){
- LPC_GPIO_PORT->DIR0 |= LCD_CE|LCD_DC|LCD_DIN|LCD_CLK;
- GPIO_Reset(LCD_CE|LCD_DC|LCD_DIN|LCD_CLK);
- }
- void LCD_write_byte(u_char date, u_char command)
- {
- u_char i;
- GPIO_Reset(LCD_CE);
- if (command == 0) //cmd
- GPIO_Reset(LCD_DC);
- else
- GPIO_Set(LCD_DC); //date
- for(i=0;i<8;i++) {
- if(date&0x80)
- GPIO_Set(LCD_DIN);
- else
- GPIO_Reset(LCD_DIN);
- date = date <<1;
- GPIO_Reset(LCD_CLK);
- GPIO_Set(LCD_CLK);
- }
- GPIO_Set(LCD_CE);
- }
- ///////////////////////////////////////////////hard spi//////////////////////////////////////////
- /*
- void ConfigSWM(uint32_t func, uint32_t port_pin) {
- uint32_t temp, pinassign, shifter, i;
- for (i=0; i<num_funcs; i++) {
- if (func != i)
- continue;
- else {
- pinassign = i/4;
- shifter = (i%4)*8;
- break;
- }
- }
- temp = LPC_SWM->PINASSIGN[pinassign];
- temp &= ~(0xFF<<(shifter));
- temp |= (port_pin << shifter);
- LPC_SWM->PINASSIGN[pinassign] = temp;
- return;
- }
- void LCD_SPI_hard_init(){
- LPC_GPIO_PORT->DIR0 |= LCD_CE|LCD_DC;
- GPIO_Reset(LCD_CE|LCD_DC|LCD_DIN|LCD_CLK);
- ConfigSWM(SPI0_SCK, P0_15);
- ConfigSWM(SPI0_MOSI, P0_14);
- ConfigSWM(SPI0_SSEL, P0_12);
- LPC_SYSCON->PRESETCTRL &= (SPI0_RST_N); //restart
- LPC_SYSCON->PRESETCTRL |= ~(SPI0_RST_N);
- LPC_SPI0->DIV = (14);// Configure the SPI master's clock divider (DIV = value+1)
- LPC_SPI0->CFG = CFG_ENABLE | CFG_MASTER ; // CPOL & CPHA
- LPC_SPI0->DLY = 0x0000;
- LPC_SPI0->TXCTL = CTL_EOF | CTL_EOT | CTL_RXIGNORE | CTL_LEN(8);
- }
- void LCD_write_byte(u_char date, u_char cmd)
- {
- u_char i;
- if (cmd == 0) //cmd
- GPIO_Reset(LCD_DC);
- else
- GPIO_Set(LCD_DC); //date
- LPC_SPI0->TXDAT = date;
- }
- */
- void LCD_set_XY(u_char X,u_char Y)
- {
- LCD_write_byte(0x40 | Y, 0);
- LCD_write_byte(0x80 | X, 0);
- }
- void LCD_clear(void){
- int i = 0;
- LCD_set_XY(0,0);
- for(;i<504;i++){
- LCD_write_byte(0x00, 1);
- }
- }
- void LCD_soft_init(void)
- {
- LCD_SPI_soft_init();
- GPIO_Reset(LCD_CE); // disable LCD
- delay_us(1);
- GPIO_Set(LCD_CE); // enable LCD
- delay_us(1);
- LCD_write_byte(0x21,0);
- LCD_write_byte(0xb6,0); //偏置电压
- LCD_write_byte(0x06,0);
- LCD_write_byte(0x13,0);
- LCD_write_byte(0x20,0);
- LCD_write_byte(0x0C,0); //反显
- LCD_clear();
- }
- /*
- void LCD_hard_init(void)
- {
- LCD_SPI_hard_init();
- delay_us(1);
- LCD_write_byte(0x21, 0);
- LCD_write_byte(0xb6, 0); //偏置电压
- LCD_write_byte(0x06, 0);
- LCD_write_byte(0x13, 0);
- LCD_write_byte(0x20, 0);
- LCD_write_byte(0x0C,0);
- LCD_clear();
- }
- */
- void LCD_write_char(u_char X,u_char Y,u_char c)
- {
- unsigned char i;
- LCD_set_XY(6*X,Y); //asic[][6]:6*8 , X:84/6=14 , Y:48/8=6
- for (i=0; i<6; i++){
- LCD_write_byte(asic[c] , 1);
- }
- }
- void LCD_write_string(u_char *c,u_char X,u_char Y)
- {
- u_char i = X;
- while(*c != 0x00) //loop until finish
- {
- LCD_write_char(i,Y,*c++);
- i ++;
- if(i == 14){ //X:84/6=14
- i = 0;
- Y ++;
- }
- }
- }
- void LCD_draw_bmp(u_char X,u_char Y, u_char weight,u_char height,u_char pic)//
- {
- unsigned int i=X;
- unsigned int j=Y;
- unsigned int k = 0;
- unsigned int count = weight*height/8;
- //unsigned char *ch = pic;
-
- LCD_set_XY(i,j);
- for(k=0;k<count;k++)
- {
- LCD_write_byte(pig[k],1);
- if((k+1)%weight==0){
- j++;
- LCD_set_XY(i,j);
- }
- }
- }
- ///////////////////////////////////////font//////////////////
- const u_char asic[][6]={
- 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
- 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
- 0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
- 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
- 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
- 0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
- 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
- 0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
- 0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
- 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
- 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
- 0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
- 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
- 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
- 0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
- 0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
- 0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
- 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
- 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
- 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
- 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
- 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
- 0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
- 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
- 0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
- 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
- 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
- 0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
- 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
- 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
- 0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
- 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
- 0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
- 0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
- 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
- 0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
- 0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
- 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
- 0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
- 0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
- 0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
- 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
- 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
- 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
- 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
- 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
- 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
- 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
- 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
- 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
- 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
- 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
- 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
- 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
- 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
- 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
- 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
- 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
- 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
- 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
- 0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
- 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
- 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
- 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
- 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
- 0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
- 0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
- 0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
- 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
- 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 、
- 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
- 0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
- 0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
- 0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
- 0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
- 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
- 0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
- 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
- 0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
- 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
- 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
- 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
- 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
- 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
- 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
- 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
- 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
- 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
- 0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
- 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
- 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
- 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
- 0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
- 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
- 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
- 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
- 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
- 0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
- 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
- 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
- };
- const u_char pig[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x1C,0xCC,0xDE,0x76,0x76,0xE6,
- 0x86,0x0E,0x1C,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0E,0x0E,0x0E,0x0E,0x0C,0x0C,0x0C,
- 0x0C,0x18,0x18,0x30,0x70,0x60,0x60,0x60,0x70,0x70,0x60,0x60,0xE0,0xC0,0x80,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0xDF,0x8F,0x80,0x82,0x8F,0xBF,0x30,
- 0xA0,0x89,0xCF,0xC6,0x8E,0x1C,0x10,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
- 0x00,0x80,0x9C,0x9C,0x8C,0x1C,0x70,0xFC,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x81,
- 0xC3,0xFF,0x3C,0x00,0x00,0xC0,0xE0,0x60,0xE0,0xC0,0xE0,0x71,0xF9,0xFD,0x1F,0x07,
- 0x03,0x00,0x01,0x01,0xC1,0xF9,0x3D,0xEE,0xF3,0xDB,0xF9,0x71,0x01,0x01,0x01,0xF1,
- 0xFB,0x33,0xE6,0x9D,0xF9,0xE1,0x03,0x07,0x00,0x03,0x0F,0x1C,0x1C,0x0C,0xFE,0xFE,
- 0x77,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0xFF,0xFF,0x01,0x00,0x07,0x0F,
- 0x1C,0x38,0x70,0x60,0xE0,0xC0,0xC3,0xC7,0x8E,0x8D,0x9D,0xBD,0xFE,0xCE,0xCE,0xC6,
- 0xCE,0xEC,0x7F,0xBF,0x8B,0x8D,0x8F,0x83,0x80,0xC0,0xC0,0xC0,0x60,0x60,0xF0,0x9C,
- 0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0xFF,0xD8,
- 0xF8,0xF0,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0xE1,0xF1,0x31,0x01,
- 0x01,0x03,0x03,0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x81,0xC1,0xC0,0x00,0x00,0xE0,
- 0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,
- 0x83,0x83,0x83,0x01,0x01,0x03,0x1F,0x7C,0xF0,0xB0,0xB0,0xF0,0xF0,0xD0,0xFF,0xFF,
- 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0E,0x06,0x36,0x7F,0x7F,0x79,0x79,0x78,0x78,
- 0x1E,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- int main(void) {
- LPC_SYSCON->SYSAHBCLKCTRL |= (GPIO|SPI0|SWM);
- LCD_soft_init();
- LCD_write_string("LPC812 max",2,2);
- delay_us(10000);
- LCD_clear();
- while(1) {
- LCD_draw_bmp(5,0, 50,48,pig[504]);
- delay_us(100);
- //LCD_clear();
- //LCD_write_byte(0xa5,1);
- //LPC_SPI0->TXDAT = 0x21;
- }
- }
复制代码
程序使用了SPI0与软件模拟SPI,实现字符串与图片的显示,实验效果如图所示:
目前软件SPI已调试成功,但仍存在两个问题:
1:字符串转数组问题:LCD_draw_bmp(u_char X,u_char Y, u_char weight,u_char height,u_char pic)函数通过输入插入点座标(X,Y)、图片水平与竖直方向上的像素点数目以及图片数组实现任意位置与大小图片的显示,并将其取代汉字,进行图片的局部刷新。图片数组默认置为504(84*48),函数中会根据图片水平与竖直方向上的像素点数目weight与height缩小数组范围并实现换行。但是现在存在一个问题,图片数组pic无法直接传递到LCD_write_byte(pig[k],1)的pig[]数组中,只能写死,灵活性较差。
2:使用硬件SPI时,单独调用LPC_SPI0->TXDAT = 0x21与LCD_write_byte(0xa5,1)时读值正确,但是整体初始化时读值错误,目前以尝试过更改 LPC_SPI0->CFG 中 CPOL 与 CPHA的四种组合,但问题依旧。
|