未带触摸显示屏的精英STM32F103 开发板,为试用者们带来极大发挥空间,自己正是从为其配置相应的显示器件来入手对它的体验。先是由I2C接口的OLED 屏来实现显示功能,又延伸到SPI接口的OLED 屏和TFT串口屏的显示,但总觉得不如用一个能接入板上显示接口的显示屏更为舒服。找来找去发现一个为KL43开发板所配的显示模块MDM2802这是34引脚的串口屏,其接口电路如图1所示,可通过编写驱动程序来实现显示功能。
图1 MDM2802接口电路
MDM2802显示模块与MCU的连接关系为:
LCD_CS --- PGout(12)
LCD_MOSI --- PFout(9)
LCD_MISO --- PBout(2)
LCD_CLK --- PDout(5)
LCD_BLC --- PBout(0)
LCD_RST --- RST
注:在使用时应将VSYNC引脚连线断开
配置相关引脚为输出端口的程序为:
- void GPIO_Configuration(void)
- {
- RCC->APB2ENR|=1<<4; //PORTC
- GPIOC->CRL=0X33333333; //PC0~7 OUT
- GPIOC->ODR|=0X00FF;
- RCC->APB2ENR|=1<<8; //PORTG
- GPIOG->CRH&=0X0000FFFF;//PG12 OUT
- GPIOG->CRH|=0X30000;
- GPIOG->ODR|=1<<12;
- GPIOG->CRL&=0XFFFFFFF0;//PG0
- GPIOG->CRL|=0X00000003;
- GPIOG->ODR|=1<<0;
- RCC->APB2ENR|=1<<5; //PORTD
- GPIOD->CRL&=0XF00FFFF; //PD4,5
- GPIOD->CRL|=0X00330000;
- GPIOD->ODR|=1<<5;
- RCC->APB2ENR|=1<<3; //PORTB
- GPIOB->CRL&=0XFFFFF0F0; //PB0,2
- GPIOB->CRL|=0X000000303;
- GPIOB->ODR|=1<<0;
- GPIOB->ODR|=1<<2;
- RCC->APB2ENR|=1<<7;
- GPIOF->CRH&=0X000FFF0F;
- GPIOF->CRH|=0X030;
- GPIOF->ODR|=1<<1;
- }
复制代码
显示屏的初始化函数为:
- void ili9341_init(void)
- {
- write_register(0xCF);
- write_data(0x00);
- write_data(0xC1);
- write_data(0X30);
- write_register(0xED);
- write_data(0x64);
- write_data(0x03);
- write_data(0X12);
- write_data(0X81);
- write_register(0xE8);
- write_data(0x85);
- write_data(0x10);
- write_data(0x7A);
- write_register(0xCB);
- write_data(0x39);
- write_data(0x2C);
- write_data(0x00);
- write_data(0x34);
- write_data(0x02);
- write_register(0xF7);
- write_data(0x20);
- write_register(0xEA);
- write_data(0x00);
- write_data(0x00);
- write_register(0xC0); //Power control
- write_data(0x1B); //VRH[5:0]
- write_register(0xC1); //Power control
- write_data(0x01); //SAP[2:0];BT[3:0]
- write_register(0xC5); //VCM control
- write_data(0x30); //3F
- write_data(0x30); //3C
- write_register(0xC7); //VCM control2
- write_data(0XB7);
- write_register(0x36); // Memory Access Control
- write_data(0x08);
- write_register(0x3A);
- write_data(0x55);
- write_register(0xB1);
- write_data(0x00);
- write_data(0x1A);
- write_register(0xB6); // Display Function Control
- write_data(0x0A);
- write_data(0xA2);
- write_register(0xF2); // 3Gamma Function Disable
- write_data(0x00);
- write_register(0x26); //Gamma curve selected
- write_data(0x01);
- write_register(0xE0); //Set Gamma
- write_data(0x0F);
- write_data(0x2A);
- write_data(0x28);
- write_data(0x08);
- write_data(0x0E);
- write_data(0x08);
- write_data(0x54);
- write_data(0XA9);
- write_data(0x43);
- write_data(0x0A);
- write_data(0x0F);
- write_data(0x00);
- write_data(0x00);
- write_data(0x00);
- write_data(0x00);
- write_register(0XE1); //Set Gamma
- write_data(0x00);
- write_data(0x15);
- write_data(0x17);
- write_data(0x07);
- write_data(0x11);
- write_data(0x06);
- write_data(0x2B);
- write_data(0x56);
- write_data(0x3C);
- write_data(0x05);
- write_data(0x10);
- write_data(0x0F);
- write_data(0x3F);
- write_data(0x3F);
- write_data(0x0F);
- write_register(0x2B);
- write_data(0x00);
- write_data(0x00);
- write_data(0x01);
- write_data(0x3f);
- write_register(0x2A);
- write_data(0x00);
- write_data(0x00);
- write_data(0x00);
- write_data(0xef);
- write_register(0x11); //Exit Sleep
- lcdc_delay(1000);
- write_register(0x29); //display on
- ili9341_clear(BLACK);
- MDM2802_BLC_HIGH();
- }
复制代码
为与原字符显示效果相一致,所用的为font.h中的软字库,供有12*12、16*16及24*24三种字体,其字符显示函数为:
- void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
- {
- u8 temp,t1,t;
- u16 y0=y;
- u8 csize=(size/8+((size%8)?1:0))*(size/2);
- num=num-' ';
- for(t=0;t
- {
- if(size==12) temp=asc2_1206[num][t];
- else if(size==16) temp=asc2_1608[num][t];
- else if(size==24) temp=asc2_2412[num][t];
- else return;
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80) LCD_draw_pixel(POINT_COLOR, x, y);
- else if(mode==0) LCD_draw_pixel(BACK_COLOR, x, y);
- temp<<=1;
- y++;
- if(y>=320) return;
- if((y-y0)==size)
- {
- y=y0;
- x++;
- if(x>=240) return;
- break;
- }
- }
- }
- }
复制代码
由于数值和字符串显示函数是基于字符显示函数,故其变化不大。
图2 字符串显示效果
在未使用外部存储介质的情况下,要用Image2Lcd软件将待显示的图片需将相应的位图转化数组的数据来存放,并通过如下的显示函数来再现图片。
- void showimage(unsigned int x,unsigned int y)
- {
- unsigned int i,j,k;
- k=0;
- for(i=0;i<320;i++)
- {
- set_cursor(x,y+i);
- gram_prepare();
- for(j=0;j<240;j++)
- {
- write_data(gImage_gq1[k*2]);
- write_data(gImage_gq1[k*2+1]);
- k++;
- }
- }
- }
复制代码
图3 图像文件格式转换
图4 图片显示效果
在制作图标界面时,同样可以用Image2Lcd软件来辅助处理,此外要要对图标的黑色边框进行过滤处理。当然精英开发板在进行图标界面生成时是通过读取SD卡中的图片文件来实现的。
图5 图标界面显示效果
在实现中文显示方面,由于中文字库占用的存储空间比较大,因此其中文字库是存储在W25Q128内,其接口原理图如图6所示。
图6 硬字库的存储
显示中文显示的关键函数为:
- void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
- {
- u8 temp,t,t1;
- u16 y0=y;
- u8 dzk[72];
- u8 csize=(size/8+((size%8)?1:0))*(size);
- if(size!=12&&size!=16&&size!=24)return;
- Get_HzMat(font,dzk,size);
- for(t=0;t
- {
- temp=dzk[t];
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80) LCD_draw_pixel(POINT_COLOR, x, y);
- else if(mode==0) LCD_draw_pixel(BACK_COLOR, x, y);
- temp<<=1;
- y++;
- if((y-y0)==size)
- {
- y=y0;
- x++;
- break;
- }
- }
- }
- }
复制代码
以Show_Font()函数即可显示图7所示的中英文混排显示。
图7 硬字库的使用效果
再实现了中英文显示功能后,就可以向数码相框功能进行迈进了,它主要涉及SD卡的读写、FATFS文件系统及图片文件的解码处理。
通过对以下3个函数的改造即可实现BMP、JPG及GIF三种图像文件的解码再现,其效果如图8~图10所示。
- void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
- {
- LCD_SetCursor(239-x,y);
- LCD_WriteRAM_Prepare();
- write_data(color >> 8);
- write_data(color);
- }
- void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
- {
- u16 i,j;
- u16 xlen=0;
- xlen=ex-sx+1;
- for(i=sy;i<=ey;i++)
- {
- LCD_SetCursor(sx,i);
- LCD_WriteRAM_Prepare();
- for(j=0;j
- {
- write_data(color >> 8);
- write_data(color);
- }
- }
- }
- void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
- {
- u16 height,width;
- u16 i,j;
- width=ex-sx+1;
- height=ey-sy+1;
- for(i=0;i
- {
- LCD_SetCursor(sx,sy+i);
- LCD_WriteRAM_Prepare();
- for(j=0;j
- {
- write_data(color[i*width+j] >> 8);
- write_data(color[i*width+j]);
- }
- }
- }
复制代码
图8 位图显示效果
图9 jpg文件显示效果
图10 GIF动画显示效果
由于手头的OV7670是不带数据缓冲的,所以无法与开发板的接口相匹配,摄像功能就无法测试,如果有条件还是配上摄像头和触摸屏为好,那样功能会更强,唉有钱真好! 在次感谢社区和开发板的提供者给了我们这么好的体验机会!!!
体验期间发送的帖子如下:
【精英STM32F103 开发板试用体验】+初识精英STM32F103 开发板
|
https://bbs.elecfans.com/jishu_1650741_1_1.html
【精英STM32F103 开发板试用体验】+开发环境构建
https://bbs.elecfans.com/jishu_1652502_1_1.html
【精英STM32F103开发板试用体验】+OLED屏显示功能的实现
https://bbs.elecfans.com/jishu_1653977_1_1.html
【STM32F103试用体验】温湿度检测功能的实现
https://bbs.elecfans.com/jishu_1657538_1_1.html
【精英STM32F103 开发板试用体验】+TFT液晶屏显示功能的实现
https://bbs.elecfans.com/jishu_1658312_1_1.html
【精英STM32F103 开发板试用体验】+红外遥控器编码显示
https://bbs.elecfans.com/jishu_1659309_1_1.html
【精英STM32F103 开发板试用体验】+RTC计时功能的实现
https://bbs.elecfans.com/jishu_1663130_1_1.html
【精英STM32F103 开发板试用体验】 超声波测距功能的实现
https://bbs.elecfans.com/jishu_1669853_1_1.html
|