KL27 mini Board为使用者开发所提供的GPIO资源是十分紧张的,要想添加新的外设就只能见缝插针了。板上有个SPI Flash 芯片,其引脚资源基本可以用,为此就配上一个LCD5110液晶屏来实现显示功能,以增强人机交互性。 LCD5110共有8个引脚,除了电源和背光外,还有5个引脚需要安排,将SCE接GND,再用上SPI 总线的3个引脚(除去片选SS),还剩一个引脚无着落? 于是只好找个位置靠的近的下手,也就是24C02的SDA引脚。 具体的引脚分配如下: SCLK --PC5 DIN --PC7 DC --PC6 RST --PC4 SCE --GND 为了字符的显示,特将6*8点阵的小字符库放入数组中以便读取。 相关的程序如下: - #include <stdio.h>
- #include "gpio.h"
- #include "common.h"
- #define SetLCD_SCLK_High() {GPIO_WriteBit(HW_GPIOC, 5, 1);}
- #define SetLCD_SCLK_Low() {GPIO_WriteBit(HW_GPIOC, 5, 0);}
- #define SetLCD_SDIN_High() {GPIO_WriteBit(HW_GPIOC, 7, 1);}
- #define SetLCD_SDIN_Low() {GPIO_WriteBit(HW_GPIOC, 7, 0);}
- #define SetLCD_DC_High() {GPIO_WriteBit(HW_GPIOC, 6, 1);}
- #define SetLCD_DC_Low() {GPIO_WriteBit(HW_GPIOC, 6, 0);}
- #define SetLCD_RST_High() {GPIO_WriteBit(HW_GPIOC, 2, 1);}
- #define SetLCD_RST_Low() {GPIO_WriteBit(HW_GPIOC, 2, 0);}
- #define SetLCD_RSET_High() {GPIO_WriteBit(HW_GPIOC, 4, 1);}
- #define SetLCD_RSET_Low() {GPIO_WriteBit(HW_GPIOC, 4, 0);}
- uint8_t font6x8[][6] =
- { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
- { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
- { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
- 。。。
- { 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, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
- { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
- { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
- { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
- };
- void delay_1us(void) //1us延时函数
- { uint16_t i;
- for(i=0;i<1000;i++);
- }
- void LCD_write_CMD(uint8_t com)
- { uint16_t uci;
- SetLCD_DC_Low();
- for(uci=0;uci<8;uci++)
- { if(com & 0x80)
- { SetLCD_SDIN_High();
- }
- else
- { SetLCD_SDIN_Low();
- }
- SetLCD_SCLK_Low();
- com = com << 1;
- SetLCD_SCLK_High();
- }
- }
- void LCD_write_Data(uint8_t dt)
- { uint8_t uci;
- SetLCD_DC_High();
- for(uci=0;uci<8;uci++)
- { if(dt & 0x80)
- { SetLCD_SDIN_High();
- }
- else
- { SetLCD_SDIN_Low();
- }
- SetLCD_SCLK_Low();
- dt = dt << 1;
- SetLCD_SCLK_High();
- }
- }
- void LCD_set_XY(uint8_t X, uint8_t Y)
- { LCD_write_CMD(0x40 | (Y & 0X07));
- LCD_write_CMD(0x80 | (X & 0X7F));
- }
- void LCD_Clear(void)
- { uint16_t uii;
- LCD_set_XY(0,0);
- for(uii=0; uii<504; uii++)
- { LCD_write_Data(0x00);
- }
- }
- void LCD_Init(void)
- { SetLCD_RSET_High();
- SetLCD_RST_Low();
- delay_1us();
- SetLCD_RST_High();
- delay_1us();
- delay_1us();
- LCD_write_CMD(0x21);
- LCD_write_CMD(0xc0);
- LCD_write_CMD(0x06);
- LCD_write_CMD(0x13);
- LCD_write_CMD(0x20);
- LCD_Clear();
- LCD_write_CMD(0x0c);
- }
- void LCD_write_char(uint8_t c)
- { uint8_t line;
- c -= 32;
- for (line=0; line<6; line++)
- { LCD_write_Data(font6x8[c][line]);
- }
- }
- void LCD_write_english_string(uint8_t X,uint8_t Y,int8_t *s)
- { LCD_set_XY(X,Y);
- while (*s)
- { LCD_write_char(*s);
- s++;
- }
- }
- void TestLCD_Nokia5110(void)
- { GPIO_QuickInit(HW_GPIOC, 4, kGPIO_Mode_OPP);
- GPIO_QuickInit(HW_GPIOC, 5, kGPIO_Mode_OPP);
- GPIO_QuickInit(HW_GPIOC, 6, kGPIO_Mode_OPP);
- GPIO_QuickInit(HW_GPIOC, 7, kGPIO_Mode_OPP);
- LCD_Init();
- LCD_Clear();
- LCD_write_english_string(0,0,"FreeLink+KL27");
- DelayMs(100);
- LCD_write_english_string(0,1,"mini Board");
- DelayMs(100);
- LCD_write_english_string(0,3,"Kinetis ");
- DelayMs(100);
- LCD_write_english_string(0,4,"Development");
- DelayMs(100);
- LCD_write_english_string(0,5,"Kit ");
- }
- int main(void)
- { DelayInit();
- TestLCD_Nokia5110();
- while(1);
- }
复制代码
|