21ic问答首页 - 赛元单片机触摸没反应,新手求带。。。
赛元单片机触摸没反应,新手求带。。。
fzhlpp2020-12-19
按照指南操作静态码调试正常,在我的板子上从Touch key Tool Menu图表窗口可以看到手触摸的时候波形变化,也成功变成绿色,但是不知道怎么调试动态,因为静态是用的他们官网下载的静态码直接烧录就可以了,而动态没有直接烧录的码,要从自己的代码里面做进去,就复杂了,按照他们指南操作下来弄了一天硬是一点反应没有,求大哥大姐指导: //************************************************************
// Copyright (c) 深圳市赛元微电子有限公司
// 文件名称 : main.c
// 作者 : Yanni
// 模块功能 : SC91F8311触控DEMO
// 最后更正日期:
// 版本 : 2015-12-25:
// :
//*************************************************************
#include "h\SC92F836XB_C.h"
#include<intrins.h>
#include "h\data_type.h"
#include "lib\SensorMethod.h"
#define _TOUCHKEY_DEBUG_
#ifdef _TOUCHKEY_DEBUG_
#include "SOC_DebugTouchKey_Lib\SOC_DebugTouchKey.h"
#endif
#define nop _nop_(); //???
//*****************全局变量区***************************************************
INT32U exKeyValueFlag = 0; //当前轮按键标志
INT8U Timercount = 0; //定时器计数
//BOOL TimerFlag_1ms = 0; //定时器1MS标志
uchar a,b,c;
//*****************全局变量区***************************************************
BOOL TimerFlag_1s,TimerFlag_1ms,TimerFlag_10s = 0; //定时器1MS标志
INT8U Flag_1s ,Flag_1ms,Flag_10s=0;
INT8U gTkIsValid = 0; //按键有效标志
INT8U exKeyValue = 0; //当前轮按键键值
INT8U KeyValue = 0; //按键键值
sbit sda=P2^5; //TM1640???
sbit scl=P2^6; //TM1640???
uchar dis[]={0xFE,0x30,0xD5,0x75,0x39,0x6F,0xEF,0x34,0xFF,0x7F,0xBF,0xFF,0xCE,0xF3,0xCF,0x8F,0xFF,0xff};//???
// //0 1 2 3 4 5 6 7 8 9 a b c d e f ?? ??
void delay(INT16U z) //?????
{
uint x,y;
for(x=z;x>0;x--)
for(y=487;y>0;y--);
}
//*********START***********************************************
void start() //1640??
{
sda=1;
nop nop
scl=1;
nop nop
sda=0;
}
//**************************************************************
void stop() //1640??
{
scl=0;
nop nop
sda=0;
scl=1;
nop nop
sda=1;
nop nop
}
//***********************************************************
void write(uchar date) //1640???
{
uchar i;
for(i=0;i<8;i++)
{
scl=0;
if(date&0x01)
{
sda=1;
nop nop
}
else
{
sda=0;
nop nop
}
scl=1;
nop
date=date>>1;
}
}
//**************?TM1640??????***************************
void send(uchar T,uchar time,uchar led)
{
uchar i;
start();
write(0x44); //设置芯片工作模式,这里选地址自动加1
stop();
start();
write(0xc0);//设置首地址,数码管的位选值
for(i=0;i<16;i++)//地址自加不必每次都写地址,传输显示数据,最多16字节不能多写
{
if(i==0)write(dis[T/100]); //GRID1
if(i==1)write(dis[T/10%10]); //GRID2
if(i==2)write(dis[T%10]); //GRID3
if(i==3)write(dis[time/10]); //GRID4
if(i==4)write(dis[time%10]); //GRID5
if(i==5)write(led&0xff); //GRID6
if(i==6)write(0x00);
if(i==7)write(0x00);
if(i==8)write(led&0xff); //GRID9
if(i==9)write(0x00);
if(i==10)write(0x00);
if(i==11)write(0x00);
if(i==12)write(0x00);
if(i==13)write(0x00);
if(i==14)write(0x00);
if(i==15)write(led&0xff);//GRID16
delay(20);
}
stop();
start();
write(0x89); //亮度选择
stop();
}
/**************************************************
*函数名称:void TimerInit(void)
*函数功能:定时器初始化
*入口参数:void
*出口参数:void
**************************************************/
void TimerInit(void)
{
TMCON = (TMCON&0xfe)|(0<<0); //bit0: 0为FOSC/12,1为FOSO
TMOD = TMOD&0xf0; //设置定时0,工作方式0
TMOD = TMOD|0x00;
TH0=(8192-1000)/32; //1000*1=1000us ,1MS
TL0=(8192-1000)%32;
TF0 = 0; //清中断标志
TR0=0; //关定时器0
ET0=1; //使能定时器0中断
TR0=1;
}
/**************************************************
*函数名称:void timer0()interrupt 1
*函数功能:定时器中断服务函数
*入口参数:void
*出口参数:void
**************************************************/
void timer0()interrupt 1
{
TH0 = (8192-1000)/32; //2000*1/4us=500us
TL0 = (8192-1000)%32;
TimerFlag_1ms = 1;
}
/**************************************************
*函数名称:void Sys_Init(void)
*函数功能:系统初始化
*入口参数:void
*出口参数:void
**************************************************/
void Sys_Init(void)
{
WDTCON = 0x10; //1--1 -- 00 开WDT,WDT清0,WDT 524.288ms溢出;烧录时,可Code Option选择ENWDT
//TK对应的IO设置为强推挽输出1
P0CON = 0xFF;
P0PH = 0xFF;
P1CON = 0xFF;
P1PH = 0xFF;
P2CON = 0xFF;
P2PH = 0xFF;
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P5 = 0x00;
EA = 1; //开总中断
TimerInit(); //定时器初始化
}
/**************************************************
*函数名称:void ChangeTouchKeyvalue(void)
*函数功能:转换TK键值
*入口参数:void
*出口参数:void
**************************************************/
void ChangeTouchKeyvalue(void)
{
switch(exKeyValueFlag)
{
//不同间距不同大小的按键
case 0x00000001:exKeyValue = 1;break;
case 0x00000002:exKeyValue = 2;break;
case 0x00000004:exKeyValue = 3;break;
case 0x00000006:exKeyValue = 4;break;
case 0x0000001f:exKeyValue = 5;break;
default:exKeyValue = 0xff;break;
}
}
/**************************************************
*函数名称:void UpdateLcdBufFunc(void)
*函数功能:更新显示数据函数
*入口参数:void
*出口参数:void
**************************************************/
void UpdateLcdBufFunc(void)
{
if(exKeyValue != 0xff)
{a++;
if(gTkIsValid == 0) //松手前只出一次键
{
gTkIsValid = 1;
KeyValue=exKeyValue;
switch(KeyValue)
{
//不同间距不同大小的按键
case 1:a++; //break;
case 2:b=55;break;
case 3:c=11;break;
case 4:b=26;break;
case 5:c=1;break;
default:exKeyValue = 0xff;break;
}
}
}
else
{
gTkIsValid = 0;
}
}
/**************************************************
*函数名称:void Sys_Scan(void)
*函数功能:扫描TK和显示
*入口参数:void
*出口参数:void
**************************************************/
/*
void Sys_Scan(void)
{
if(SOCAPI_TouchKeyStatus&0x80) //重要步骤2: 触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后
{
SOCAPI_TouchKeyStatus &= 0x7f; //重要步骤3: 清除标志位, 需要外部清除。
exKeyValueFlag = TouchKeyScan();//按键数据处理函数
TouchKeyRestart(); //启动下一轮转换
}
}
*/
/**************************************************
*函数名称:void Sys_Scan(void)
*函数功能:扫描TK和显示
*入口参数:void
*出口参数:void
**************************************************/
void Sys_Scan(void)
{
if(SOCAPI_TouchKeyStatus&0x80) //重要步骤2: 触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后
{
SOCAPI_TouchKeyStatus &= 0x7f; //重要步骤3: 清除标志位, 需要外部清除。
exKeyValueFlag = TouchKeyScan();//按键数据处理函数
ChangeTouchKeyvalue(); //转换键值
UpdateLcdBufFunc(); //更新显示数据
TouchKeyRestart(); //启动下一轮转换
}
}
/**************************************************
*函数名称:void main(void)
*函数功能:主函数
*入口参数:void
*出口参数:void
**************************************************/
void main(void)
{
Sys_Init();//触控按键初始化
#ifdef _TOUCHKEY_DEBUG_SOCAPI_
DeBugTouchKey_Init();
#endif
TouchKeyInit();
while(1)
{
WDTCON = 0x10;
send(a,b,c);
//if(exKeyValueFlag==0)
if(TimerFlag_1ms==1)
{
TimerFlag_1ms=0;
Timercount++;
if(Timercount>10)
{
Timercount=0;
Sys_Scan();
}
}
}
}
// Copyright (c) 深圳市赛元微电子有限公司
// 文件名称 : main.c
// 作者 : Yanni
// 模块功能 : SC91F8311触控DEMO
// 最后更正日期:
// 版本 : 2015-12-25:
// :
//*************************************************************
#include "h\SC92F836XB_C.h"
#include<intrins.h>
#include "h\data_type.h"
#include "lib\SensorMethod.h"
#define _TOUCHKEY_DEBUG_
#ifdef _TOUCHKEY_DEBUG_
#include "SOC_DebugTouchKey_Lib\SOC_DebugTouchKey.h"
#endif
#define nop _nop_(); //???
//*****************全局变量区***************************************************
INT32U exKeyValueFlag = 0; //当前轮按键标志
INT8U Timercount = 0; //定时器计数
//BOOL TimerFlag_1ms = 0; //定时器1MS标志
uchar a,b,c;
//*****************全局变量区***************************************************
BOOL TimerFlag_1s,TimerFlag_1ms,TimerFlag_10s = 0; //定时器1MS标志
INT8U Flag_1s ,Flag_1ms,Flag_10s=0;
INT8U gTkIsValid = 0; //按键有效标志
INT8U exKeyValue = 0; //当前轮按键键值
INT8U KeyValue = 0; //按键键值
sbit sda=P2^5; //TM1640???
sbit scl=P2^6; //TM1640???
uchar dis[]={0xFE,0x30,0xD5,0x75,0x39,0x6F,0xEF,0x34,0xFF,0x7F,0xBF,0xFF,0xCE,0xF3,0xCF,0x8F,0xFF,0xff};//???
// //0 1 2 3 4 5 6 7 8 9 a b c d e f ?? ??
void delay(INT16U z) //?????
{
uint x,y;
for(x=z;x>0;x--)
for(y=487;y>0;y--);
}
//*********START***********************************************
void start() //1640??
{
sda=1;
nop nop
scl=1;
nop nop
sda=0;
}
//**************************************************************
void stop() //1640??
{
scl=0;
nop nop
sda=0;
scl=1;
nop nop
sda=1;
nop nop
}
//***********************************************************
void write(uchar date) //1640???
{
uchar i;
for(i=0;i<8;i++)
{
scl=0;
if(date&0x01)
{
sda=1;
nop nop
}
else
{
sda=0;
nop nop
}
scl=1;
nop
date=date>>1;
}
}
//**************?TM1640??????***************************
void send(uchar T,uchar time,uchar led)
{
uchar i;
start();
write(0x44); //设置芯片工作模式,这里选地址自动加1
stop();
start();
write(0xc0);//设置首地址,数码管的位选值
for(i=0;i<16;i++)//地址自加不必每次都写地址,传输显示数据,最多16字节不能多写
{
if(i==0)write(dis[T/100]); //GRID1
if(i==1)write(dis[T/10%10]); //GRID2
if(i==2)write(dis[T%10]); //GRID3
if(i==3)write(dis[time/10]); //GRID4
if(i==4)write(dis[time%10]); //GRID5
if(i==5)write(led&0xff); //GRID6
if(i==6)write(0x00);
if(i==7)write(0x00);
if(i==8)write(led&0xff); //GRID9
if(i==9)write(0x00);
if(i==10)write(0x00);
if(i==11)write(0x00);
if(i==12)write(0x00);
if(i==13)write(0x00);
if(i==14)write(0x00);
if(i==15)write(led&0xff);//GRID16
delay(20);
}
stop();
start();
write(0x89); //亮度选择
stop();
}
/**************************************************
*函数名称:void TimerInit(void)
*函数功能:定时器初始化
*入口参数:void
*出口参数:void
**************************************************/
void TimerInit(void)
{
TMCON = (TMCON&0xfe)|(0<<0); //bit0: 0为FOSC/12,1为FOSO
TMOD = TMOD&0xf0; //设置定时0,工作方式0
TMOD = TMOD|0x00;
TH0=(8192-1000)/32; //1000*1=1000us ,1MS
TL0=(8192-1000)%32;
TF0 = 0; //清中断标志
TR0=0; //关定时器0
ET0=1; //使能定时器0中断
TR0=1;
}
/**************************************************
*函数名称:void timer0()interrupt 1
*函数功能:定时器中断服务函数
*入口参数:void
*出口参数:void
**************************************************/
void timer0()interrupt 1
{
TH0 = (8192-1000)/32; //2000*1/4us=500us
TL0 = (8192-1000)%32;
TimerFlag_1ms = 1;
}
/**************************************************
*函数名称:void Sys_Init(void)
*函数功能:系统初始化
*入口参数:void
*出口参数:void
**************************************************/
void Sys_Init(void)
{
WDTCON = 0x10; //1--1 -- 00 开WDT,WDT清0,WDT 524.288ms溢出;烧录时,可Code Option选择ENWDT
//TK对应的IO设置为强推挽输出1
P0CON = 0xFF;
P0PH = 0xFF;
P1CON = 0xFF;
P1PH = 0xFF;
P2CON = 0xFF;
P2PH = 0xFF;
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P5 = 0x00;
EA = 1; //开总中断
TimerInit(); //定时器初始化
}
/**************************************************
*函数名称:void ChangeTouchKeyvalue(void)
*函数功能:转换TK键值
*入口参数:void
*出口参数:void
**************************************************/
void ChangeTouchKeyvalue(void)
{
switch(exKeyValueFlag)
{
//不同间距不同大小的按键
case 0x00000001:exKeyValue = 1;break;
case 0x00000002:exKeyValue = 2;break;
case 0x00000004:exKeyValue = 3;break;
case 0x00000006:exKeyValue = 4;break;
case 0x0000001f:exKeyValue = 5;break;
default:exKeyValue = 0xff;break;
}
}
/**************************************************
*函数名称:void UpdateLcdBufFunc(void)
*函数功能:更新显示数据函数
*入口参数:void
*出口参数:void
**************************************************/
void UpdateLcdBufFunc(void)
{
if(exKeyValue != 0xff)
{a++;
if(gTkIsValid == 0) //松手前只出一次键
{
gTkIsValid = 1;
KeyValue=exKeyValue;
switch(KeyValue)
{
//不同间距不同大小的按键
case 1:a++; //break;
case 2:b=55;break;
case 3:c=11;break;
case 4:b=26;break;
case 5:c=1;break;
default:exKeyValue = 0xff;break;
}
}
}
else
{
gTkIsValid = 0;
}
}
/**************************************************
*函数名称:void Sys_Scan(void)
*函数功能:扫描TK和显示
*入口参数:void
*出口参数:void
**************************************************/
/*
void Sys_Scan(void)
{
if(SOCAPI_TouchKeyStatus&0x80) //重要步骤2: 触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后
{
SOCAPI_TouchKeyStatus &= 0x7f; //重要步骤3: 清除标志位, 需要外部清除。
exKeyValueFlag = TouchKeyScan();//按键数据处理函数
TouchKeyRestart(); //启动下一轮转换
}
}
*/
/**************************************************
*函数名称:void Sys_Scan(void)
*函数功能:扫描TK和显示
*入口参数:void
*出口参数:void
**************************************************/
void Sys_Scan(void)
{
if(SOCAPI_TouchKeyStatus&0x80) //重要步骤2: 触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后
{
SOCAPI_TouchKeyStatus &= 0x7f; //重要步骤3: 清除标志位, 需要外部清除。
exKeyValueFlag = TouchKeyScan();//按键数据处理函数
ChangeTouchKeyvalue(); //转换键值
UpdateLcdBufFunc(); //更新显示数据
TouchKeyRestart(); //启动下一轮转换
}
}
/**************************************************
*函数名称:void main(void)
*函数功能:主函数
*入口参数:void
*出口参数:void
**************************************************/
void main(void)
{
Sys_Init();//触控按键初始化
#ifdef _TOUCHKEY_DEBUG_SOCAPI_
DeBugTouchKey_Init();
#endif
TouchKeyInit();
while(1)
{
WDTCON = 0x10;
send(a,b,c);
//if(exKeyValueFlag==0)
if(TimerFlag_1ms==1)
{
TimerFlag_1ms=0;
Timercount++;
if(Timercount>10)
{
Timercount=0;
Sys_Scan();
}
}
}
}
赞0
虽然没有找到但还是要谢谢你的回复,去你空间看了是有好多有关赛元的,也有关按键操作的,但不是触摸,我现在遇到的是触摸单击功能可以,想不出怎么实现触摸长按功能。
评论
2020-12-20
赞0
评论
2020-12-20
赞0
评论
2020-12-20
赞0
评论
2020-12-20
您需要登录后才可以回复 登录 | 注册