本实验代码,开机的时候先通过LCD ID检测是电容屏(ALIENTEK 4.3寸/7寸电容触摸屏)还是电阻屏(ALIENTEK 2.4/2.8/3.5寸电阻屏),然后进入相关的测试。如果是电阻屏,则通过24C02的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入手写程序。如果已经校准了,就直接进入手写程序,此时可以通过按动屏幕来实现手写输入。屏幕上会有一个清空的操作区域(RST),点击这个地方就会将输入全部清除,恢复白板状态。程序会设置一个强制校准,就是通过按KEY0来实现,只要按下KEY0就会进入强制校准程序。
如果是电容屏,则直接进入手写测试程序,电容触摸屏支持ALIENTEK 4.3寸/新款(SSD1963驱动版本)7寸TFTLCD模块,支持5点触摸。电容触摸屏不需要校准,其他操作同电阻触摸屏的测试。
电阻屏校准方法:
1,下载本代码。
2,按KEY0。
3,依次点击屏幕上的4个十字架(十字+小圈圈)的最中央(最好用笔尖)
4,直到屏幕提示:"Touch Screen Adjust OK!"字样。
5,校准完成。该程序是论坛某位大佬的,不过是F4的。稍加修改,适用于F103系列(2.8寸触摸屏)。
完整源码:
触摸屏虚拟按键程序.7z
(246.82 KB)
部分源程序如下
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "24cxx.h"
- #include "w25qxx.h"
- #include "touch.h"
- //两个数之差的绝对值
- //x1,x2:需取差值的两个数
- //返回值:|x1-x2|
- u16 my_abs(u16 x1,u16 x2)
- {
- if(x1>x2)return x1-x2;
- else return x2-x1;
- }
- ////////////////////////////////////////////////////////////////////////////////
- //5个触控点的颜色
- const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
- //电阻触摸屏测试函数
- /*void rtp_test(void)
- {
- u8 key;
- u8 i=0;
- while(1)
- {
- key=KEY_Scan(0);
- tp_dev.scan(0);
- if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
- {
- if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
- {
- if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
- else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //画图
- }
- }else delay_ms(10); //没有按键按下的时候
- if(key==KEY0_PRES) //KEY0按下,则执行校准程序
- {
- LCD_Clear(WHITE);//清屏
- TP_Adjust(); //屏幕校准
- Load_Drow_Dialog();
- }
- i++;
- if(i%20==0)LED0=!LED0;
- }
- }*/
- //加载键盘控制界面
- //x,y:界面起始坐标
- //py_load_ui(0,0)
- void py_load_ui(u16 x,u16 y)
- {
- POINT_COLOR=RED;
- LCD_DrawRectangle(x,y,x+240,y+200);
- LCD_DrawLine(x,y+100,x+240,y+100);
- LCD_DrawLine(x+120,y,x+120,y+200);
- LCD_Fill(x+2,y+2,x+118,y+98,WHITE);//控制LED1
- LCD_Fill(x+122,y+2,x+238,y+98,WHITE);//控制LED2
- LCD_Fill(x+2,y+102,x+118,y+198,WHITE);//控制LED1 LED2 开
- LCD_Fill(x+122,y+102,x+238,y+198,WHITE);//控制LED1 LED2 关
- POINT_COLOR=BLACK;
- LCD_ShowString(x+39,y+38,lcddev.width,lcddev.height,24,"LED1");
- LCD_ShowString(x+153,y+38,lcddev.width,lcddev.height,24,"LED2");
- LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
- LCD_ShowString(x+153,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
- }
- //按键状态设置
- //x,y:键盘坐标
- //key:键值(0~8)
- //sta:状态,0,松开;1,按下;
- void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
- {
- u16 i=keyx/2,j=keyx%2;
- if(keyx>8)return;
-
- if(sta)
- LCD_Fill(x+j*120+1,y+i*100+1,x+j*120+119,y+i*100+99,GREEN);//按键按下
- else
- LCD_Fill(x+j*120+1,y+i*100+1,x+j*120+119,y+i*100+99,WHITE);
- POINT_COLOR=BLACK;
- LCD_ShowString(x+39,y+38,lcddev.width,lcddev.height,24,"LED1");
- LCD_ShowString(x+153,y+38,lcddev.width,lcddev.height,24,"LED2");
- LCD_ShowString(x+39,y+138,lcddev.width,lcddev.height,24,"LED_ON");
- LCD_ShowString(x+153,y+138,lcddev.width,lcddev.height,24,"LED_OFF");
- }
- //得到触摸屏的输入
- //x,y:键盘坐标
- //返回值:按键键值(1~9有效;0,无效)
- //key=py_get_keynum(250,140); 640*320
- u8 py_get_keynum(u16 x,u16 y)
- {
- u16 i,j;
- static u8 key_x=0;//0,没有任何按键按下;1~4,1~4号按键按下
- u8 key=0;
- tp_dev.scan(0); //屏幕扫描
- if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
- {
- for(i=0;i<2;i++)
- {
- for(j=0;j<2;j++)
- {
- if(tp_dev.x[0]<(x+j*120+120)&&tp_dev.x[0]>(x+j*120)&&tp_dev.y[0]<(y+i*100+100)&&tp_dev.y[0]>(y+i*100))
- {
- key=i*2+j+1;
- break;
- }
- }
- if(key)
- {
- if(key_x==key)key=0;
- else
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=key;
- py_key_staset(x,y,key_x-1,1);
- }
- break;
- }
- }
- }
-
- else if(key_x) //如果要记录按下后的状态 这句话需要被注释掉
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=0;
- }
- return key;
- }
- /*
- tp_dev.init();
- LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");
- if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
- delay_ms(1500);
- Load_Drow_Dialog();
- if(tp_dev.touchtype&0X80); //电容屏测试
- else rtp_test(); //电阻屏测试
- }*/
- int main(void)
- {
- u8 key;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
-
- LED_Init(); //初始化LED
- LCD_Init(); //LCD初始化
- KEY_Init();
- tp_dev.init(); //初始化触摸屏
- TP_Adjust(); //屏幕校准
- LCD_ShowString(120,72,lcddev.width,lcddev.height,16,"LED CONTROL SYSTEM");
- py_load_ui(0,0);
- while(1)
- {
- delay_ms(10);
- key=py_get_keynum(0,0);
- switch(key)
- {
- case 1 :LED0=!LED0;break;
- case 2 :LED1=!LED1;break;
- case 3 :LED0=LED1=1;break;/*GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5)*/
- case 4 :LED0=LED1=0;break;/*GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5);break;*/
- }
- //可以用来控制开关机等
- // key=KEY_Scan(0);
- // if(key==KEY2_PRES)//KEY2按下
- // {
- // }
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|