赛元MB0036触摸滑条评估板测评

本次赛元MB0036开发板上是一颗带触摸的8位MCU,型号为SC95F8767P48R,128K Flash 48pin;如果需要对触摸进行开发调试需要开发工具SC LINk PRO ,如果不对触摸进行开发调试,可以使用开发板上自带的ISP串口进行下载。
而且也为我们配置了一个Keil的插件,导入这个SC系列的芯片。

### 自带功能
开发板触摸功能:6 个普通触摸按键,1 个滑条触摸模块
1.触摸滑条功能:手指在滑条上从左至右滑动时,滑条对应的指示灯亮
2.触摸按键功能:按下TK 按键后,按键对应的指示灯亮起。
3.触摸长按键功能:TK2 按键支持长按功能,长按 1.5s 后所有按键指示灯翻转。

我们上电看一下效果

滑动一下滑条,效果很丝滑

按下按键

### 烧录
官方还配备了一个ISP烧录工具

> 这样我们就可以烧录demo了,demo功能很简单我们可以试着学习学习这个芯片和开发板
##### demo
长按TK2可以打开所有的按键灯

>这里误触了KT6,灯直接就灭了,所以还是非常灵敏的,工艺十分的精良🥰🥰🥰

##### 代码分析

很简单的分析,我们可以试试自己来写一下有趣的"密码锁"功能.这样之后可以作为一个模块移植给其他的开发板
使用ISP工具烧录一下

我设置了让滑动模块滑到最大值后上锁,连续按下TK2和TK3后才能解锁

解锁成功

代码在这里也贴一下,我稍微调整了一下文件结构,不过影响不大
``` c
//************************************************************

//  Copyright (c) 深圳市赛元微电子有限公司

//  文件名称    : main.c

//  作者      :

//  模块功能    :  触控Demo

//  局部函数列表:

//  最后更正日期: 2020/10/16

//  版本      : V1.0

//*************************************************************

  

#include "stdio.h"

#include "SensorMethod.h"

  

#include "led.h"

//#include "SOC_DebugTouchKey.h"

  

#define KEYTIME 150//长按时间设置 例如当前使用的是9个按键,长按时间关系:9*150 + 5*9(9是按键个数) \

                         //长按时间控制在默认的最长按键输出时间内(长按时间小于等于4秒,最长按键时间可修改)

  

unsigned long int TK_exKeyValueFlag = 0;//当前轮按键标志

unsigned char     exKeyValue        = 0;

unsigned char     gTkIsValid        = 0;

unsigned char     KeyValue          = 0;

unsigned int      touchKeyFlag      = 0;

  

volatile char lock = 0;//锁

/**************************************************

*函数名称:void  UartInit(void)

*函数功能:uart初始化

*入口参数:void

*出口参数:void  

**************************************************/

void UartInit(unsigned char Fsys, unsigned long baud)

{

    OTCON |= 0XC0;

  

    US1CON0 |= 0X40;

    US1CON1  = (Fsys * 1000000 / baud) % 256;

    US1CON2  = (Fsys * 1000000 / baud) / 256;

    //函数实现,用于打印输出滑轮滑条值

}

  

/**************************************************

*函数名称:void  putchar(void)

*函数功能:发送一个字符

*入口参数:void

*出口参数:void  

**************************************************/

char putchar(char c)

{

    US1CON3 = c;

    while (!(US1CON0 & 0x02))

        ;

    US1CON0 = US1CON0;

    //函数实现,实现printf函数,用于打印输出滑轮滑条值

    return c;

}

  

/**************************************************

*函数名称:void  Sys_Init(void)

*函数功能:系统初始化

*入口参数:void

*出口参数:void  

**************************************************/

void Sys_Init(void)

{

    //LED灯初始化

    P0CON |= 0X0F;

    P0PH  &= ~0X0F;

  

    P1CON |= 0XF0;

    P1PH  &= ~0XF0;

  

    P2CON |= 0X03;

    P2PH  &= ~0X03;

  

    P5CON |= 0X3C;

    P5PH  &= ~0X3C;

}

  
  

void ChangeTouchKeyvalue(void)

{

    switch (TK_exKeyValueFlag) {

        case 0x00000004: {

            touchKeyFlag++;

            if (touchKeyFlag >= KEYTIME)//判断是否达到长按条件

            {

                touchKeyFlag = 0;

                exKeyValue   = 8;//长按

            }

        } break;

        case 0x00000008:

            exKeyValue = 3;

            break;

        case 0x00000010:

            exKeyValue = 4;

            break;

        case 0x00000020:

            exKeyValue = 5;

            break;

        case 0x00000040:

            exKeyValue = 6;

            break;

        case 0x00000080:

            exKeyValue = 7;

            break;

  

        default: {

            if ((touchKeyFlag < KEYTIME) && (touchKeyFlag != 0)) {

                exKeyValue = 2;//短按

            } else {

                exKeyValue = 0xff;

            }

            touchKeyFlag = 0;

        } break;

    }

}

  

int  password[2] = {0, 0};//密码

int  num         = 0;

void unlock(void)//解锁程序

{

    switch (KeyValue) {

        case 2:

            LED1_ON;

            password[num++] = 2;

            break;

        case 3:

            LED2_ON;

            password[num++] = 3;

            break;

        case 4:

            LED3_ON;

            password[num++] = 4;

            break;

        case 5:

            LED4_ON;

            password[num++] = 5;

            break;

        case 6:

            LED5_ON;

            password[num++] = 6;

            break;

        case 7:

            LED6_ON;

            password[num++] = 7;

            break;

  

        default:

            break;

    }

    if (num == 2) {

        if ((password[0] == 2) && (password[1] == 3)) {

            lock                              = 0;

            TKSlideModulePCBArray[0].OutValue = 0;

            level1();

        }

        ALL_LED_OFF();

        num = 0;

    }

}

  

void UpdateDisplay(void)

{

    if (exKeyValue != 0xff) {

        if (gTkIsValid == 0)//松手前只出一次键

        {

            gTkIsValid = 1;

            KeyValue   = exKeyValue;

            if (KeyValue != 0) {

                if (lock) {//是否上锁

                    unlock();

                    return;

                }

                switch (KeyValue) {

                    case 2:

                        LED1_TurnOver;

                        break;

                    case 3:

                        LED2_TurnOver;

                        break;

                    case 4:

                        LED3_TurnOver;

                        break;

                    case 5:

                        LED4_TurnOver;

                        break;

                    case 6:

                        LED5_TurnOver;

                        break;

                    case 7:

                        LED6_TurnOver;

                        break;

                    case 8:

                        ALL_LED_TurnOver();

                        break;

  

                    default:

                        exKeyValue = 0xff;

                        break;

                }

            }

        }

    } else {

        gTkIsValid = 0;

    }

}

  

/**************************************************

*函数名称:void DataProcessing(unsigned long int value)

*函数功能:对触控按键、滑轮、滑条扫描值处理

*入口参数:value

*出口参数:void  

**************************************************/

void DataProcessing()

{

    if (lock)

        return;

    if (TKSlideModulePCBArray[0].OutValue != 0)//判断是否被按下

    {

        //输出S1滑条滑动位置值

        //      printf("Bar:%d\n",TKSlideModulePCBArray[0].OutValue);

        /*不同挡位对应不同的LED灯 亮起*/

        if ((TKSlideModulePCBArray[0].OutValue > 0) && (TKSlideModulePCBArray[0].OutValue <= 4)) {

            level1();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 4) && (TKSlideModulePCBArray[0].OutValue <= 8)) {

            level2();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 8) && (TKSlideModulePCBArray[0].OutValue <= 12)) {

            level3();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 12) && (TKSlideModulePCBArray[0].OutValue <= 16)) {

            level4();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 16) && (TKSlideModulePCBArray[0].OutValue <= 20)) {

            level5();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 20) && (TKSlideModulePCBArray[0].OutValue <= 24)) {

            level6();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 24) && (TKSlideModulePCBArray[0].OutValue <= 28)) {

            level7();

        }

        if ((TKSlideModulePCBArray[0].OutValue > 28) && (TKSlideModulePCBArray[0].OutValue <= 32)) {

            level8();

            lock = 1;

        }

    }

}

  

/**************************************************

*函数名称:void  Sys_Scan(void)

*函数功能:扫描TK和显示

*入口参数:void

*出口参数:void  

**************************************************/

void Sys_Scan(void)

{

    if (SOCAPI_TouchKeyStatus & 0x80)//重要步骤2:  触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后

    {

        SOCAPI_TouchKeyStatus &= 0x7f;//清除标志位

  
  

        TK_exKeyValueFlag = TouchKeyScan();//扫描处理,获取触控按键等状态数据

        DataProcessing();                  //扫描TK更新数据并处理

        ChangeTouchKeyvalue();             //按键键值转换

        UpdateDisplay();                   //拿到键值 亮起对应LED

  

        TouchKeyRestart();//启动下一轮转换

    }

}

  

/**************************************************

*函数名称:void main(void)

*函数功能:

*入口参数:void

*出口参数:void

*功能说明:

**************************************************/

void main(void)

{

    Sys_Init();//系统初始化

  

    TouchKeyInit();//触控按键初始化

  

    while (1) {

        Sys_Scan();//扫描

    }

}
```
之后我们还可以利用芯片的其他资源来把他集成在其他东西上,作为一个真正的密码锁。

这么好玩的板子还是免费申领的,大家也可以来玩玩。
首先是登录[新定义商城])([Site Unreachable](https://www.rdsmcu.net/shop/#/)),注册个账号

首页就是我们的活动,两款板子,大家自己选择,我选的是赛元MB0036触摸滑条评估板

选择样品申请,就可以了。
新定义商城应该是刚刚开张,所以大家抓紧时间申请,还是非常值的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值