【N32A455 车规MCU开发板测评】点亮LCD屏
[复制链接]
尽管N32A455开发板配了相应的外设资源,但是没有显示器件还是稍感不足,那就自己动手给它配上一个能显示文字信息的LCD屏吧。
为了增强十足的灵活性,就以GPIO口模拟的方式来实现。
由于该开发板没有设置Arduino接口,那就以显示屏的引脚顺序来分配GPIO引脚,见图1所示。
图1 所用接口
具体的连接关系为:
SCLK----PE2
SDIN----PE3
RST ----PE4
DC ----PE5
CS ----PE6
BLK----PC13
输出高低电平的语句定义为:
#define LCD_SCLK_Set GPIOE->PBSC = GPIO_PIN_2
#define LCD_SCLK_Clr GPIOE->PBC = GPIO_PIN_2
#define LCD_SDIN_Set GPIOE->PBSC = GPIO_PIN_3
#define LCD_SDIN_Clr GPIOE->PBC = GPIO_PIN_3
#define LCD_RST_Set GPIOE->PBSC = GPIO_PIN_4
#define LCD_RST_Clr GPIOE->PBC = GPIO_PIN_4
#define LCD_DC_Set GPIOE->PBSC = GPIO_PIN_5
#define LCD_DC_Clr GPIOE->PBC = GPIO_PIN_5
#define LCD_CS_Set GPIOE->PBSC = GPIO_PIN_6
#define LCD_CS_Clr GPIOE->PBC = GPIO_PIN_6
#define LCD_BLK_Set GPIOC->PBSC = GPIO_PIN_13
#define LCD_BLK_Clr GPIOC->PBC = GPIO_PIN_13
进行短时延时的函数为:
void Delay(uint32_t count)
{
for (; count > 0; count--);
}
模拟SPI方式发送字节数据的函数为:
static void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i;
LCD_CS_Clr;
if (command == 0)
LCD_DC_Clr;
else
LCD_DC_Set;
for(i=0;i<8;i++)
{
if(dat&0x80)
LCD_SDIN_Set;
else
LCD_SDIN_Clr;
LCD_SCLK_Clr;
dat<<=1;
LCD_SCLK_Set;
}
LCD_CS_Set;
}
对所用引脚的配置函数为:
void lCD_config(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
GPIO_InitStructure.Pin=GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_13;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
}
该显示屏的初始化函数为:
static void LCD_init(void)
{
LCD_RST_Clr;
Delay(1);
LCD_RST_Set;
LCD_CS_Clr;
Delay(1);
LCD_CS_Set;
Delay(1);
LCD_write_byte(0x21, 0);
LCD_write_byte(0xc8, 0);
LCD_write_byte(0x06, 0);
LCD_write_byte(0x13, 0);
LCD_write_byte(0x20, 0);
LCD_clear();
LCD_write_byte(0x0c, 0);
LCD_CS_Clr;
LCD_BLK_Set;
}
该显示屏的清屏函数为:
static void LCD_clear(void)
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
实现字符串显示的函数为:
static void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
实现显示测试的主程序为:
int main(void)
{
lCD_config();
LCD_init();
LCD_clear();
LCD_write_english_string(16,0,"N32A455");
LCD_write_english_string(16,2,"NOKIA_5110");
LCD_write_english_string(16,4,"2025-1-22");
while (1);
}
经程序的编译与下载,其显示效果如图2所示,说明显示正常。
图2 显示效果
|