本帖最后由 jinglixixi 于 2024-12-5 00:01 编辑
在AT-START-L021开发板上配有ArduinoTM Uno R3扩展接口,合理地所用它可起到事半功倍的效果。这里以一款SPI接口的显示屏为例加以驱动测试,该显示屏早期曾用在诺基亚手机上,为Nokia5110。为了借用图1所示的扩展接口而免去接线的问题,故显示屏与开发板的连接关系为: SCL---PB7 SDA---PA15 RST---PA6 DC ---PA7 CS ---PA5 BLK---PA9
图1 所用接口
所用引脚输出高低电平的语句定义为: #define LCD_SCLK_Set gpio_bits_write(GPIOB,GPIO_PINS_7,TRUE) //CLK #define LCD_SCLK_Clr gpio_bits_write(GPIOB,GPIO_PINS_7,FALSE)
#define LCD_SDIN_Set gpio_bits_write(GPIOA,GPIO_PINS_15,TRUE) //DIN #define LCD_SDIN_Clr gpio_bits_write(GPIOA,GPIO_PINS_15,FALSE)
#define LCD_RST_Set gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE) //RES #define LCD_RST_Clr gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)
#define LCD_DC_Set gpio_bits_write(GPIOA,GPIO_PINS_7,TRUE) //DC #define LCD_DC_Clr gpio_bits_write(GPIOA,GPIO_PINS_7,FALSE)
#define LCD_CS_Set gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE) //CS #define LCD_CS_Clr gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)
#define LCD_BLK_Set gpio_bits_write(GPIOA,GPIO_PINS_9,TRUE) //BLK #define LCD_BLK_Clr gpio_bits_write(GPIOA,GPIO_PINS_9,FALSE)
配置所用引脚为输出功能的函数为: void LCD_config(void)
{
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_9|GPIO_PINS_15;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_init_struct.gpio_pins = GPIO_PINS_7;
gpio_init(GPIOB, &gpio_init_struct);
}
该显示屏的初始化函数为: void LCD_init(void)
{
LCD_RST_Clr;
delay_us(1);
LCD_RST_Set;
LCD_CS_Clr;
delay_us(1);
LCD_CS_Set;
delay_us(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;
}
实现清屏处理的函数为: 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);
}
实现字符显示功能的函数为: void LCD_write_char(unsigned char c)
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[c][line], 1);
}
实现字符串显示功能的函数为: 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)
{
system_clock_config();
at32_board_init();
LCD_config();
LCD_init();
LCD_clear();
LCD_write_english_string(16,0,"AT32L021");
LCD_write_english_string(16,2,"Nokia_5110");
LCD_write_english_string(16,4,"jingliixi");
while(1)
{
at32_led_toggle(LED2);
delay_ms(200);
}
}
经程序的编译与下载,其显示效果如图2所示。 图2 显示效果
|