OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 950|回复: 1

电话按键板程序,请帮我讲讲主函数里怎么写?思路和结构?

[复制链接]

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
发表于 2018-5-7 20:16:25 | 显示全部楼层 |阅读模式
2金钱
本人新手,最近在写一个按键电话板程序,写好了俩个子函数,一个ht9200a函数,另一个是keyscan()函数,现在写主函数,但不知道怎么写?请高手指点一二,帮我分析下思路和结构,
#include"stm32f10x.h"
#include "delay.h"
u8 PhoneNum[11]={};
static uint8_t keyDown = 0;
static uint8_t keyContinue = 0;
static uint8_t keyUp = 0;
#define KEY_LONG_TIME 100  //1s
#define KEY_REPEAT_SPEED 5 //50ms
       
#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4
#define KEY5 5
#define KEY6 6
#define KEY7 7
#define KEY8 8
#define KEY9 9
#define KEY_XING 10
#define KEY_JING 11
#define KEY0     12
#define KEY_MianTi 13
       
void KEY_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;//KEY5-KEY1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//KEY-MianTi,key#,key*,key0,key9,key8,key7,key6
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

static uint8_t getKeyState(void)
        {
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
        return 12;
    else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12) == 0)
        return 1;
    else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11) == 0)
        return 2;
    else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)
         return 3;
   else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9) == 0)
        return 4;
    else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0)
         return 5;       
    else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15) == 0)
        return 6;
    else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == 0)
        return 7;
    else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0)
        return 8;
   else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == 0)
        return 9;
    else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
                          return 11;
   else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0)
        return 10;
   else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
       return 13;
  else
        return 0;
}

void keyScan(void)
        {
    uint8_t readData = 0;
    static uint16_t longKeyTime = 0;
    static uint8_t repeatCount = 0;

                readData = getKeyState();
                keyDown  = readData & (readData ^ keyContinue);
                keyUp =  readData ^ (readData | keyContinue);
                keyContinue = readData;
               
       
        if(keyDown){
        switch(keyDown){
        case KEY1:
            break;
        case KEY2:
            break;
        case KEY3:
            break;
        case KEY4:
            break;
        case KEY5:
            break;
        case KEY6:
            break;
        case KEY7:
            break;
        case KEY8:
            break;
        case KEY9:
            break;
        case KEY_XING:
            break;
        case KEY_JING:
            break;
        case KEY_MianTi:
            break;
        case KEY0:
            break;
        default: break;
        }
    }else
               
                 if(keyContinue){
        if(longKeyTime < KEY_LONG_TIME){
                               
        if(++longKeyTime == KEY_LONG_TIME){
          switch(keyContinue){
                                        case KEY1:
                                                        break;
                                        case KEY2:
                                                        break;
                                        case KEY3:
                                                        break;
                                        case KEY4:
                                                        break;
                                        case KEY5:
                                                        break;
                                        case KEY6:
                                                        break;
                                        case KEY7:
                                                        break;
                                        case KEY8:
                                                        break;
                                        case KEY9:
                                                        break;
                                        case KEY_XING:
                                                        break;
                                        case KEY_JING:
                                                        break;
                                        case KEY_MianTi:
                                                        break;
                                        case KEY0:
                                                        break;
                                        default: break;
                                        }
                                }
                }else{
                               
                        if(++repeatCount >= KEY_REPEAT_SPEED){
          repeatCount = 0;
          switch(keyContinue){                       
                                        case KEY1:
              break;
                                        case KEY2:
                                                        break;
                                        case KEY3:
                                                        break;
                                        case KEY4:
                                                        break;
                                        case KEY5:
                                                        break;
                                        case KEY6:
                                                        break;
                                        case KEY7:
                                                        break;
                                        case KEY8:
                                                        break;
                                        case KEY9:
                                                        break;
                                        case KEY_XING:
                                                        break;
                                        case KEY_JING:
                                                        break;
                                        case KEY_MianTi:
                                                        break;
                                        case KEY0:
                                                        break;
                                        default: break;
                                        }
                                }
                        }
                }else
               
                        if(keyUp){

        longKeyTime = 0;
        repeatCount = 0;

        switch(keyUp){
                                        case KEY1:
                                                                break;
                                                case KEY2:
                                                                break;
                                                case KEY3:
                                                                break;
                                                case KEY4:
                                                                break;
                                                case KEY5:
                                                                break;
                                                case KEY6:
                                                                break;
                                                case KEY7:
                                                                break;
                                                case KEY8:
                                                                break;
                                                case KEY9:
                                                                break;
                                                case KEY_XING:
                                                                break;
                                                case KEY_JING:
                                                                break;
                                                case KEY_MianTi:
                                                                break;
                                                case KEY0:
                                                                break;
                                                default: break;
                                        }
                                }
}       
               
  void TEL_CE_init()
        {
    GPIO_InitTypeDef GPIO_InitStructure;
          RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);
       
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOC,&GPIO_InitStructure);
                GPIO_SetBits(GPIOC,GPIO_Pin_13);       
  }
       
  void TEL_CLK_init()
  {
    GPIO_InitTypeDef GPIO_InitStructure;
          RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);
       
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOC,&GPIO_InitStructure);
                GPIO_SetBits(GPIOC,GPIO_Pin_14);       
  }


        void TEL_DATA_init()
  {
    GPIO_InitTypeDef GPIO_InitStructure;
          RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);
       
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOC,&GPIO_InitStructure);
                GPIO_SetBits(GPIOC,GPIO_Pin_15);
  }
       
void Ht9200SndByte(u8 num)
{
                u8 i;
                for(i=0;i<5;i++)
                 {
                                u8 SND_DATA;
                                GPIO_SetBits(GPIOC,GPIO_Pin_13);//HT_CE=0
                                GPIO_SetBits(GPIOC,GPIO_Pin_14);//HT_CLK=1,
                                SND_DATA=0x01 & num;
                                GPIO_ResetBits(GPIOC,GPIO_Pin_14);//HT_CLK=0,       
                                num >>=1;//óòò&#198;ò&#187;&#206;&#187;
                 }
                                delay_ms(50);
}

void Ht9200(u8 *IP)
{
u8 num;
GPIO_SetBits(GPIOC,GPIO_Pin_13);//HT_CE=0
delay_ms(10);       
while(*IP!=0xff)
{
  if(*IP=='0')
        num=0x0a;
  else if(*IP=='*')
  num=0x0b;
  else if (*IP=='#')
  num=0x0c;
        num=0xff;
        Ht9200SndByte(num);
}
        Ht9200SndByte(0xff);
  GPIO_SetBits(GPIOC,GPIO_Pin_13);//HT_CE=1
}
       

int main()
{
        delay_init();
  while(1)
        {
               
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-8 01:27:00 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 20:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表