找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电容触摸屏控制LED亮灭的stm32源码

[复制链接]
跳转到指定楼层
楼主


stm32单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "24cxx.h"
  8. #include "w25qxx.h"
  9. #include "touch.h"


  10. /************************************************
  11. ALIENTEK精英STM32F103ZET6开发板
  12. 触摸屏控制LED 实验   

  13. ************************************************/


  14. //清空屏幕并显示人机界面
  15. void Man_Machine_Interface(void)
  16. {
  17.         LCD_Clear(BLACK);        //清屏

  18.   LCD_Fill(160,160,320,320,GRAY);       //灰色表示为 L1灭状态
  19.         LCD_Fill(160,480,320,640,GRAY);       //灰色表示为 L2灭状态
  20.       
  21.         POINT_COLOR=BLACK;                                 //设置字体为黑色
  22.         LCD_ShowString(228,228,24,24,24,"L1");  
  23.   LCD_ShowString(228,548,24,24,24,"L2");      
  24. }
  25. ////////////////////////////////////////////////////////////////////////////////
  26. //电容触摸屏专有部分

  27. //画水平线
  28. //x0,y0:坐标
  29. //len:线长度
  30. //color:颜色
  31. void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
  32. {
  33.         if(len==0)return;
  34.         LCD_Fill(x0,y0,x0+len-1,y0,color);      
  35. }

  36. //画实心圆
  37. //x0,y0:坐标
  38. //r:半径
  39. //color:颜色
  40. void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
  41. {                                                                                          
  42.         u32 i;
  43.         u32 imax = ((u32)r*707)/1000+1;
  44.         u32 sqmax = (u32)r*(u32)r+(u32)r/2;
  45.         u32 x=r;
  46.         gui_draw_hline(x0-r,y0,2*r,color);
  47.         for (i=1;i<=imax;i++)
  48.         {
  49.                 if ((i*i+x*x)>sqmax)// draw lines from outside  
  50.                 {
  51.                         if (x>imax)
  52.                         {
  53.                                 gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
  54.                                 gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
  55.                         }
  56.                         x--;
  57.                 }
  58.                 // draw lines from inside (center)  
  59.                 gui_draw_hline(x0-x,y0+i,2*x,color);
  60.                 gui_draw_hline(x0-x,y0-i,2*x,color);
  61.         }
  62. }  

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

  71. //画一条粗(broad)线
  72. //(x1,y1),(x2,y2):线条的起始坐标
  73. //size:线条的粗细程度
  74. //color:线条的颜色
  75. void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
  76. {
  77.         u16 t;
  78.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  79.         int incx,incy,uRow,uCol;
  80.         if(x1<size|| x2<size||y1<size|| y2<size)return;
  81.         delta_x=x2-x1; //计算坐标增量
  82.         delta_y=y2-y1;
  83.         uRow=x1;
  84.         uCol=y1;
  85.         if(delta_x>0)incx=1; //设置单步方向
  86.         else if(delta_x==0)incx=0;//垂直线
  87.         else {incx=-1;delta_x=-delta_x;}
  88.         if(delta_y>0)incy=1;
  89.         else if(delta_y==0)incy=0;//水平线
  90.         else{incy=-1;delta_y=-delta_y;}
  91.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  92.         else distance=delta_y;
  93.         for(t=0;t<=distance+1;t++ )//画线输出
  94.         {  
  95.                 gui_fill_circle(uRow,uCol,size,color);//画点
  96.                 xerr+=delta_x ;
  97.                 yerr+=delta_y ;
  98.                 if(xerr>distance)
  99.                 {
  100.                         xerr-=distance;
  101.                         uRow+=incx;
  102.                 }
  103.                 if(yerr>distance)
  104.                 {
  105.                         yerr-=distance;
  106.                         uCol+=incy;
  107.                 }
  108.         }  
  109. }   
  110. ////////////////////////////////////////////////////////////////////////////////
  111. //5个触控点的颜色                                                                                                
  112. const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};

  113. //电容触摸屏测试函数
  114. void ctp_test(void)
  115. {
  116.         u8 t=0;
  117.         u8 m=1,n=1;                     
  118.         u16 lastpos[5][2];                //记录最后一次的数据
  119.         while(1)
  120.         {
  121.                 tp_dev.scan(0);
  122.                 for(t=0;t<CT_MAX_TOUCH;t++)
  123.                 {
  124.                         if((tp_dev.sta)&(1<<t))
  125.                         {
  126.                                 if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)
  127.                                 {                                       
  128.                                         if(lastpos[t][0]==0XFFFF && (tp_dev.x[t]>160 && tp_dev.x[t]<320) && (tp_dev.y[t]>160 && tp_dev.y[t]<320))
  129.                                   {
  130.                                                 LED0=!LED0;
  131.                                                 LED2=!LED2;
  132.                                                 m=!m;
  133.                                                 if(m==0)
  134.                                                 {
  135.                                                 LCD_Fill(160,160,320,320,RED);       //红色表示为 L1亮状态
  136.                                                 LCD_ShowString(228,228,24,24,24,"L1");
  137.                                                 }
  138.                                                 else
  139.                                                 {
  140.                                                 LCD_Fill(160,160,320,320,GRAY);     //灰色表示为 L1灭状态
  141.                                                 LCD_ShowString(228,228,24,24,24,"L1");
  142.                                                 }
  143.                                         }
  144.                                        
  145.                                         if(lastpos[t][0]==0XFFFF && (tp_dev.x[t]>160 && tp_dev.x[t]<320) && (tp_dev.y[t]>480 && tp_dev.y[t]<640))
  146.                                   {
  147.                                                 LED1=!LED1;
  148.                                                 LED3=!LED3;
  149.                                                 n=!n;
  150.                                                 if(n==0)
  151.                                                 {
  152.                                                 LCD_Fill(160,480,320,640,GREEN);       //绿色表示为 L2亮状态
  153.                                                 LCD_ShowString(228,548,24,24,24,"L2");
  154.                                                 }
  155.                                                 else
  156.                                                 {
  157.                                                 LCD_Fill(160,480,320,640,GRAY);     //灰色表示为 L2灭状态
  158.                                                 LCD_ShowString(228,548,24,24,24,"L2");
  159.                                                 }
  160.                                         }
  161.                                        
  162.                                         lastpos[t][0]=tp_dev.x[t];
  163.                                         lastpos[t][1]=tp_dev.y[t];      
  164.                                 }
  165.                         }
  166.                         else
  167.                                 lastpos[t][0]=0XFFFF;
  168.                 }
  169.                
  170.                 delay_ms(5);
  171.         }      
  172. }


  173. int main(void)
  174. {                             
  175.         delay_init();                     //延时函数初始化         
  176.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  177.         uart_init(115200);                 //串口初始化为115200
  178.          
  179.         LED_Init();                             //LED端口初始化
  180.         LCD_Init();                 //液晶显示屏LCD初始化
  181.         KEY_Init();                        //按键KEY初始化
  182.         tp_dev.init();       //触控屏TP初始化
  183.          
  184.         POINT_COLOR=RED;//设置字体为红色
  185.         LCD_ShowString(60,50,200,16,16,"ELITE STM32F1");      
  186.         LCD_ShowString(60,70,200,16,16,"TOUCH TEST");      
  187.       
  188.         delay_ms(1500);
  189.       
  190.         Man_Machine_Interface();
  191.       
  192.         if(tp_dev.touchtype&0X80)
  193.                 ctp_test();        //电容屏测试
  194.         else
  195.                 LCD_ShowString(60,50,200,16,16,"Not CP!");
  196. }


复制代码

所有资料51hei提供下载:
触摸屏控制LED.rar (370.19 KB, 下载次数: 78)


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

使用道具 举报

沙发
ID:292119 发表于 2018-4-27 15:59 | 只看该作者
下来玩下
回复

使用道具 举报

板凳
ID:471898 发表于 2019-1-23 07:04 | 只看该作者
很好,正好想要这个程序,可惜没币下,手敲试试
回复

使用道具 举报

地板
ID:95141 发表于 2020-3-26 16:42 | 只看该作者
感谢!!需要的就是这个  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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