为了对得起AT32F403A那丰富的存储资源,这次为它配上一个2.2'彩色TFT屏,该显示屏采用SPI接口,故将I2C接口和SPI接口联合起来驱动它。
图1 接口资源
相关引脚输出高低电平的引脚定义为:
#define LCD_CS_High() GPIO_SetBits(GPIOB, GPIO_Pins_13)
#define LCD_CS_Low() GPIO_ResetBits(GPIOB, GPIO_Pins_13) //CS
#define LCD_REST_High() GPIO_SetBits(GPIOB, GPIO_Pins_11)
#define LCD_REST_Low() GPIO_ResetBits(GPIOB, GPIO_Pins_11) //RES
#define LCD_DC_High() GPIO_SetBits(GPIOB, GPIO_Pins_12)
#define LCD_DC_Low() GPIO_ResetBits(GPIOB, GPIO_Pins_12) //DC
#define LCD_SDI_High() GPIO_SetBits(GPIOB, GPIO_Pins_9)
#define LCD_SDI_Low() GPIO_ResetBits(GPIOB, GPIO_Pins_9)//SDI
#define LCD_SCK_High() GPIO_SetBits(GPIOB, GPIO_Pins_8)
#define LCD_SCK_Low() GPIO_ResetBits(GPIOB, GPIO_Pins_8)//SCK
#define LCD_LED_High() GPIO_SetBits(GPIOB, GPIO_Pins_14)
#define LCD_LED_Low() GPIO_ResetBits(GPIOB, GPIO_Pins_14) //BLK
由于与前面介绍的彩色OLED屏所用的引脚位置一致,一个奇异的现象出现了,在等待程序下载的显示屏竟显示出了内容,见图2~图4所示。
OLED屏的程序竟能驱动TFT屏,而且图像完整,只不过显示的内容是镜像的,且颜色互补。
是不是很神奇!
图2 显示字符串
图3 显示汉字
图4 显示图标
图5 原OLED屏显示效果
在更新程序后,使用红色进行清屏后的效果如图6所示。
图6 红色清屏效果
该2.2寸TFT彩屏的初始化函数为:
void tft_Init(void)
{
LCD_REST_Low(); //Lcd_Reset()
Delay_ms(20); //delay_ms(20);
LCD_REST_High();
Delay_ms(20);
LCD_CS_Low();
LCD_WR_REG(0xCB); //Lcd_WriteIndex(0xCB);
LCD_WR_DATA8(0x39);//Lcd_WriteData(0x39);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x34);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0xCF);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0XC1);
LCD_WR_DATA8(0X30);
LCD_WR_REG(0xE8);
LCD_WR_DATA8(0x85);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0xEA);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xED);
LCD_WR_DATA8(0x64);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0X12);
LCD_WR_DATA8(0X81);
LCD_WR_REG(0xF7);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC0); //Power control
LCD_WR_DATA8(0x23); //VRH[5:0]
LCD_WR_REG(0xC1); //Power control
LCD_WR_DATA8(0x10); //SAP[2:0];BT[3:0]
LCD_WR_REG(0xC5); //VCM control
LCD_WR_DATA8(0x3e); //?????
LCD_WR_DATA8(0x28);
LCD_WR_REG(0xC7); //VCM control2
LCD_WR_DATA8(0x86);
LCD_WR_REG(0x36); // Memory Access Control
LCD_WR_DATA8(0x48);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x55);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x18);
LCD_WR_REG(0xB6); // Display Function Control
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x82);
LCD_WR_DATA8(0x27);
LCD_WR_REG(0xF2); // 3Gamma Function Disable
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x26); //Gamma curve selected
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xE0); //Set Gamma
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x4E);
LCD_WR_DATA8(0xF1);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0XE1); //Set Gamma
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0xC1);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0x11); //Exit Sleep
Delay_ms(120);
LCD_WR_REG(0x29); //Display on
LCD_WR_REG(0x2c);
}
它的色彩清屏函数为:
void LCD_Clear(unsigned int Color)
{
char VH,VL;// LCD_W= 240 LCD_H =320
unsigned int i,j;
VH=Color>>8;
VL=Color;
Address_set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA8(VH);
LCD_WR_DATA8(VL);
}
}
}
在制备了图标文件后,所制作的界面效果如图7所示。
图7 图标化操作界面
在利用板上按键的情况下,可控制功能的选择处理。按键的原理图见图8所示,
读取引脚的语句为:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pins_0);
GPIO_ReadInputDataBit(GPIOC, GPIO_Pins_13);
图8 按键原理图
本帖最后由 jinglixixi 于 2020-10-14 20:42 编辑用心了老铁,整体过程分享出来,非常好,支持继续分享测评!!!
引用: w494143467 发表于 2020-10-15 09:52 用心了老铁,整体过程分享出来,非常好,支持继续分享测评!!!
感谢支持,
引用: lhw1537 发表于 2020-11-18 17:00 非常不错!
引用: freebsder 发表于 2020-11-18 18:09 那一堆寄存器配置很恶心。
你说的是初始化?你不用自然没意义!