【沁恒试用】 使用触摸按键和GPIO完成拨号和挂断的功能 #3
本帖最后由 北方 于 2019-7-24 16:47 编辑<p>1、经过对基本功能的测试,进入了触摸手机的软件开发工作</p>
<p>2、首先选择CH549L的使用的引脚</p>
<p>参照下图,</p>
<p></p>
<p>对照扩展引脚的接口,</p>
<p></p>
<p>CH549 16通道触摸按键对用通道和引用,目前把CH4~CH7预留,直接跳到CH12~CH15,板载<br />
* CH0~CH15 分别对应引脚 P1.0~P1.7 P0.0~P0.7</p>
<p> 其中 硬件SPI接口预留<br />
CH549<br />
P1.4 = SCS<br />
P1.5 = MOSI<br />
P1.6 = MISO<br />
P1.7 = SCK</p>
<p>引用GPIO点亮LED灯,板载LED为P22~P25<br />
* LED 输出接口<br />
LED 0~12 分别对应引脚 P2.0~P2.7 P4.2~P4.5 <br />
* UART0 接口预留<br />
P3.0 = RXD <br />
P3.1 = TXD</p>
<p> </p>
<p>3. 代码说明如下</p>
<p>3.1 程序初始化后,扫描ADC口,读取touch的按键,对照用LED显示按键的位置</p>
<p>其中使用chneo变量来确定1-12个按键和对应的LED灯。</p>
<p>3.2 然后读取最后按下的按键,以离开为准,用switch~case来给uart0输出AT命令,按键11用ATD+号码拨出电话号码,用12号按键挂掉电话,用ATH命令。</p>
<p>3.3 在确定了按键读取后,就可以使用更丰富的按键组合来实现按键和电话拨打功能。</p>
<p> </p>
<p>3.4 代码如下:</p>
<pre>
<code>#include ".\Public\CH549.H"
#include ".\Public\DEBUG.H"
#include ".\TouchKey\TouchKey.H"
#include ".\SPI\SPI.H"
#pragmaNOAREGS
#define COLORED 0
#define UNCOLORED 1
UINT16 PowerValue;
UINT8 PressedKey; //保存触摸按键上电未触摸值
volatile UINT16 Press_Flag = 0; //按下标志位
UINT8C CPW_Table = { 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 = TouchKeySelect( ch,CPW_Table );
//printf("%d ",PowerValue );
}
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 );
err = ABS(PowerValue,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;
}
}
}
</code></pre>
<p><br />
4. 最后编译的结果有20个警告,是定义了变量空间没有访问,需要后续优化。</p>
<p></p>
<p>总共24+2个引脚被定义和使用,占了44个引脚的60%,仍然有扩展功能的空间,所有CH549L具有足够丰富的功能。</p>
<p>编译的二进制文档如下:<br />
<br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">北方</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></p>
<p><img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--112.gif" width="50" /></p>
页:
[1]