**
源码在这里视频下留言吧,比较常看B站…
**
https://www.bilibili.com/video/BV1u1suehEnZ/?spm_id_from=333.999.0.0&vd_source=e9a93b56a06bb173bac81c6f204dbbd4
1.工具准备
keil5,正点原子精英版ZET6,2.8寸LCD电阻屏
2.本文实现目标
LCD上划分多个区域模拟按键,按下一块区域实现对应区域的功能,例如此处按下一块区域,实现LED0的状态取反。具体什么功能可以自己修改。
3.实验现象
正点原子精英版触摸屏虚拟按键识别
4.正点原子官方触摸屏例程分析
这是官方给出的触摸屏例程的main.c函数
int main(void)
{
sys_stm32_clock_init(9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(72, 115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
tp_dev.init(); /* 触摸屏初始化 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "TOUCH TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
if (tp_dev.touchtype != 0XFF)
{
lcd_show_string(30, 110, 200, 16, 16, "Press KEY0 to Adjust", RED); /* 电阻屏才显示 */
}
delay_ms(1500);
load_draw_dialog();
if (tp_dev.touchtype & 0X80)
{
ctp_test(); /* 电容屏测试 */
}
else
{
rtp_test(); /* 电阻屏测试 */
}
}
最重要的是最后四行,“if(按下且为电容屏),执行电容屏,else…”
因此我们只需要修改电阻屏函数,即rtp_test。
以下是进入rtp_test的内容:
void rtp_test(void)
{
uint8_t key;
uint8_t 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_draw_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(); /* 屏幕校准 */
tp_save_adjust_data();
load_draw_dialog();
}
i++;
if (i % 20 == 0)LED0_TOGGLE();
}
}
其中 tp_draw_big_point(tp_dev.x[0], tp_dev.y[0], RED); /* 画点 */这句代码最重要,他的条件时在电阻屏按下且不为RST区域时画线。因此,我们在这里修改为按下一块区域,则实现LED0取反:
void rtp_choose(void) //这里按键识别代码,这里要改!!!
{
uint16_t color1 = BLUE;
uint16_t color2 = BLUE;
uint16_t color3 = BLUE;
uint16_t color4 = BLUE;
uint16_t color5 = BLUE;
uint16_t color6 = BLUE;
uint16_t color7 = BLUE;
uint16_t color8 = BLUE;
uint16_t color9 = BLUE;
uint16_t color10 = BLUE;
uint16_t color11 = BLUE;
uint16_t color12 = BLUE; //定义颜色为蓝色
uint8_t key;
while (1)
{
tp_dev.scan(0);
key = key_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_draw_dialog(); /* 清除 */
}
else
{
// tp_draw_big_point(tp_dev.x[0], tp_dev.y[0], RED); /* 画点 */
if(tp_dev.x[0]<30 && tp_dev.x[0]>10 && tp_dev.y[0]>25 && tp_dev.y[0]<45) //识别我要的区域
{ delay_ms(300); //延时,防止一次按下识别两次
LED0_TOGGLE(); //LED取反
lcd_show_num(20, 30, 1, 1, 16,color1);//将原先位置的数字改变颜色
if(color1 == BLUE)
color1 = RED ;
else
color1 = BLUE;
}
//botton 1
if(tp_dev.x[0]<70 && tp_dev.x[0]>50 && tp_dev.y[0]>25 && tp_dev.y[0]<45)
{ delay_ms(300);
LED0_TOGGLE();
lcd_show_num(60, 30, 2, 1, 16,color2);
if(color2 == BLUE)
color2 = RED ;
else
color2 = BLUE;
} //botton 2
需要源码可以留言