【沁恒试用】 使用触摸按键和GPIO完成拨号和挂断的功能 #3
[复制链接]
本帖最后由 北方 于 2019-7-24 16:47 编辑
1、经过对基本功能的测试,进入了触摸手机的软件开发工作
2、首先选择CH549L的使用的引脚
参照下图,
对照扩展引脚的接口,
CH549 16通道触摸按键对用通道和引用,目前把CH4~CH7预留,直接跳到CH12~CH15,板载
* CH0~CH15 分别对应引脚 P1.0~P1.7 P0.0~P0.7
其中 硬件SPI接口预留
CH549
P1.4 = SCS
P1.5 = MOSI
P1.6 = MISO
P1.7 = SCK
引用GPIO点亮LED灯,板载LED为P22~P25
* LED 输出接口
LED 0~12 分别对应引脚 P2.0~P2.7 P4.2~P4.5
* UART0 接口预留
P3.0 = RXD
P3.1 = TXD
3. 代码说明如下
3.1 程序初始化后,扫描ADC口,读取touch的按键,对照用LED显示按键的位置
其中使用chneo变量来确定1-12个按键和对应的LED灯。
3.2 然后读取最后按下的按键,以离开为准,用switch~case来给uart0输出AT命令,按键11用ATD+号码拨出电话号码,用12号按键挂掉电话,用ATH命令。
3.3 在确定了按键读取后,就可以使用更丰富的按键组合来实现按键和电话拨打功能。
3.4 代码如下:
#include ".\Public\CH549.H"
#include ".\Public\DEBUG.H"
#include ".\TouchKey\TouchKey.H"
#include ".\SPI\SPI.H"
#pragma NOAREGS
#define COLORED 0
#define UNCOLORED 1
UINT16 PowerValue[16];
UINT8 PressedKey; //保存触摸按键上电未触摸值
volatile UINT16 Press_Flag = 0; //按下标志位
UINT8C CPW_Table[16] = { 30,30,30,30, 30,30,30,30, //与板间电容有关的参数,分别对应每个按键
30,30,30,30, 30,30,30,30,
};
/*******************************************************************************
* Function Name : ABS
* Description : 求两个数差值的绝对值
* Input : a,b
* Output : None
* Return : 差值绝对值
*******************************************************************************/
UINT16 ABS(UINT16 a,UINT16 b)
{
if(a>b)
{
return (a-b);
}
else
{
return (b-a);
}
}
/*******************************************************************************
* Function Name : LED_Port_Init
* Description : LED引脚初始化,推挽输出
* P22~P25
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void LED_Port_Init(void)
{
P2 |= (0xFF); //默认熄灭
P2_MOD_OC &= ~(0xFF);
P2_DIR_PU |= (0xFF);
P4 |= (0xF<<2); //默认熄灭
P4_MOD_OC &= ~(0xF<<2);
P4_DIR_PU |= (0xF<<2);
}
/*******************************************************************************
* Function Name : LED_Control
* Description : 点灯控制
* Input : LEDx: 0~3 分别对应P22~P25四个LED灯(低驱) // Revised.
* status: 0:灭 1:亮
* Output : None
* Return : None
*******************************************************************************/
void LED_Control(UINT8 LEDx,UINT8 status)
{
if(LEDx>=8)
{
LEDx = LEDx - 8;
if(status) //点亮
{
P4 &= ~(1<<(2+LEDx));
}
else //熄灭
{
P4 |= (1<<(2+LEDx));
}
return;
}
if(LEDx>=0)
// (LEDx<8)
{
if(status) //点亮
{
P2 &= ~(1<<(LEDx));
}
else //熄灭
{
P2 |= (1<<(LEDx));
}
return;
}
}
//主函数
void main()
{
UINT8 ch;
UINT8 chneo;
UINT16 value;
UINT16 err;
UINT16 i=0; //触摸模拟变化差值
CfgFsys( ); //CH549时钟选择配置
mDelaymS(20);
mInitSTDIO( ); //串口0初始化
//printf("BitPhone start ...\n");
LED_Port_Init();
TouchKey_Init();
Press_Flag = 0; //无按键按下
/* 获取按键初值 */
for(chneo = 1; chneo!=12; chneo++)
{
if(chneo>4)
{
ch = chneo + 4;
}
if(chneo<=4)
{
ch = chneo;
}
PowerValue[ch] = TouchKeySelect( ch,CPW_Table[ch] );
//printf("%d ",PowerValue[ch] );
}
printf("\n");
//SPI setting
//SPIMasterModeSet(3);
//SPI_CK_SET(12);
//SCS = 0; //SPI主机发送数据
//CH549SPIMasterWrite(i);
//mDelaymS(5);
while(1)
{
//CH549SPIMasterWrite(i);
mDelaymS(5);
/* 按键检测 */
for(chneo = 1; chneo!=12; chneo++)
{
if(chneo>4)
{
ch = chneo + 4;
}
if(chneo<=4)
{
ch = chneo;
}
value = TouchKeySelect( ch,CPW_Table[ch] );
err = ABS(PowerValue[ch],value);
if( err > DOWM_THRESHOLD_VALUE ) //差值大于阈值,认为按下
{
if((Press_Flag & (1<<ch)) == 0) //说明是第一次按下
{
//printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
/* 点灯处理 */
LED_Control(chneo,1);
//LED_Control(chneo-6,1);
}
Press_Flag |= (1<<ch);
}
else if( err < UP_THRESHOLD_VALUE ) //说明抬起或者未按下
{
if(Press_Flag & (1<<ch)) //刚抬起
{
Press_Flag &= ~(1<<ch);
//printf("ch %d up,value:%d\n",(UINT16)ch, value);
/* 灭灯处理 */
LED_Control(chneo,0);
//LED_Control(chneo-6,0);
PressedKey= chneo;
}
}
}
switch (PressedKey)
{
case 1:
PressedKey=0;
printf("0");
break;
case 2:
PressedKey=0;
printf("1");
break;
case 3:
PressedKey=0;
printf("2");
break;
case 4:
PressedKey=0;
printf("3");
break;
case 5:
PressedKey=0;
printf("4");
break;
case 6:
PressedKey=0;
printf("5");
break;
case 7:
PressedKey=0;
printf("6");
break;
case 8:
PressedKey=0;
printf("7");
break;
case 9:
PressedKey=0;
printf("8");
break;
case 10:
PressedKey=0;
printf("9");
break;
case 11: //Call
PressedKey=0;
printf("ATD");
break;
case 12:
PressedKey=0;
printf("\n");
break;
case 0: // Hand Off
PressedKey=0;
printf("ATH");
break;
}
}
}
4. 最后编译的结果有20个警告,是定义了变量空间没有访问,需要后续优化。
总共24+2个引脚被定义和使用,占了44个引脚的60%,仍然有扩展功能的空间,所有CH549L具有足够丰富的功能。
编译的二进制文档如下:
txttouch.hex
(7.44 KB, 下载次数: 2)
此内容由EEWORLD论坛网友北方原创,如需转载或用于商业用途需征得作者同意并注明出处
|