北方 发表于 2019-7-24 16:44

【沁恒试用】 使用触摸按键和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 />
* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CH0~CH15 分别对应引脚 P1.0~P1.7 &nbsp;P0.0~P0.7</p>

<p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;其中 硬件SPI接口预留<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CH549<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;P1.4 &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp; SCS<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;P1.5 &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp; MOSI<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;P1.6 &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp; MISO<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;P1.7 &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp; SCK</p>

<p>引用GPIO点亮LED灯,板载LED为P22~P25<br />
* &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LED 输出接口<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; LED 0~12 分别对应引脚 P2.0~P2.7 P4.2~P4.5 &nbsp;&nbsp;<br />
* &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;UART0 接口预留<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;P3.0 = RXD &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;P3.1 = TXD</p>

<p>&nbsp;</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>&nbsp;</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&gt;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 &amp;= ~(0xFF);
    P2_DIR_PU |= (0xFF);
    P4 |= (0xF&lt;&lt;2);                                                          //默认熄灭
    P4_MOD_OC &amp;= ~(0xF&lt;&lt;2);
    P4_DIR_PU |= (0xF&lt;&lt;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&gt;=8)
    {
        LEDx = LEDx - 8;
    if(status)                                                                //点亮
    {
      P4 &amp;= ~(1&lt;&lt;(2+LEDx));
    }
    else                                                                      //熄灭
    {
      P4 |= (1&lt;&lt;(2+LEDx));
    }
                return;
    }
       
        if(LEDx&gt;=0)
        // (LEDx&lt;8)
    {                  
    if(status)                                                                //点亮
    {
      P2 &amp;= ~(1&lt;&lt;(LEDx));
    }
    else                                                                      //熄灭
    {
      P2 |= (1&lt;&lt;(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&gt;4)
                  {
                        ch = chneo + 4;
                        }                       
                if(chneo&lt;=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&gt;4)
                  {
                        ch = chneo + 4;
                        }       
                        if(chneo&lt;=4)
                  {
                        ch = chneo;
                        }

            value = TouchKeySelect( ch,CPW_Table );
            err = ABS(PowerValue,value);
            if( err &gt; DOWM_THRESHOLD_VALUE )                                 //差值大于阈值,认为按下
            {
                if((Press_Flag &amp; (1&lt;&lt;ch)) == 0)                              //说明是第一次按下
                {
                  //printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
                  /* 点灯处理 */
                  LED_Control(chneo,1);
                                        //LED_Control(chneo-6,1);
                }
                Press_Flag |= (1&lt;&lt;ch);
            }
            else if( err &lt; UP_THRESHOLD_VALUE )                              //说明抬起或者未按下
            {
                if(Press_Flag &amp; (1&lt;&lt;ch))                                       //刚抬起
                {
                  Press_Flag &amp;= ~(1&lt;&lt;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>

沁恒USB单片机 发表于 2019-7-25 09:24

<p><img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--112.gif" width="50" /></p>
页: [1]
查看完整版本: 【沁恒试用】 使用触摸按键和GPIO完成拨号和挂断的功能 #3