本帖最后由 eltonchang2001 于 2022-11-9 11:53 编辑
#申请原创#
MDM-2802显示屏是一款以前用于Freescale产品的显示器件,其几何尺寸为2.8寸,分辨率为240*320,它的外观如图1所示。 别看该显示屏的引脚比较多,它其实是一款以SPI方式工作的器件,其主控芯片为ILI9341。 图1 MDM-2802显示屏 该显示屏的引脚分布如图2所示,其实就使用情况来看它更近于是一个I2C接口的显示屏。 图2 引脚分配 为使用HT32F54253开发板来驱动该显示屏,其引脚连接关系为: SCLK --- PA0 MISO--- PA1 CS --- PC2 RST --- NRST BLC --- 3.3V VDD---3.3V GND---GND 图3 引脚连接 为便于高低电平的输出,其语句定义如下: #define CLR_CLK() GPIO_ClearOutBits(HT_GPIOA, GPIO_PIN_0) #define SET_CLK() GPIO_SetOutBits(HT_GPIOA, GPIO_PIN_0) //CLK #define CLR_SDA() GPIO_ClearOutBits(HT_GPIOA, GPIO_PIN_1) #define SET_SDA() GPIO_SetOutBits(HT_GPIOA, GPIO_PIN_1) //DIN #define CLR_CS() GPIO_ClearOutBits(HT_GPIOC, GPIO_PIN_2) #define SET_CS() GPIO_SetOutBits(HT_GPIOC, GPIO_PIN_2) //CS 对使用引脚的功能配置函数为: void app_tft_init(void)
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
CKCUClock.Bit.AFIO = 1;
CKCUClock.Bit.PA = 1;
CKCUClock.Bit.PC = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
AFIO_GPxConfig(GPIO_PA, AFIO_PIN_0, AFIO_FUN_GPIO);
AFIO_GPxConfig(GPIO_PA, AFIO_PIN_1, AFIO_FUN_GPIO);
AFIO_GPxConfig(GPIO_PC, AFIO_PIN_2, AFIO_FUN_GPIO);
GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_0, GPIO_PR_DOWN);
GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_1, GPIO_PR_DOWN);
GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_2, GPIO_PR_DOWN);
GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_0, RESET);
GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_1, RESET);
GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_2, RESET);
GPIO_DirectionConfig(HT_GPIOA, GPIO_PIN_0, GPIO_DIR_OUT);
GPIO_DirectionConfig(HT_GPIOA, GPIO_PIN_1, GPIO_DIR_OUT);
GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_2, GPIO_DIR_OUT);
}
该显示屏的初始化函数为: void ili9341_init(void)
{
write_register(0xCF);
write_data(0x00);
write_data(0xC1);
write_data(0X30);
write_register(0xED);
... ...
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0xef);
write_register(0x11);
lcdc_delay(1000);
write_register(0x29);
}
实现图片显示的函数为: void showimage(void)
{
int i,j;
set_cursor(10,30);
gram_prepare();
for(j=0;j<50;j++)
{
set_cursor(10,30+j);
gram_prepare();
for(i=0;i<50;i++)
{
write_data(gImage_tb[(j*50+i)*2]);
write_data(gImage_tb[(j*50+i)*2+1]);
}
}
}
字符串显示的函数为: void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
{
while(*p!='\0')
{
if(x>LCD_W-16)
实现图4所示效果的主程序为:int main(void)
{
GPIO_Configuration();
GPIO_SetOutBits(HT_GPIOC, GPIO_PIN_5);
app_tft_init();
ili9341_init();
ili9341_clear(RED);
LCD_DrawLine(WHITE ,0, 26, 239, 26);
LCD_DrawLine(WHITE,0, 296, 239, 296);
LCD_DrawRectangle(BLUE,40, 140, 160, 260);
Draw_Circle(GREEN,100,200,60);
showimage();
BACK_COLOR=RED;
POINT_COLOR=YELLOW;
LCD_ShowString(40,10,"MDM-2802 & HT32F54253");
LCD_ShowString(60,300,"BY: jinglixixi");
while (1);
}
图4 显示效果
在与A/D数模转换相配合的情况下,可实现检测数据的波形显示,其主程序为: int main(void)
{
int u;
int x,y,yp;
RETARGET_Configuration();
ADC_Configuration();
ADC_Cmd(HTCFG_ADC_PORT, ENABLE);
ADC_SoftwareStartConvCmd(HTCFG_ADC_PORT, ENABLE);
app_tft_init();
ili9341_init();
ili9341_clear(RED);
LCD_DrawLine(WHITE ,0, 26, 239, 26);
LCD_DrawLine(WHITE,0, 296, 239, 296);
BACK_COLOR=RED;
POINT_COLOR=YELLOW;
LCD_ShowString(40,10,"MDM-2802 & HT32F54253");
LCD_ShowString(6,40,"ADC: ");
LCD_ShowString(6,60,"U=");
LCD_ShowString(60,300,"BY: jinglixixi");
x=20;
y=260;
LCD_DrawLine(WHITE,20, 260, 20, 80);
LCD_DrawLine(WHITE,20, 260, 220, 260);
GUI_DispChar('.', 60, 60);
while (1)
{
if (gADC_SingleEndOfConversion)
{
u=gPotentiometerLevel;
GUI_DispChar('0'+u/1000, 40, 40);
GUI_DispChar('0'+u%1000/100, 50, 40);
GUI_DispChar('0'+u%100/10, 60, 40);
GUI_DispChar('0'+u%10, 70, 40);
u=3.3*u/4.095;
GUI_DispChar('0'+u/1000, 50, 60);
GUI_DispChar('0'+u%1000/100, 70, 60);
yp=260-u/30;
LCD_DrawLine(WHITE ,x, y, x+4, yp);
y=yp;
x=x+4;
if(x>210)
{
x=20;
y=260;
ili9341_clear(RED);
}
}
}
}
图5 波形显示
图6 电位器调节效果
|