- 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]
-
回复了主题帖:
【MIKROE TFT-PROTO Board测评】显示驱动篇
本帖最后由 jennyzhaojie 于 2025-2-1 11:38 编辑
秦天qintian0303 发表于 2025-2-1 08:11 MIKROE TFT-PROTO Board是哪家的主控啊,引脚不少
主控芯片是ILI9341,这款屏主打的是工作模式多,目前常见的SPI屏多是国产的简化板,特点是引脚比较少、易用、价廉。
-
发表了主题帖:
【MIKROE TFT-PROTO Board测评】显示驱动篇
本帖最后由 jennyzhaojie 于 2025-2-1 11:45 编辑
在广泛收集资料的情况下,对MIKROE TFT-PROTO Board的使用终于有所突破,初步实现了该显示屏的显示驱动。
该显示板是使用3.3V电源,其背光LED需要一个5欧的电阻来限流。使用可两个10欧电阻并联得到。
该显示板所提供的接口可支持以16位、8位、18位、9位或SPI模式来驱动。
在大多数情况下,出于不想过多占用I/O资源的原因,多是采用SPI模式驱动。
模式的设置是通过IMx引脚来实现,即IM0、IM1、IM3接GND,IM2接3.3V。
在该模式下,只需要三个SPI信号引脚及一个CS片选和一个复位信号,总共5个引脚。
其中,RST复位信号是由开发板的复位引脚提供,至于WR和FMARK信号则未使用,其接口电路基本如图1所示,个别之处有所调整。
图1 接口电路
该显示屏的引脚排列如图2所示,其内部电路如图3所示。
图2 引脚排列
图3 内部电路
为驱动该显示屏,是以N32A455开发板来驱动其实现显示。
该显示屏与开发板的连接关系为:
CS --PE2
MOSI --PE4
CLK --PE3
BLC --PE6
RST ---RST
对所用引脚的配置函数为:
void LCD_config(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
GPIO_InitStructure.Pin =GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
}
以模拟SPI方式方式字节数据的函数为:
void send_byte(uint8_t data)
{
uint8_t count;
for(count = 0; count < 8; count++)
{
CLR_CLK();
delay2();
if(data & 0x80)
{
SET_SDA();
}
else
{
CLR_SDA();
}
delay2();
data <<= 1;
SET_CLK();
delay2();
}
}
对显示屏的初始化函数为:
void ili9341_init(void)
{
write_register(0x01);
lcdc_delay(1000);
write_register(0x28);
write_register(0xCF);
write_data(0x00);
write_data(0x83);
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(0x01);
write_data(0x79);
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);
write_data(0x26);
write_register(0xC1);
write_data(0x11);
write_register(0xC5);
write_data(0x35);
write_data(0x3E);
write_register(0xC7);
write_data(0XBE);
write_register(0x36);
write_data(0x48);
write_register(0x3A);
write_data(0x55);
write_register(0xB1);
write_data(0x00);
write_data(0x1B);
write_register(0xF2);
write_data(0x08);
write_register(0x26);
write_data(0x01);
write_register(0xE0);
write_data(0x1F);
write_data(0x1A);
write_data(0x18);
write_data(0x0A);
write_data(0x0F);
write_data(0x06);
write_data(0x45);
write_data(0X87);
write_data(0x32);
write_data(0x0A);
write_data(0x07);
write_data(0x02);
write_data(0x07);
write_data(0x05);
write_data(0x00);
write_register(0XE1);
write_data(0x00);
write_data(0x25);
write_data(0x27);
write_data(0x05);
write_data(0x10);
write_data(0x09);
write_data(0x3A);
write_data(0x78);
write_data(0x4D);
write_data(0x05);
write_data(0x18);
write_data(0x0D);
write_data(0x38);
write_data(0x3A);
write_data(0x1F);
write_register(0x2A);
write_data(0x00);
write_data(0x00);
write_data(0x00);
write_data(0xEF);
write_register(0x2B);
write_data(0x00);
write_data(0x00);
write_data(0x01);
write_data(0x3F);
write_register(0xB7);
write_data(0x07);
write_register(0xB6);
write_data(0x0A);
write_data(0x82);
write_data(0x27);
write_data(0x00);
write_register(0x11);
lcdc_delay(1000);
write_register(0x29);
lcdc_delay(1000);
write_register(0x2C);
BLC_HIGH();
}
以色彩清除屏幕的函数为:
void ili9341_clear(int c)
{
uint32_t index=0;
set_cursor(0x00, 0x0000);
gram_prepare();
for(index = 0; index < (320*240); index++)
{
write_data(c >> 8);
write_data(c);
}
}
进行驱动测试的主程序为:
int main(void)
{
LCD_config();
ili9341_init();
ili9341_clear(RED);
while (1);
}
经程序的编译和下载,其测试效果如图4所示,说明驱动成功!
图4 测试效果
新年啦,还是献上一份年味浓浓的画面来增添喜悦的氛围吧!祝大家社区越办越好,大家万事如意!
- 2025-01-30
-
回复了主题帖:
【MCXN947开发板测评】人脸检测的方法探索
freebsder 发表于 2025-1-24 18:02
能有多少帧?
推算可达40帧左右吧
- 2025-01-24
-
回复了主题帖:
【MCXN947开发板测评】人脸检测的方法探索
秦天qintian0303 发表于 2025-1-23 22:47 这个有现成的demo吗?
有参考性的示例