本帖最后由 sujingliang 于 2024-12-2 20:12 编辑
AT-START-L021有39个GPIO,GPIOA和GPIOB都有完整的16pin引脚。引脚充沛到足够驱动16位并口屏。
1、接线
驱动16位并口屏程序上其实比8位并口屏更简单,但是接线真是复杂:
2、引脚定义
#define LCD_CS GPIOA,GPIO_PINS_6 //PA6
#define LCD_RS GPIOA,GPIO_PINS_10 //PA10
#define LCD_WR GPIOA,GPIO_PINS_4 //PA4
#define LCD_RD GPIOA,GPIO_PINS_1 //PA1
#define LCD_RST GPIOA,GPIO_PINS_8 //PA8
#define LCD_LED GPIOA,GPIO_PINS_11 //PA11
3、GPIO初始化
static void lcd_gpio_init(void)
{
gpio_init_type gpio_init_struct;
/* enable the led clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
/* set default parameter */
gpio_default_para_init(&gpio_init_struct);
/* configure the lcd GPIOA gpio */
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_8|GPIO_PINS_10|GPIO_PINS_9|GPIO_PINS_15|GPIO_PINS_7|GPIO_PINS_6|GPIO_PINS_5;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
/* configure the lcd GPIOB gpio */
gpio_init_struct.gpio_pins = GPIO_PINS_10|GPIO_PINS_4|GPIO_PINS_3|GPIO_PINS_5|GPIO_PINS_7|GPIO_PINS_9|GPIO_PINS_8;
gpio_init(GPIOB, &gpio_init_struct);
}
GPIOA的引脚用于控制,GPIOB0-15做为并口总线。
4、GPIOB写16位数据
void gpio_lcd_write_data_word(uint16_t* data, size_t length) {
for (size_t i = 0; i < length; i++) {
GPIOB->odt = data[i];
LCD_WR_CLR;
LCD_WR_SET;
}
}
5、LCD写命令
void lcd_write_comm_word(uint16_t cmd)
{
uint16_t c;
c=0x00FF&cmd;
LCD_CS_CLR;
LCD_RS_CLR;
gpio_lcd_write_data_word(&c, 1);
LCD_CS_SET;
}
6、LCD写数据
void lcd_write_data_word(uint16_t dat)
{
uint16_t *d=&dat;
LCD_CS_CLR;
LCD_RS_SET;
gpio_lcd_write_data_word(d, 1);
LCD_CS_SET;
}
7、写寄存器
void lcd_write_register_word(uint16_t addr, uint16_t data)
{
lcd_write_comm_word(addr);
lcd_write_data_word(data);
}
8、16位并口屏显示效果
可以看出16位(PIN顺序排列)驱动比8位(PIN混乱排列)显示效果有质得飞跃,显示汉字基本没有闪烁。
9、ADC曲线绘制
void test_run(void)
{
int i;
uint8_t buff[10];
double v;
if(vmor_flag_index == 1)
{
vmor_flag_index = 0;
v=adc1_ordinary_valuetab[0]*3.3/4096;
sprintf((char*)buff,"%0.2f",v);
inputData=176-adc1_ordinary_valuetab[0]*176/4096;
}
adc_ordinary_software_trigger_enable(ADC1, TRUE);
for(i=0;i<43;i++)
{
setColor(0X0000);
drawLine(5*i,canvas[i],5*i+5,canvas[i+1]);
if(i<42){
setColor(0XFB80);
drawLine(5*i,canvas[i+1],5*i+5,canvas[i+2]);
}
canvas[i]=canvas[i+1];
}
canvas[43]=inputData;
gridding();
GUI_WriteASCII(154,2,(unsigned char*)buff,0XA7F9,0X13A6);
delay_ms(50);
}
画方格图
void gridding(void)
{
uint8_t i,j;
setColor(0X5345);
setBgColor(0x0000);
for(i=0;i<8;i++)
{
if(i!=1)
drawHLine_step(0,i*22,220,2);
else drawHLine_step(0,i*22,150,2);
}
drawHLine_step(0,175,220,2);
for(j=0;j<13;j++)
{
if(j!=8&&j!=9&&j!=10)
drawVLine_step(j*20,0,176,2);
else
drawVLine_step(j*20,25,176,2);
}
drawVLine_step(219,0,176,2);
}
void drawHLine_step(unsigned char x, unsigned char y, unsigned char l,uint8_t step)
{
setXY(x, y, x+l, y);
for(int i=0; i<l+1; i++)
{
if(i%step==0)
lcd_write_data_word(fcolor);
else
lcd_write_data_word(bcolor);
}
clrXY();
}
8位屏用得比较方便,上面是8位屏显示效果。
test1.rar
(122.36 KB)
|