正点原子精英版STM32F103ZET6触摸屏(2.8寸LCD)虚拟按键识别(附源码)

**

源码在这里视频下留言吧,比较常看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

需要源码可以留言

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值