本次赛元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触摸滑条评估板
选择样品申请,就可以了。
新定义商城应该是刚刚开张,所以大家抓紧时间申请,还是非常值的。