5116|1

426

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【沁恒试用】 使用触摸按键和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论坛网友北方原创,如需转载或用于商业用途需征得作者同意并注明出处

最新回复

  详情 回复 发表于 2019-7-25 09:24
点赞 关注
 
 

回复
举报

305

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
个人签名单价1元含税的USB和Touchkey单片机CH551G已大批量出货,试样QQ:1258305301
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表