- 2025-03-29
-
回复了主题帖:
测评颁奖: NXP 边缘AI FRDM-MCXN947开发板(含NXP官方福利礼品)
已确认地址无误
- 2025-03-27
-
回复了主题帖:
【MIKROE TFT-PROTO Board测评】关于触摸功能的实现分析
秦天qintian0303 发表于 2025-3-27 13:50
那也比不上电容屏吧
只是电容屏要稍贵些
- 2025-03-26
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】关于触摸功能的实现分析
本帖最后由 jennyzhaojie 于 2025-3-26 23:51 编辑
MIKROE TFT-PROTO Board包含一个2.83英寸的TFT彩色显示屏MI0283QT-9A分辨率为320x240像素,由ILI9341显示控制器驱动,能够显示高级图形内容。每个像素可以显示22K种不同的颜色。TFT显示屏上覆盖了一个电阻式触摸面板,可以作为输入设备使用。为了进一步连接,有一个2X20的头。经过测试和构建最终程序后,这个电路板也可以用于您的最终设备。电路板还包含安装孔,以便更容易地集成到您的设计。
那么它是否具有直接可用得触摸功能呢?
图1是一种常规的触摸屏所配置触摸电路,其触摸功能是通过触摸控制芯片XPT2046来完成的。
图1 触摸控制电路
图2是MIKROE TFT-PROTO Board的应用电路,由此可知它只配置了电阻式触摸面板,而没有配置触摸控制芯片XPT2046,也就是说不经外部的扩展它是无法直接实现触摸控制的。
图2 应用电路
- 2025-03-24
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】显示功能多方位测试
本帖最后由 jennyzhaojie 于 2025-3-25 11:03 编辑
在完成对MIKROE TFT-PROTO Board的显示驱动后,为其扩展丰富的显示功能是十分必要的。
为此,对其添加了标准的测试界面,并对扩展的功能进行了相应的测试。
图1是为其配置的标准测试界面,其实现的程序内容为:
void main_test(void)
{
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 1: MIKROE TFT-PROTO");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
Delay(0x28FFFF);
Delay(0x28FFFF);
}
图1 测试界面
为评判色彩表现力,其测试如图2所示,其测试程序为:
void Test_Color(void)
{
LCD_Fill(0,0,239,319,WHITE);
POINT_COLOR=YELLOW;
BACK_COLOR=BLUE;
LCD_ShowString(20,30,"BL Test");
Delay(0xFFFFFF);
LCD_Fill(0,0,239,319,RED);
LCD_ShowString(20,30,"RED");
Delay(0xFFFFFF);
LCD_Fill(0,0,239,319,GREEN);
LCD_ShowString(20,30,"GREEN");
Delay(0xFFFFFF);
LCD_Fill(0,0,239,319,BLUE);
POINT_COLOR=YELLOW;
BACK_COLOR=RED;
LCD_ShowString(20,30,"BLUE");
Delay(0xFFFFFF);
}
图2 背景测试
此外,还对图形的表现力进行了测试,主要包括矩形,圆形及三角形。
对矩形的测试如图3所示,其实现的程序为:
void Test_FillRec(void)
{
u8 i=0;
u16 ColorTab[5]={RED,GREEN,BLUE,YELLOW,BRED};
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 2: GUI Rectangle");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
LCD_Fill(0,20,239,319-20,WHITE);
for (i=0; i<5; i++)
{
POINT_COLOR=ColorTab[i];
LCD_DrawRectangle(239/2-80+(i*15),319/2-80+(i*15),239/2-80+(i*15)+60,319/2-80+(i*15)+60);
}
Delay(0xFFFFFF);
LCD_Fill(0,20,239,319-20,WHITE);
for (i=0; i<5; i++)
{
POINT_COLOR=ColorTab[i];
LCD_DrawFillRectangle(239/2-80+(i*15),319/2-80+(i*15),239/2-80+(i*15)+60,319/2-80+(i*15)+60);
}
Delay(0xFFFFFF);
}
图3 矩形测试
对圆形的测试如图4所示,其实现的程序为:
void Test_Circle(void)
{
u8 i=0;
u16 ColorTab[5]={RED,GREEN,BLUE,YELLOW,BRED};
u16 width=239,height=319;
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 3: GUI Circle");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
LCD_Fill(0,20,width,height-20,WHITE);
for (i=0; i<5; i++)
{
POINT_COLOR=ColorTab[i];
Draw_Circle(width/2-80+(i*25),height/2-50+(i*25),30);
}
Delay(0xFFFFFF);
LCD_Fill(0,20,width,height-20,WHITE);
for (i=0; i<5; i++)
{
gui_circle(width/2-80+(i*25),height/2-50+(i*25),ColorTab[i],30,1);
}
Delay(0xFFFFFF);
}
图4 圆形测试
对三角形的测试如图5所示,其实现的程序为:
void Test_Triangle(void)
{
u8 i=0;
u16 ColorTab[5]={RED,GREEN,BLUE,YELLOW,BRED};
u16 width=239,height=319;
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 3: GUI Triangle̮");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
LCD_Fill(0,20,width,height-20,WHITE);
for(i=0;i<5;i++)
{
POINT_COLOR=ColorTab[i];
Draw_Triangel(width/2-80+(i*20),height/2-20+(i*15),width/2-50-1+(i*20),height/2-20-52-1+(i*15),width/2-20-1+(i*20),height/2-20+(i*15));
}
Delay(0xFFFFFF);
LCD_Fill(0,20,width,height-20,WHITE);
for(i=0;i<5;i++)
{
POINT_COLOR=ColorTab[i];
Fill_Triangel(width/2-80+(i*20),height/2-20+(i*15),width/2-50-1+(i*20),height/2-20-52-1+(i*15),width/2-20-1+(i*20),height/2-20+(i*15));
}
Delay(0xFFFFFF);
}
图5 三角形测试
对字符串显示的测试如图6所示,其实现的程序为:
void English_Font_test(void)
{
u16 width=239,height=319;
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 4: English_Font̮");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
LCD_Fill(0,20,width,height-20,WHITE);
POINT_COLOR=BLUE;
BACK_COLOR=WHITE;
LCD_ShowString(10,30,"8X16:abcdefghijklmnopqrstuvw");
LCD_ShowString(10,45,"8X16:xyz0123456789̮");
LCD_ShowString(10,60,"8X16:ABCDEFGHIJKLMNOPQRSTUVW");
LCD_ShowString(10,75,"8X16:XYZ0123456789̮");
LCD_ShowString(10,90,"8X16:~!@#$%^&*()_+{}:<>?/|-+.̮");
Delay(0xFFFFFF);
}
图6 字符串显示测试
对中文的显示测试如图7所示,其实现的程序为:
void Chinese_Font_test(void)
{
u16 width=239,height=319;
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 5: Chinese_Font̮");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
LCD_Fill(0,20,width,height-20,WHITE);
POINT_COLOR=BLUE;
BACK_COLOR=WHITE;
showhanzi(10,30,0);
Delay(0xFFFFFF);
}
图7 中文显示测试
对图标的测试如图8所示,其实现的程序为:
void Pic_test(void)
{
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 6: Pic_test ");
LCD_Fill(0,20,width,height-20,WHITE);
TB1(30,30);
}
图8 图标显示测试
触摸校正的界面如图9所示,其实现界面效果的程序为:
void TP_Adjust(void)
{
u16 pos_temp[4][2];
u8 cnt=0;
u16 d1,d2;
u32 tem1,tem2;
float fac;
u16 outtime=0;
cnt=0;
ili9341_clear(WHITE);
POINT_COLOR=BLACK;
LCD_ShowString(10,40,"Please use the stylus click");
LCD_ShowString(10,56,"the cross on the screen.");
LCD_ShowString(10,72,"The cross will always move");
LCD_ShowString(10,88,"until the screen adjustment");
LCD_ShowString(10,104,"is completed.");
TP_Drow_Touch_Point(20,20,RED);
...
}
图9 触摸校正界面
进行触摸绘制的界面如图10所示,其实现程序为:
void Touch_Test(void)
{
u8 key;
u16 i=0;
u16 j=0;
u16 colorTemp=0;
LCD_Fill(0,0,239,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 8: Touch RST ");
LCD_Fill(0,300,239,319,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
POINT_COLOR=RED;
LCD_Fill(140-52,2,140-50+20,18,RED);
...
}
图10 触摸绘制界面
实现屏幕旋转的界面如图11和图12所示,其程序为:
void Rotate_Test(void)
{
u8 i=0;
u8 *Direction[4]={"Rotation:0","Rotation:90","Rotation:180","Rotation:270"};
LCD_Fill(0,20,width,height-20,WHITE);
LCD_Fill(0,0,width,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 7: Rotate_Test");
LCD_Fill(0,height-20,width,height,BLUE);
LCD_ShowString(20,300,"by: jennyzhaojie");
for(i=0;i<4;i++)
{
LCD_direction(i);
Gui_Drawbmp16(30,50,gImage_qq);
LCD_Fill(0,0,width,20,BLUE);
POINT_COLOR=WHITE;
BACK_COLOR=BLUE;
LCD_ShowString(20,2,"TEST 7: Rotate_Test̮");
LCD_Fill(0,height-20,width,height,BLUE);
LCD_ShowString(20,height-20,"by: jennyzhaojie");
POINT_COLOR=BLUE;
BACK_COLOR=WHITE;
LCD_ShowString(20,30,Direction[i]);
while(GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_6)==1);
LCD_Fill(0,0,width,height,WHITE);
}
LCD_direction(0);
}
图11 屏幕旋转效果1
图12 屏幕旋转效果2
- 2025-02-19
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】 动态波形绘制篇
除了使用显示屏显示各种数据和信息,还可以使用它的图形绘制功能来实现采集数据的波形绘制。
借助N32A455开发板的A/D数据采集功能,,将它与显示屏相结合即可实现动态波形的绘制。
利用板载的电位器,可提供测试的模拟信号,其所连接的引脚为PB15,见图1所示。
图1 测试资源
进行ADC初始化的函数为:
void ADC_Initial(ADC_Module* ADCx)
{
ADC_InitStructure.WorkMode = ADC_WORKMODE_INDEPENDENT;
ADC_InitStructure.MultiChEn = DISABLE;
ADC_InitStructure.ContinueConvEn = DISABLE;
ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE;
ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R;
ADC_InitStructure.ChsNumber = 1;
ADC_Init(ADCx, &ADC_InitStructure);
ADC_Enable(ADCx, ENABLE);
while(ADC_GetFlagStatusNew(ADCx,ADC_FLAG_RDY) == RESET);
ADC_StartCalibration(ADCx);
while (ADC_GetCalibrationStatus(ADCx));
}
读去检测值的函数为:
uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel)
{
uint16_t dat;
ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_239CYCLES5);
ADC_EnableSoftwareStartConv(ADCx, ENABLE);
while(ADC_GetFlagStatus(ADCx, ADC_FLAG_ENDC)==0);
ADC_ClearFlag(ADCx, ADC_FLAG_ENDC);
ADC_ClearFlag(ADCx, ADC_FLAG_STR);
dat=ADC_GetDat(ADCx);
return dat;
}
实现直线绘制的函数为:
void LCD_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
{
unsigned int t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1;
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0) incx=1;
else if(delta_x==0) incx=0;
else
{
incx=-1;
delta_x=-delta_x;
}
if(delta_y>0) incy=1;
else if(delta_y==0) incy=0;
else
{
incy=-1;
delta_y=-delta_y;
}
if( delta_x>delta_y) distance=delta_x;
else distance=delta_y;
for(t=0;t<=distance+1;t++ )
{
ili9341_draw_pixel(POINT_COLOR, uRow, uCol);
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
实现字符转向显示的函数为:
void LCD_ShowCharh(unsigned int x,unsigned int y,char num,char mode)
{
char temp;
char pos,t;
unsigned int y0=y;
num=num-' ';
Address_set(x,y,x+8-1,y+16-1);
if(!mode)
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01) ili9341_draw_pixel(RED, x, y);
else
ili9341_draw_pixel(WHITE, x, y);
temp>>=1;
y++;
}
y=y0;
x--;
}
}
else
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01) ili9341_draw_pixel(RED,x+pos, y-t);
temp>>=1;
}
}
}
}
对ADC1通道6采集数据并绘制波形曲线的主程序为:
int main(void)
{
uint16_t u;
uint16_t sj,sp,k;
uint8_t i=0;
LCD_config();
RCC_Configuration();
GPIO_Configuration();
ADC_Initial(ADC1);
TFT_Init();
LCD_Clear(WHITE);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_DrawLine(10, 10, 10, 310);
LCD_DrawLine(10, 10, 230, 10);
sp=0;
i=1;
while (1)
{
ADC1ConvertedValue[0]=ADC_GetData(ADC1,ADC1_Channel_06_PC0);
V=ADC1ConvertedValue[0];
LCD_ShowNumh(200,268,V,4);
V=V*3300/4096;
LCD_ShowNumh(180,268,V,4);
if((V<3300)&&(V>0))
{
sj=V/16;
}
else
{
sj=200;
}
POINT_COLOR=BLUE;
LCD_DrawLine(10+sp, 10+4*(i-1), 10+sj, 10+4*(i));
POINT_COLOR=RED;
sp=sj;
i=i+1;
if(i>74)
{
ili9341_clear(WHITE);
sp=0;
i=1;
LCD_ShowStringh(200,230,"Ch6:");
LCD_ShowStringh(180,230,"Ch6: mV");
LCD_DrawLine(10, 10, 10, 310);
LCD_DrawLine(10, 10, 230, 10);
}
Delay(0X8FFFFF);
}
}
经程序的编译与下载,将电位器输出引脚PB15与读取引脚PC0相连即可产生模拟信号的变化,其测试效果如图2至图4所示。
图2 数据显示
图3 波形绘制(稳定电压)
图4 波形绘制(电位上升)
- 2025-02-14
-
回复了主题帖:
【MIKROE TFT-PROTO Board测评】电子时钟计时篇
okhxyyo 发表于 2025-2-13 15:28
不错不错。谢谢分享~~这个是不是有模板啊。好像看另外一个网友也分享过差不多的,
哈哈,那应该是在新年花灯中。
- 2025-02-13
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】电子时钟计时篇
在实现了屏幕的显示功能后,还用它来干些什么呢?
可借助N32A455开发板的RTC计时功能与显示屏相结合来制作一个电子时钟,其实现的程序如下。
RTC配置函数为:
void RTC_PrescalerConfig(void)
{
RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
RTC_InitStructure.RTC_HourFormat = RTC_24HOUR_FORMAT;
if (RTC_Init(&RTC_InitStructure) == ERROR)
{
log_info("\r\n //******* RTC Prescaler Config failed **********// \r\n");
}
}
相应的时间设置函数为:
ErrorStatus RTC_TimeRegulate(void)
{
uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;
log_info("\n\r //==============Time Settings=================// \n\r");
RTC_TimeStructure.H12 = RTC_TimeDefault.H12;
log_info("\n\r Please Set Hours \n\r");
tmp_hh = RTC_TimeDefault.Hours;
if (tmp_hh == 0xff)
{
return ERROR;
}
else
{
RTC_TimeStructure.Hours = tmp_hh;
}
log_info(": %0.2d\n\r", tmp_hh);
log_info("\n\r Please Set Minutes \n\r");
tmp_mm = RTC_TimeDefault.Minutes;
if (tmp_mm == 0xff)
{
return ERROR;
}
else
{
RTC_TimeStructure.Minutes = tmp_mm;
}
log_info(": %0.2d\n\r", tmp_mm);
log_info("\n\r Please Set Seconds \n\r");
tmp_ss = RTC_TimeDefault.Seconds;
if (tmp_ss == 0xff)
{
return ERROR;
}
else
{
RTC_TimeStructure.Seconds = tmp_ss;
}
log_info(": %0.2d\n\r", tmp_ss);
if (RTC_ConfigTime(RTC_FORMAT_BIN, &RTC_TimeStructure) == ERROR)
{
log_info("\n\r>> !! RTC Set Time failed. !! <<\n\r");
return ERROR;
}
else
{
log_info("\n\r>> !! RTC Set Time success. !! <<\n\r");
RTC_TimeShow();
return SUCCESS;
}
}
以秒中断来唤醒时间显示的函数为:
void EXTI_PA7_Configuration(void)
{
GPIO_InitType GPIO_InitStructure;
EXTI_InitType EXTI_InitStructure;
NVIC_InitType NVIC_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_AFIO, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
GPIO_ConfigEXTILine(GPIOA_PORT_SOURCE, GPIO_PIN_SOURCE7);
EXTI_InitStructure.EXTI_Line = EXTI_LINE7;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitPeripheral(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x05;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断处理函数的内容为:
void EXTI9_5_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_LINE7) != RESET)
{
RTC_DateShow();
RTC_TimeShow();
EXTI_ClrITPendBit(EXTI_LINE7);
}
}
实现时钟显示效果的函数为:
void RTC_TimeShow(void)
{
RTC_GetTime(RTC_FORMAT_BIN, &RTC_TimeStructure);
(void)RTC->DATE;
LCD_ShowNum(16,46,RTC_TimeStructure.Hours,2);
LCD_ShowChar(32,46,':',0);
LCD_ShowNum(40,46,RTC_TimeStructure.Minutes,2);
LCD_ShowChar(56,46,':',0);
LCD_ShowNum(64,46,RTC_TimeStructure.Seconds,2);
}
实现电子时钟计时效果的主程序为:
int main(void)
{
LCD_config();
LCD_init();
showimage(0,0);
POINT_COLOR=RED;
BACK_COLOR=WHITE;
LCD_ShowString(16,20,"2025-2-2");
LCD_ShowString(16,46," : :");
log_init();
log_info("RTC Init");
RTC_DateAndTimeDefaultVale();
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR | RCC_APB1_PERIPH_BKP, ENABLE);
PWR_BackupAccessEnable(ENABLE);
if (USER_WRITE_BKP_DAT1_DATA != BKP_ReadBkpData(BKP_DAT1) )
{
if(SUCCESS==RTC_CLKSourceConfig(RTC_CLK_SRC_TYPE_LSE, true, false))
{
RTC_PrescalerConfig();
log_info("\r\n RTC configured....");
RTC_DateRegulate();
RTC_TimeRegulate();
BKP_WriteBkpData(BKP_DAT1, USER_WRITE_BKP_DAT1_DATA);
log_info("\r\n RTC Init Success\r\n");
}
else
{
log_info("\r\n RTC Init Faile\r\n");
}
}
EXTI_PA7_Configuration();
EXTI_ClrITPendBit(EXTI_LINE7);
RTC_ConfigCalibOutput(RTC_CALIB_OUTPUT_1HZ);
RTC_ConfigOutputType(RTC_OUTPUT_PUSHPULL);
RTC_EnableCalibOutput(ENABLE);
log_info("\r\n RTC Config end....");
while (1);
}
经程序的编译和下载,其显示效果如下图所示。
显示效果图
视频效果:
https://bbs.eeworld.com.cn/thread-1305513-1-1.html
- 2025-02-10
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】信息显示篇
本帖最后由 jennyzhaojie 于 2025-2-10 00:25 编辑
在完成显示驱动的基础上,提供添加字符库及字符显示函数即可实现信息的显示。
实现字符显示的函数为:
void LCD_ShowChar(unsigned int x,unsigned int y,char num,char mode)
{
char temp;
char pos,t;
unsigned int x0=x;
unsigned int colortemp=POINT_COLOR;
num=num-' ';
Address_set(x,y,x+8-1,y+16-1);
if(!mode)
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01)
ili9341_draw_pixel(POINT_COLOR, x, y);
else
ili9341_draw_pixel(BACK_COLOR, x, y);
temp>>=1;
x++;
}
x=x0;
y++;
}
}
else
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(unsigned int)num*16+pos];
for(t=0;t<8;t++)
{
temp>>=1;
}
}
}
POINT_COLOR=colortemp;
}
为便于信息的显示,所配置的字符串显示函数为:
void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
{
while(*p!='\0')
{
LCD_ShowChar(x,y,*p,0);
x+=8;
p++;
}
}
为实现数据的显示,所配置的数据显示函数为:
void LCD_ShowNum(unsigned int x,unsigned int y,unsigned int num,char len)
{
char t,temp;
char enshow=0;
num=(unsigned int)num;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+8*t,y,' ',0);
continue;
}
else
enshow=1;
}
LCD_ShowChar(x+8*t,y,temp+48,0);
}
}
实现图片显示的函数为:
void showimage(unsigned int x,unsigned int y)
{
unsigned int i,j;
uint32_t k;
k=0;
set_cursor(x,y);
gram_prepare();
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
write_data(gImage_l[k*2]);
write_data(gImage_l[k*2+1]);
k++;
}
}
}
实现信息显示的测试主程序为:
int main(void)
{
LCD_config();
ili9341_init();
ili9341_clear(RED);
POINT_COLOR=WHITE;
BACK_COLOR=RED;
LCD_DrawLine(0, 40, 239,40);
LCD_DrawLine(0, 292, 239,292);
showhanzi(45,100,0);
LCD_ShowString(20,16,"N32A455");
LCD_ShowString(82,16,"& MIKROE TFT ");
LCD_ShowString(20,295,"2025-2-2");
POINT_COLOR=GREEN;
LCD_ShowNum(180,16,123,3);
while (1);
}
经程序的编译和下载,其测试效果如图1和图2所示。
图1测试效果1
图2测试效果2
- 2025-02-07
-
回复了主题帖:
【MIKROE TFT-PROTO Board测评】 多屏贺新年的实现
Jacktang 发表于 2025-2-6 07:33
喜庆,全是福气,,,
大家都福气满满
- 2025-02-06
-
回复了主题帖:
【MIKROE TFT-PROTO Board测评】 多屏贺新年的实现
秦天qintian0303 发表于 2025-2-5 20:42
全都是SPI接口吗?
没错,全SPI !
-
回复了主题帖:
【新年花灯】时间催人奋进
秦天qintian0303 发表于 2025-2-5 21:14
这主控用的什么,估计还是有SD开还能多现实点,要不基本上一张全彩就占满了
说的没错,多张图显示绝对要用FLASH 存储器或SD卡,相对讲还是用SD卡合算。
-
回复了主题帖:
【新年花灯】多屏贺新年
秦天qintian0303 发表于 2025-2-5 21:09
SPI驱动大屏还是有点费劲的
的确
- 2025-02-05
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】 多屏贺新年的实现
在探索MIKROE TFT-PROTO Board的使用过程中,参照了其它显示屏的驱动程序,为此掌握了多种显示屏的驱动方法,恰逢春节期间,就将它们组合在一起实现了多屏贺新年的效果。
使用3个显示屏的基本特点是都是以SPI方式工作,显示的分辨率也恰是320*240像素点,这样在准备显示图片和文件数据时提供了极大的便利。
此外,由于显示的图片比较消耗存储空间,故借助了TF卡和在其基础上建立的文件系统来进行存储。
开发板采用的是N32A455开发板,其最小系统如图1所示,其涉及的 TF卡接口如图2所示。
图1 最小系统
图2 TF卡接口
3款显示屏的引脚连接关系如下:
1)绿屏
该显示屏的型号是MI0283QT-9A,其引脚连接关系为:
CS --PE2
MOSI --PE4
CLK --PE3
BLC --PE6
2)蓝屏
该显示屏的型号是MDM_2802,其引脚连接关系为:
CS --PE10
MOSI --PE9
CLK --PE8
3)红屏
该显示屏的控制芯片是ILI9341,其引脚连接关系为:
CS --PE13
MOSI --PE12
CLK --PE11
DC --PE14
RST --PE15
在加挂文件系统的情况下,实现多屏显示函数为:
void PHOTO(void)
{
FATFS FatFs;
FIL File;
UINT br = 0, bw = 0;
FRESULT Result;
uint8_t c;
uint16_t i,j,k;
uint8_t Buffer[200];
memset(Buffer, 0, sizeof(Buffer));
Result = f_mount(&FatFs, "0:", 1);
for(k =0; k< 11; k++)
{
if((k%3)==0) Result = f_open(&File, "0:/a.bin", FA_READ);
if((k%3)==1) Result = f_open(&File, "0:/b.bin", FA_READ);
if((k%3)==2) Result = f_open(&File, "0:/c.bin", FA_READ);
if((k%4)==0)
{
set_cursor(0x00, 0x0000);
gram_prepare();
for(j =0; j< 768; j++)
{
Result = f_read(&File, Buffer, 200, &br);
for(i= 0; i < 100; i++)
{
c=Buffer[2*i];
write_data(c);
c=Buffer[2*i+1];
write_data(c);
}
}
}
if((k%4)==1)
{
set_cursor1(0,0);
gram_prepare1();
for(j =0; j< 768; j++)
{
Result = f_read(&File, Buffer, 200, &br);
for(i= 0; i < 100; i++)
{
c=Buffer[2*i];
write_data1(c);
c=Buffer[2*i+1];
write_data1(c);
}
}
}
if((k%4)==2)
{
Address_set(0,0,239,319);
for(j =0; j< 768; j++)
{
Result = f_read(&File, Buffer, 200, &br);
for(i= 0; i < 100; i++)
{
c=Buffer[2*i];
LCD_WR_DATA8(c);
c=Buffer[2*i+1];
LCD_WR_DATA8(c);
}
}
}
f_close(&File);
for(i= 0; i < 100; i++)
{
delay1();
}
}
}
实现显示效果的主程序为:
int main(void)
{
uint32_t testResult = 0;
LCD_config();
MI0283QT_init();
MDM2802_init();
ILI9341_Init();
SD_Init(0, 3, 4);
PHOTO();
while (1);
}
经程序的编译和下载,其测试效果如图3所示,说明符合预期要求。
如果在TF卡中存放更多的图片文件,则会显示出更丰富的内容,也会更加地体现出TF卡存储的优越性!
图3测试效果
其实,是开发板上的电源引脚已消耗的差不多了,外加怕开发板上的电源负担过重,原计划是再配上3个I2C接口的OLED屏,以文字动画的方式来发送祝福的话语,进一步烘托节日的氛围,大家就脑补一下算是有了吧,哈哈再一次祝大家春节快乐,吃的好、玩的好,回头赚得收入也更好!
-
回复了主题帖:
【新年花灯】多屏贺新年
wangerxian 发表于 2025-2-5 09:29
是山西阳台上的花灯吗~
可能撞衫了,但确保没上寨,哈哈!
-
回复了主题帖:
【新年花灯】多屏贺新年
okhxyyo 发表于 2025-2-5 08:52
看着真不错。有没有原理图和代码分享上来呀
回头分享一下
- 2025-02-04
-
发表了主题帖:
【新年花灯】多屏贺新年
原打算在前面的新年花灯视频基础上再添加些修改,不曾想已经不能再编辑了,只好重发以供新的,希望大家喜欢,并位大家向上新年的祝福!
它式采用一块开发板同时驱动3款不同型号的显示屏,并借助TF卡来存储多幅图片以实现切换的效果,如何将它们嵌到花灯中,就有些类似转动的效果了。
[localvideo]83bf4ad7be3e44c50c6bb0ce0b430d07[/localvideo]
- 2025-02-03
-
回复了主题帖:
【新年花灯】时间催人奋进
lugl4313820 发表于 2025-2-2 09:25
这个花灯,有点创意!是不是再搞个呼吸灯到页面里。这才有“灯”的创意!
好的,回头再补充一下。
-
回复了主题帖:
【新年花灯】时间催人奋进
majip 发表于 2025-2-3 09:11
这个花灯,确实有点创意!是不是再搞个呼吸灯到页面里。这才有“灯”的创意!
好的,后面再整一下作补充。
- 2025-02-02
-
回复了主题帖:
【新年花灯】时间催人奋进
jobszheng5 发表于 2025-2-1 23:51
蛇年快乐
蛇年吉祥
- 2025-02-01
-
发表了主题帖:
【新年花灯】时间催人奋进
新年新气象,新年新起点,时间分秒向前,催人又将踏上新的前行道路。
[localvideo]5267db52a0f28bb931ab8dba6a120983[/localvideo]