找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6197|回复: 0
打印 上一主题 下一主题
收起左侧

7寸屏TFTLCD电容触摸屏模块测试实验源码 库函数与寄存器版本都有

[复制链接]
跳转到指定楼层
楼主
好用的软件教程

库函数与寄存器版本:

实验器材:
    探索者STM32F4开发板
   
实验目的:
    学习ATK-7寸TFTLCD电容触摸屏模块的使用(注意:是V1版本的7寸屏,CPLD+FT5206方案).
   
硬件资源:
    1,DS0(连接在PF9)
    2,串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
    3,ALIENTEK 7寸TFTLCD模块(CPLD+FT5206方案,通过FSMC驱动,FSMC_NE4接LCD片选/A6接RS)
    4,按键KEY0(PE4)/KEY1(PE3)/KEY_UP(PA0,也称之为WK_UP)
    5,SD卡,通过SDIO(SDIO_D0~D4(PC8~PC11),SDIO_SCK(PC12),SDIO_CMD(PD2))连接
    6,W25Q128(SPI FLASH芯片,连接在SPI1上)
   
实验现象:
    1,电容触摸屏测试—通过按KEY0按键进入此项测试。进入测试后,可以在屏幕上实现触摸画线,最多支持5点触
    摸,通过按屏幕右上角的"RST"可以实现清屏。

    2,图片显示测试—通过按KEY1按键进入此项测试。此项测试需要一个SD卡,并且在SD卡根目录放一个PICTURE文
    件夹,里面放一些图片文件(bmp/jpeg/gif等),然后程序检测到图片后,就开始在LCD模块上PICTURE文件夹里面
    的图片。通过KEY0/KEY1可以切换下一张/上一张图片,通过按KEY_UP按键,可以暂停/继续自动播放(DS1用于指示
    是否处于暂停状态)。

    3,液晶自测试—通过按KEY_UP按键进入此项测试。此项测试又分为4个测试小项:速度测试/镜像测试/缓存测试/背
    光测试。速度测试类似ucGUI的测试效果,测试结果将显示在LCD上(像素/秒);镜像测试,展示液晶的4个显示效果
    :正常/上下调转/左右调转/上下左右都调转;缓存测试,用于测试LCD模块的8页显存,每页显示一种颜色;背光测
    试,用于测试模块的背光控制功能,背光将从暗到亮变化。

注意事项:
    1,7寸屏需要比较大电流,USB供电可能不足,请用外部电源适配器(推荐外接12V 1A电源).
    2,该实验须自备SD卡一个,并在SD卡根目录新建:PICTURE文件夹,并放入一些图片(BMP/JPG/JPEG/GIF)。
    3,JPEG/JPG/BMP图片,程序会根据LCD分辨率自动缩放,以适应LCD,而GIF则必须小于屏幕分辨率才可以显示。
    4,本例程详细说明,见光盘:9,增值资料\1,ALIENTEK 产品资料\3,ATK-7' TFTLCD电容触摸屏模块\ATK-7' TFTLCD 模块使用说明(探索者开发板)_AN1510B.pdf

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"  
  3. #include "usart.h"   
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "key.h"  
  7. #include "usmart.h"   
  8. #include "malloc.h"
  9. #include "w25qxx.h"   
  10. #include "sdio_sdcard.h"
  11. #include "ff.h"  
  12. #include "exfuns.h"   
  13. #include "fontupd.h"
  14. #include "text.h"        
  15. #include "piclib.h"         
  16. #include "string.h"         
  17. #include "timer.h"         
  18. #include "ft5206.h"

  19. //ALIENTEK探索者STM32F407开发板 扩展实验3
  20. //ATK-7' TFTLCD 电容触摸屏模块测试实验  -库函数版本
  21. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. //01,电容触摸屏测试部分   

  23. //电容触摸测试gui
  24. void ctouch_paint_gui(void)
  25. {
  26.         LCD_Clear(WHITE);//清屏   
  27.          POINT_COLOR=BLUE;//设置字体为蓝色
  28.         LCD_ShowString(lcddev.width-24,0,lcddev.width,16,16,"RST");//显示清屏区域
  29.           POINT_COLOR=RED;//设置画笔蓝色
  30. }
  31. //画水平线
  32. //x0,y0:坐标
  33. //len:线长度
  34. //color:颜色
  35. void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
  36. {
  37.         if(len==0)return;
  38.         LCD_Fill(x0,y0,x0+len-1,y0,color);        
  39. }
  40. //画实心圆
  41. //x0,y0:坐标
  42. //r:半径
  43. //color:颜色
  44. void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
  45. {                                                                                          
  46.         u32 i;
  47.         u32 imax = ((u32)r*707)/1000+1;
  48.         u32 sqmax = (u32)r*(u32)r+(u32)r/2;
  49.         u32 x=r;
  50.         gui_draw_hline(x0-r,y0,2*r,color);
  51.         for (i=1;i<=imax;i++)
  52.         {
  53.                 if ((i*i+x*x)>sqmax)// draw lines from outside  
  54.                 {
  55.                          if (x>imax)
  56.                         {
  57.                                 gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
  58.                                 gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
  59.                         }
  60.                         x--;
  61.                 }
  62.                 // draw lines from inside (center)  
  63.                 gui_draw_hline(x0-x,y0+i,2*x,color);
  64.                 gui_draw_hline(x0-x,y0-i,2*x,color);
  65.         }
  66. }

  67. //两个数之差的绝对值
  68. //x1,x2:需取差值的两个数
  69. //返回值:|x1-x2|
  70. u16 my_abs(u16 x1,u16 x2)
  71. {                        
  72.         if(x1>x2)return x1-x2;
  73.         else return x2-x1;
  74. }

  75. //画一条粗线
  76. //(x1,y1),(x2,y2):线条的起始坐标
  77. //size:线条的粗细程度
  78. //color:线条的颜色
  79. void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
  80. {
  81.         u16 t;
  82.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  83.         int incx,incy,uRow,uCol;
  84.         if(x1<size|| x2<size||y1<size|| y2<size)return;   
  85.         delta_x=x2-x1; //计算坐标增量
  86.         delta_y=y2-y1;
  87.         uRow=x1;
  88.         uCol=y1;
  89.         if(delta_x>0)incx=1; //设置单步方向
  90.         else if(delta_x==0)incx=0;//垂直线
  91.         else {incx=-1;delta_x=-delta_x;}
  92.         if(delta_y>0)incy=1;
  93.         else if(delta_y==0)incy=0;//水平线
  94.         else{incy=-1;delta_y=-delta_y;}
  95.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  96.         else distance=delta_y;
  97.         for(t=0;t<=distance+1;t++ )//画线输出
  98.         {  
  99.                 gui_fill_circle(uRow,uCol,size,color);//画点
  100.                 xerr+=delta_x ;
  101.                 yerr+=delta_y ;
  102.                 if(xerr>distance)
  103.                 {
  104.                         xerr-=distance;
  105.                         uRow+=incx;
  106.                 }
  107.                 if(yerr>distance)
  108.                 {
  109.                         yerr-=distance;
  110.                         uCol+=incy;
  111.                 }
  112.         }  
  113. }   
  114. //5个触控点的颜色                                                                                                
  115. const u16 POINT_COLOR_TBL[5]={RED,GREEN,BLUE,BROWN,GRED};  
  116. //01,电容触摸屏测试
  117. //测试电容触摸屏,最大支持5点触控。
  118. void ctouch_paint_test(void)
  119. {               
  120.          u8 i=0,t=0;        
  121.         u16 lastpos[5][2];                //最后一次的数据   
  122.         u8         ctout[5];                        //5个触摸点的释放计时器                                    
  123.          LCD_Clear(WHITE);
  124.         POINT_COLOR=RED;                //设置字体为红色
  125.         Show_Str(60,50,lcddev.width,16,"测试1:电容触摸屏测试",16,0);
  126.         Show_Str(60,70,lcddev.width,16,"最大同时触摸点数:5点",16,0);   
  127.         Show_Str(60,90,lcddev.width,16,"清屏:点击右上角的的‘RST’可以清除整个屏幕",16,0);   
  128.           while(tp_dev.init())                           //初始化电容触摸屏
  129.         {
  130.                 Show_Str(60,110,lcddev.width,16,"电容触摸屏初始化失败!",16,0);
  131.                 delay_ms(200);
  132.                 Show_Str(60,110,lcddev.width,16,"      请检查!!!    ",16,0);
  133.                  delay_ms(200);
  134.         };
  135.          Show_Str(60,110,lcddev.width,16,"电容触摸屏初始化成功!",16,0);
  136.         delay_ms(1500);
  137.         delay_ms(1500);
  138.          ctouch_paint_gui();         
  139.          for(i=0;i<5;i++)
  140.         {
  141.                 lastpos[i][0]=0XFFFF;        //全部设置为非法值
  142.                 lastpos[i][1]=0XFFFF;
  143.                 ctout[i]=0;                                   //计时器清零
  144.         }
  145.         while(1)
  146.         {
  147.                  tp_dev.scan(0);            
  148.                 if(tp_dev.sta&TP_PRES_DOWN)                //触摸屏被按下
  149.                 {                  
  150.                         for(t=0;t<5;t++)
  151.                         {
  152.      
  153.                                 if(tp_dev.sta&(1<<t))
  154.                                 {
  155.                                          if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)
  156.                                         {        
  157.                                                 if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<16)ctouch_paint_gui();//清除
  158.                                                 else
  159.                                                 {
  160.                                                         if(lastpos[t][0]==0XFFFF)//属于第一次按下
  161.                                                         {
  162.                                                                 lastpos[t][0]=tp_dev.x[t];
  163.                                                                 lastpos[t][1]=tp_dev.y[t];           
  164.                                                         }
  165.                                                          lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],3,POINT_COLOR_TBL[t]);//画线
  166.                                                         lastpos[t][0]=tp_dev.x[t];
  167.                                                         lastpos[t][1]=tp_dev.y[t];         
  168.                                                 }                                                                                                                                    
  169.                                         }
  170.                                         ctout[t]=0;        
  171.                                 }
  172.                         }
  173.                         tp_dev.sta=0;         
  174.                 }else
  175.                 {                                                                     
  176.                         delay_ms(5);        //没有按键按下的时候
  177.                         for(t=0;t<5;t++)
  178.                         {
  179.                                 ctout[t]++;        
  180.                                 if(ctout[t]>10)//判定此点以松开
  181.                                 {
  182.                                         lastpos[t][0]=0XFFFF;         
  183.                                         ctout[t]=0;
  184.                                 }
  185.                         }           
  186.                  }
  187.                 i++;
  188.                 if(i==20)
  189.                 {
  190.                         i=0;
  191.                         LED0=!LED0;
  192.                 }
  193.         }
  194. }
  195. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  196. //02,图片显示测试部分

  197. //得到path路径下,目标文件的总个数
  198. //path:路径                    
  199. //返回值:总有效文件数
  200. u16 pic_get_tnum(u8 *path)
  201. {         
  202.         u8 res;
  203.         u16 rval=0;
  204.          DIR tdir;                         //临时目录
  205.         FILINFO tfileinfo;        //临时文件信息        
  206.         u8 *fn;                                                                                          
  207.     res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
  208.           tfileinfo.lfsize=_MAX_LFN*2+1;                                                //长文件名最大长度
  209.         tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize);        //为长文件缓存区分配内存
  210.         if(res==FR_OK&&tfileinfo.lfname!=NULL)
  211.         {
  212.                 while(1)//查询总的有效文件数
  213.                 {
  214.                 res=f_readdir(&tdir,&tfileinfo);                       //读取目录下的一个文件
  215.                 if(res!=FR_OK||tfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出                  
  216.                      fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);                        
  217.                         res=f_typetell(fn);        
  218.                         if((res&0XF0)==0X50)//取高四位,看看是不是图片文件        
  219.                         {
  220.                                 rval++;//有效文件数增加1
  221.                         }            
  222.                 }  
  223.         }
  224.         return rval;
  225. }   
  226. //02,图片显示测试
  227. //循环显示SD卡,PICTURE文件夹下面的图片文件。
  228. void picture_display_test(void)
  229. {
  230.         u8 res;
  231.          DIR picdir;                         //图片目录
  232.         FILINFO picfileinfo;//文件信息
  233.         u8 *fn;                           //长文件名
  234.         u8 *pname;                        //带路径的文件名
  235.         u16 totpicnum;                 //图片文件总数
  236.         u16 curindex;                //图片当前索引
  237.         u8 key;                                //键值
  238.         u8 pause=0;                        //暂停标记
  239.         u8 t;
  240.         u16 temp;
  241.         u16 *picindextbl;        //图片索引表
  242.         LCD_Clear(WHITE);
  243.         Show_Str(60,50,lcddev.width,16,"测试2:图片显示测试",16,0);
  244.         Show_Str(60,70,lcddev.width,16,"KEY0:下一张图片",16,0);
  245.         Show_Str(60,90,lcddev.width,16,"KEY1:上一张图片",16,0);
  246.         Show_Str(60,110,lcddev.width,16,"KEY_UP:暂停/继续 自动播放",16,0);
  247.          while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
  248.          {            
  249.                 Show_Str(60,130,lcddev.width,16,"PICTURE文件夹错误!",16,0);
  250.                 delay_ms(200);                                 
  251.                 LCD_Fill(60,130,lcddev.width,130+16,WHITE);//清除显示            
  252.                 delay_ms(200);                                 
  253.         }  
  254.         totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
  255.           while(totpicnum==NULL)//图片文件为0               
  256.          {            
  257.                 Show_Str(60,130,lcddev.width,16,"没有图片文件!",16,0);
  258.                 delay_ms(200);                                 
  259.                 LCD_Fill(60,130,lcddev.width,130+16,WHITE);//清除显示            
  260.                 delay_ms(200);                                 
  261.         }         
  262.           picfileinfo.lfsize=_MAX_LFN*2+1;                                                //长文件名最大长度
  263.         picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize);        //为长文件缓存区分配内存
  264.          pname=mymalloc(SRAMIN,picfileinfo.lfsize);                                //为带路径的文件名分配内存
  265.          picindextbl=mymalloc(SRAMIN,2*totpicnum);                                //申请2*totpicnum个字节的内存,用于存放图片索引
  266.          while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错
  267.          {            
  268.                 Show_Str(60,130,lcddev.width,16,"内存分配失败!",16,0);
  269.                 delay_ms(200);                                 
  270.                 LCD_Fill(60,130,lcddev.width,130+16,WHITE);//清除显示            
  271.                 delay_ms(200);                                 
  272.         }         
  273.         //记录索引
  274.     res=f_opendir(&picdir,"0:/PICTURE"); //打开目录
  275.         if(res==FR_OK)
  276.         {
  277.                 curindex=0;//当前索引为0
  278.                 while(1)//全部查询一遍
  279.                 {
  280.                         temp=picdir.index;                                                                //记录当前index
  281.                 res=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
  282.                 if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出                  
  283.                      fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                        
  284.                         res=f_typetell(fn);        
  285.                         if((res&0XF0)==0X50)//取高四位,看看是不是图片文件        
  286.                         {
  287.                                 picindextbl[curindex]=temp;//记录索引
  288.                                 curindex++;
  289.                         }            
  290.                 }
  291.         }   
  292.         delay_ms(1200);
  293.         Show_Str(60,130,lcddev.width,16,"开始显示...",16,0);
  294.         delay_ms(1800);  
  295.         piclib_init();                                                                                //初始化画图                     
  296.           curindex=0;                                                                                        //从0开始显示
  297.            res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE");         //打开目录
  298.           while(res==FR_OK)//打开成功
  299.         {        
  300.                 dir_sdi(&picdir,picindextbl[curindex]);                        //改变当前目录索引           
  301.         res=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
  302.         if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出
  303.              fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                        
  304.                 strcpy((char*)pname,"0:/PICTURE/");                                //复制路径(目录)
  305.                 strcat((char*)pname,(const char*)fn);                          //将文件名接在后面
  306.                 LCD_Clear(BLACK);
  307.                  ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片   
  308.                 Show_Str(2,2,lcddev.width,16,pname,16,1);                                 //显示图片名字
  309.                 t=0;
  310.                 while(1)
  311.                 {
  312.                         key=KEY_Scan(0);                                //扫描按键
  313.                         if(t>250&&(pause==0))key=KEY0_PRES;//非暂停状态,每2.5秒,模拟一次按下KEY0  
  314.                         if(key==KEY1_PRES)                                //上一张
  315.                         {
  316.                                 if(curindex)curindex--;
  317.                                 else curindex=totpicnum-1;
  318.                                 break;
  319.                         }else if(key==KEY0_PRES)                //下一张
  320.                         {
  321.                                 curindex++;                           
  322.                                 if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
  323.                                 break;
  324.                         }else if(key==WKUP_PRES)
  325.                         {
  326.                                 pause=!pause;
  327.                                 LED1=!pause;         //暂停的时候LED1亮.  
  328.                         }         
  329.                         t++;
  330.                         if((t%20)==0)LED0=!LED0;              
  331.                         delay_ms(10);
  332.                 }                                            
  333.                 res=0;  
  334.         }                                                                                          
  335.         myfree(SRAMIN,picfileinfo.lfname);        //释放内存                           
  336.         myfree(SRAMIN,pname);                                //释放内存                           
  337.         myfree(SRAMIN,picindextbl);                        //释放内存
  338. }
  339. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  340. //03,液晶屏自测试

  341. //得到一个随机数
  342. //(min,max)期望的随机数范围
  343. //返回值:符合期望的随机数值
  344. u16 speed_test_get_rval(u16 min,u16 max)
  345. {
  346.         u16 t=0Xffff;
  347.         while((t<min)||(t>max))t=rand();         
  348.         return t;
  349. }                                                                                                
  350. const u16 SPEED_COLOR_TBL[10]={RED,GREEN,BLUE,BROWN,GRED,BRRED,CYAN,YELLOW,GRAY,MAGENTA};
  351. //得到速度测试一次填充的相关信息
  352. //*x,*y,*width,*height,*color:获取到的填充坐标/尺寸/颜色等信息
  353. void speed_test_get_fill_parameter(u16 *x,u16 *y,u16 *width,u16 *height,u16 *color)
  354. {
  355.         *x=speed_test_get_rval(0,700);
  356.         *y=speed_test_get_rval(0,380);
  357.         *width=speed_test_get_rval(80,800-*x);
  358.         *height=speed_test_get_rval(80,480-*y);
  359.         *color=SPEED_COLOR_TBL[speed_test_get_rval(0,9)];
  360. }   
  361. u16 speed_run_time;                 //速度测试测试时间长度(单位为10ms)
  362. //3-1速度测试
  363. void tftlcd_speed_test(void)
  364. {
  365.          u16 x,y,width,height,color;
  366.         u32 pixelcnt=0;
  367.         u8 *str;
  368.         LCD_Clear(WHITE);
  369.          POINT_COLOR=RED;
  370.         Show_Str(60,50,lcddev.width,16,"测试3-1:速度测试",16,0);
  371.         Show_Str(60,70,lcddev.width,16,"通过在LCD各个位置随机的填充不同尺寸的单色矩形,来测试速度",16,0);
  372.         Show_Str(60,90,lcddev.width,16,"测试时长约为5秒,测试结果将显示在LCD上",16,0);
  373.          delay_ms(1500);delay_ms(1500);
  374.          LCD_Clear(RED);
  375.         str=mymalloc(SRAMIN,60);        //分配60个字节的内存
  376.         srand(TIM3->CNT);
  377.         TIM3->CR1&=~(1<<0);                    //关闭定时器3
  378.         TIM3->CNT=0;                                //清零
  379.         speed_run_time=0;                        //计时器清零
  380.         while(1)
  381.         {               
  382.                 speed_test_get_fill_parameter(&x,&y,&width,&height,&color);//得到各参数
  383.                 pixelcnt+=width*height;
  384.                 TIM3->CR1|=1<<0;                  //开启定时器3
  385.                 LCD_Fill(x,y,x+width-1,y+height-1,color);
  386.                 TIM3->CR1&=~(1<<0);                //关闭定时器3
  387.                 if(speed_run_time>300)break;//大于3秒钟
  388.         }
  389.         sprintf((char*)str,"LCD速度测试结果:%d 像素/秒",(pixelcnt*100)/speed_run_time);
  390.          Show_Str(270,230,lcddev.width,16,str,16,0);                                 
  391.         myfree(SRAMIN,str);                //释放内存
  392.         delay_ms(1800);delay_ms(1800);delay_ms(1400);
  393. }
  394. //3-2镜像测试
  395. void tftlcd_mirror_test(void)
  396. {                                               
  397.         LCD_Clear(WHITE);
  398.         Show_Str(60,50,lcddev.width,16,"测试3-2:镜像测试",16,0);
  399.         Show_Str(60,70,lcddev.width,16,"测试步骤:默认显示/上下调转/左右调转/上下左右都调转",16,0);
  400.           delay_ms(1500);delay_ms(1500);
  401.          LCD_Clear(WHITE);
  402.         POINT_COLOR=RED;
  403.         LCD_DrawRectangle(30,30,180,130);
  404.         LCD_Fill(lcddev.width-30-150,lcddev.height-30-100,lcddev.width-30,lcddev.height-30,BLUE);
  405.         Draw_Circle(90,lcddev.height-90,60);
  406.         gui_fill_circle(lcddev.width-90,90,60,GRED);
  407.          POINT_COLOR=BLUE;
  408.         Show_Str(140,150,lcddev.width,16,"ATK-7' TFTLCD模块镜像功能测试",16,0);     
  409.         LCD_Scan_Dir(L2R_U2D);//默认                 
  410.            delay_ms(1200);delay_ms(1300);               
  411.          LCD_Scan_Dir(L2R_D2U);//上下调转                                                                                             
  412.            delay_ms(1200);delay_ms(1300);               
  413.           LCD_Scan_Dir(R2L_U2D);//左右调转                                                                                             
  414.            delay_ms(1200);delay_ms(1300);               
  415.         LCD_Scan_Dir(R2L_D2U);//上下左右都调转                                                                                             
  416.            delay_ms(1200);delay_ms(1300);               
  417.         LCD_Scan_Dir(L2R_U2D);//恢复默认设置         
  418. }                                                                                                                                                                                    
  419. //3-3多缓存测试
  420. void tftlcd_multi_gram_test(void)
  421. {
  422.         u8 i;
  423.         u8 *str;
  424.         LCD_Clear(WHITE);
  425.         POINT_COLOR=RED;
  426.         Show_Str(60,50,lcddev.width,16,"测试3-3:多缓存测试",16,0);        //
  427.         Show_Str(60,70,lcddev.width,16,"ATK-7' TFTLCD模块拥有多达8页LCD缓存,本测试将测试全部8页缓存",16,0);
  428.           delay_ms(1500);delay_ms(1500);               
  429.         str=mymalloc(SRAMIN,60);                        //分配60个字节的内存
  430.         for(i=0;i<8;i++)
  431.         {
  432.                  LCD_SetOperateLayer(i);                        //设置当前操作缓存
  433.                 LCD_SetDisplayLayer(i);                        //设置当前显示缓存
  434.                 LCD_Clear(SPEED_COLOR_TBL[i]);
  435.                 sprintf((char*)str,"我是第%d页缓存",i);
  436.                 POINT_COLOR=BLACK;
  437.                  Show_Str(360,230,lcddev.width,16,str,16,0);                                 
  438.                    delay_ms(1200);delay_ms(1300);               
  439.         }
  440.         myfree(SRAMIN,str);                //释放内存
  441.         //恢复默认设置
  442.         LCD_SetOperateLayer(0);
  443.         LCD_SetDisplayLayer(0);
  444. }
  445. //3-4背光测试
  446. void tftlcd_backlight_test(void)
  447. {
  448.         u8 i;
  449.         u8 *str;
  450.         float bkl=0;
  451.         LCD_Clear(WHITE);
  452.         POINT_COLOR=RED;
  453.         Show_Str(60,50,lcddev.width,16,"测试3-4:背光测试",16,0);
  454.         Show_Str(60,70,lcddev.width,16,"ATK-7' TFTLCD模块自带背光控制功能,只需发送相关指令即可设置背光亮度",16,0);
  455.           delay_ms(1500);delay_ms(1500);               
  456.          str=mymalloc(SRAMIN,60);                        //分配60个字节的内存
  457.         for(i=0;i<8;i++)
  458.         {                                                                                                            
  459.                 LCD_BackLightSet(i*8+7);        //背光亮度设置
  460.                 bkl=(float)(i+1)*8/64;
  461.                 sprintf((char*)str,"当前背光亮度:%3.1f%%",bkl*100);
  462.                 POINT_COLOR=BLUE;
  463.                  Show_Str(330,230,lcddev.width,16,str,16,0);                                 
  464.                    delay_ms(1200);delay_ms(1300);               
  465.         }
  466.         myfree(SRAMIN,str);                //释放内存
  467. }         
  468. //03,液晶自测试
  469. //速度测试/镜像测试/多缓存测试/背光测试,这几个循环进行测试
  470. void tftlcd_self_test(void)
  471. {
  472.         while(1)
  473.         {
  474.                 tftlcd_speed_test();
  475.                 tftlcd_mirror_test();
  476.                 tftlcd_multi_gram_test();
  477.                 tftlcd_backlight_test();
  478.         }
  479. }

  480. u16 TEST_COLOR_TBL[10]={RED,GREEN,BLUE,BROWN,GRED,BRRED,CYAN,YELLOW,GRAY,MAGENTA};

  481. int main(void)
  482. {        
  483.         u8 key;
  484.         u8 t=0;
  485.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  486.         delay_init(168);  //初始化延时函数
  487.         uart_init(115200);                //初始化串口波特率为115200
  488.         LED_Init();                                //初始化LED
  489.         usmart_dev.init(84);        //初始化USMART
  490.          LCD_Init();                                //LCD初始化  
  491.          KEY_Init();                                //按键初始化  
  492.         W25QXX_Init();                        //初始化W25Q128
  493.          TIM3_Int_Init(100-1,8400-1);//10Khz的计数频率,计数100次为10ms     
  494.         my_mem_init(SRAMIN);        //初始化内部内存池
  495.         my_mem_init(SRAMCCM);        //初始化CCM内存池
  496.         exfuns_init();                        //为fatfs相关变量申请内存  
  497.           f_mount(fs[0],"0:",1);         //挂载SD卡
  498.          f_mount(fs[1],"1:",1);         //挂载FLASH.
  499.         POINT_COLOR=RED;     
  500.          while(font_init())                 //检查字库
  501.         {            
  502.                 POINT_COLOR=RED;      
  503.                 LCD_Clear(WHITE);
  504.                 LCD_ShowString(60,50,lcddev.width,16,16,"ALIENTEK STM32");        
  505.                 LCD_ShowString(60,70,lcddev.width,16,16,"Font Updating...");                  
  506.                   while(update_font(60,90,16,0)!=0)//字体更新出错
  507.                 {                                                  
  508.                         LCD_ShowString(60,90,lcddev.width,16,16," Font Update error! ");                  
  509.                         delay_ms(200);   
  510.                         LCD_ShowString(60,90,lcddev.width,16,16,"  Please Check....  ");
  511.                         delay_ms(200);   
  512.                         LED0=!LED0;        
  513.                 };                        
  514.                 LCD_Clear(WHITE);                                 
  515.         }  
  516.         Show_Str(60,50,lcddev.width,16,"ALIENTEK ATK-7' TFTLCD电容触摸屏测试实验",16,0);                                             
  517.         Show_Str(60,70,lcddev.width,16,"请选择测试模式:",16,0);        
  518.         POINT_COLOR=BLUE;                                    
  519.         Show_Str(60,90,lcddev.width,16, "KEY0:电容触摸屏测试(支持5点触控)",16,0);                                             
  520.         Show_Str(60,110,lcddev.width,16,"KEY1:图片显示测试(需要SD卡支持)",16,0);                                             
  521.         Show_Str(60,130,lcddev.width,16,"KEY_UP:液晶自测试(速度/镜像/多缓存/背光)",16,0);                                             
  522.         POINT_COLOR=RED;                                    
  523.         Show_Str(60,170,lcddev.width,16,"广州市星翼电子科技有限公司(ALIENTEK)",16,0);                                             
  524.         Show_Str(60,190,lcddev.width,16,"官方网站:www*alientek*com",16,0);                                             
  525.         Show_Str(60,210,lcddev.width,16,"开源电子网论坛:www*openedv*com",16,0);                                             
  526.         Show_Str(60,230,lcddev.width,16,"电话(传真):020-38271790",16,0);                                             
  527.         Show_Str(60,250,lcddev.width,16,"2015年11月2日",16,0);

  528.         while(1)
  529.         {
  530.                 key=KEY_Scan(0);
  531.                 switch(key)
  532.                 {
  533.                         case KEY0_PRES://KEY0按下,电容触摸测试
  534.                                 ctouch_paint_test();
  535.                                 break;
  536.                         case KEY1_PRES://KEY1按下,图片显示测试
  537.                                 picture_display_test();
  538.                                 break;
  539.                         case WKUP_PRES://KEY_UP按下,液晶自测试
  540.                                 tftlcd_self_test();
  541.                                 break;         
  542.                 }
  543.                 t++;
  544.                 if(t==20)
  545.                 {                                                   
  546.                         t=0;
  547.                         LED0=!LED0;
  548.                         if(LED0)Show_Str(60,70,lcddev.width,16,"请选择测试模式:",16,0);
  549.                         else LCD_Fill(60,70,60+128,70+16,WHITE);
  550.                 }else delay_ms(10);
  551.         }                                
  552. }
复制代码

所有资料51hei提供下载:
屏V1.8版本例程.7z (2.08 MB, 下载次数: 31)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表