打印
[综合信息]

【华大测评】+矩阵键盘

[复制链接]
1245|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原理图:

程序:
/*******************************************************************************
* Include files
******************************************************************************/
#include "hc32_ddl.h"

/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/

/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/* KEYOUT port, pin definition */
#define  KEYOUT_PORT        (PortA)
#define  KEYOUT0_PIN        (Pin04)
#define  KEYOUT1_PIN        (Pin05)
#define  KEYOUT2_PIN        (Pin06)

/* KEYIN port, pin definition */
#define  KEYIN_PORT         (PortD)
#define  KEYIN0_PIN         (Pin12)
#define  KEYIN1_PIN         (Pin13)
#define  KEYIN2_PIN         (Pin14)


/* LED0 Port/Pin definition */
#define  LED0_PORT          (PortE)
#define  LED0_PIN           (Pin06)

/* LED1 Port/Pin definition */
#define  LED1_PORT          (PortA)
#define  LED1_PIN           (Pin07)

/* LED2 Port/Pin definition */
#define  LED2_PORT          (PortB)
#define  LED2_PIN           (Pin05)

/* LED3 Port/Pin definition */
#define  LED3_PORT          (PortB)
#define  LED3_PIN           (Pin09)

/* LED0~3 toggle definition */
#define  LED0_TOGGLE()      (PORT_Toggle(LED0_PORT, LED0_PIN))
#define  LED1_TOGGLE()      (PORT_Toggle(LED1_PORT, LED1_PIN))
#define  LED2_TOGGLE()      (PORT_Toggle(LED2_PORT, LED2_PIN))
#define  LED3_TOGGLE()      (PORT_Toggle(LED3_PORT, LED3_PIN))

/* uncomment this line if wants to print information to Terminal I/O window */
#define  __PRINT_TO_TERMINAL

/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/

/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/

/**
*******************************************************************************
** \brief ExtInt12 as key row 0 callback function
**
** \param  None
**
** \retval None
**
******************************************************************************/
unsigned int keynum;

/**
*******************************************************************************
** \brief ExtInt13 as key row 1 callback function
**
** \param  None
**
** \retval None
**
******************************************************************************/
void delay_ms(unsigned int k)
{
        unsigned int i,j;
        for(i=0;i<k;i++)
                for(j=0;j<300;j++);
}

/**
*******************************************************************************
** \brief LED 0~3 init function
**
** \param  None
**
** \retval None
**
******************************************************************************/
void Led_Init(void)
{
    stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_Out;

    /* LED0 Port/Pin initialization */
    PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(LED1_PORT, LED1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(LED2_PORT, LED2_PIN, &stcPortInit);

    /* LED3 Port/Pin initialization */
    PORT_Init(LED3_PORT, LED3_PIN, &stcPortInit);
}

void Key_Init(void)
{
    stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_Out;

    /* LED0 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT2_PIN, &stcPortInit);

                stcPortInit.enPinMode = Pin_Mode_In;
                /* enable internal pull-up */
    stcPortInit.enPullUp = Enable;
    /* LED0 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN2_PIN, &stcPortInit);
}


void Hang_Output(void)
{
                stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_Out;

   
    /* LED0 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN2_PIN, &stcPortInit);
}

void Hang_Input(void)
{
                stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

   

                stcPortInit.enPinMode = Pin_Mode_In;
                /* enable internal pull-up */
    stcPortInit.enPullUp = Enable;
    /* LED0 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(KEYIN_PORT, KEYIN2_PIN, &stcPortInit);
}

void Lie_Output(void)
{
                stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_Out;

    /* LED0 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT2_PIN, &stcPortInit);

               
}

void Lie_Input(void)
{
                stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_In;
                /* enable internal pull-up */
    stcPortInit.enPullUp = Enable;

    /* LED0 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(KEYOUT_PORT, KEYOUT2_PIN, &stcPortInit);

               
}

unsigned int GetKey(void)
{
       
        unsigned int keyvalue = 0;
        uint16_t hangvalue=0,lievalue;
       
// 第1回合第1步
        PORT_ResetBits(KEYOUT_PORT, KEYOUT0_PIN);
        PORT_ResetBits(KEYOUT_PORT, KEYOUT1_PIN);
        PORT_ResetBits(KEYOUT_PORT, KEYOUT2_PIN);
       
        hangvalue=((PORT_GetData(KEYIN_PORT)&0x7000)>>12);
       
        if (hangvalue != 0x07)// 从IO口输入,读IO口
        {
        // 读出的不是0x0f说明有按键被按下
        // 第1回合第2步:读出端口从读出值来判断是哪一行
                delay_ms(10);
                Hang_Output();
                Lie_Input();
        // 第一回合中算出行号
                switch (hangvalue)
                {
                        case 0x3:
                                       
                                        PORT_ResetBits(KEYIN_PORT, KEYIN0_PIN);
                                        lievalue=((PORT_GetData(KEYOUT_PORT)&0x70)>>4);
                                        switch(lievalue)
                                        {
                                                case 0x03:
                                                        keyvalue=1;
                                                        break;
                                                case 0x05:
                                                        keyvalue=2;
                                                        break;
                                                case 0x06:
                                                        keyvalue=3;
                                                        break;
                                               
                                        }
                                break;
                        case 0x5:
                                       
                                        PORT_ResetBits(KEYIN_PORT, KEYIN1_PIN);
                                        lievalue=((PORT_GetData(KEYOUT_PORT)&0x70)>>4);
                                        switch(lievalue)
                                        {
                                                case 0x03:
                                                        keyvalue=4;
                                                        break;
                                                case 0x05:
                                                        keyvalue=5;
                                                        break;
                                                case 0x06:
                                                        keyvalue=6;
                                                        break;
                                               
                                        }
                                break;
                        case 0x6:
                                       
                                        PORT_ResetBits(KEYIN_PORT, KEYIN2_PIN);
                                        lievalue=((PORT_GetData(KEYOUT_PORT)&0x70)>>4);
                                        switch(lievalue)
                                        {
                                                case 0x03:
                                                        keyvalue=7;
                                                        break;
                                                case 0x05:
                                                        keyvalue=8;
                                                        break;
                                                case 0x06:
                                                        keyvalue=9;
                                                        break;
                                               
                                        }
                                break;
                       
                        default: break;
                       
                }
                Hang_Input();
                Lie_Output();
                PORT_ResetBits(KEYOUT_PORT, KEYOUT0_PIN);
                PORT_ResetBits(KEYOUT_PORT, KEYOUT1_PIN);
                PORT_ResetBits(KEYOUT_PORT, KEYOUT2_PIN);
                hangvalue=((PORT_GetData(KEYIN_PORT)&0x7000)>>12);
               
                while (hangvalue != 0x07)
                {
                        hangvalue=((PORT_GetData(KEYIN_PORT)&0x7000)>>12);
                }
                return keyvalue;
        }
        return 0;
}

/**
*******************************************************************************
** \brief  main function for KEYSCAN function
**
** \param  None
**
** \return int32_t Return value, if needed
**
******************************************************************************/
int32_t main(void)
{
               
    /* LED init */
    Led_Init();

#ifdef __PRINT_TO_TERMINAL
    /* Uart printf port initialize */
    Ddl_UartInit();
#endif

   Key_Init();


   

    while(1)
    {
        keynum=GetKey();
                                if(keynum!=0)
                                        printf("Key %d is pressed.\n", keynum);
    }
}

/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
效果图:
工程:
Keyboard.rar (803.44 KB)

使用特权

评论回复
沙发
中子家| | 2020-6-8 09:12 | 只看该作者
不错,点个赞

使用特权

评论回复
板凳
Cjy_JDxy|  楼主 | 2020-6-8 09:17 | 只看该作者

谢谢

使用特权

评论回复
地板
caizhiwei| | 2020-6-27 22:13 | 只看该作者
厉害了小哥哥

使用特权

评论回复
5
凌空天馥| | 2020-7-29 10:21 | 只看该作者
插上USB 无法识别么 搂主 需要驱动吗

使用特权

评论回复
6
Cjy_JDxy|  楼主 | 2020-7-30 07:59 | 只看该作者
凌空天馥 发表于 2020-7-29 10:21
插上USB 无法识别么 搂主 需要驱动吗

好像不需要吧,我记得没装驱动

使用特权

评论回复
7
yiyigirl2014| | 2020-7-30 20:31 | 只看该作者
矩阵键盘。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

19

粉丝