键盘参考答案

iar的使用

参考答案

#include "keyboard.h"
#include "MK60_gpio.h"
#include "MK60_systick.h"
/*第一组*/
#define K1 B1
#define K2 B2
#define K3 B3
/*第二组*/
#define K4 B4
#define K5 B5
#define K6 B6
uint8_t which_button;
void keyboard_init(void)
{
    gpio_init(K1, GPO, 0);
    gpio_init(K2, GPO, 0);
    gpio_init(K3, GPO, 0);
    gpio_init(K4, GPI, 1);
    gpio_init(K5, GPI, 1);
    gpio_init(K6, GPI, 1);
    port_init(K4, PF | ALT1 | PULLUP);
    port_init(K5, PF | ALT1 | PULLUP);
    port_init(K6, PF | ALT1 | PULLUP);
}
uint8_t key_scan(void)
{
    uint8_t temp_key=0;
    systick_delay_ms(10);
    temp_key=gpio_get(K4);
    temp_key+=gpio_get(K5)<<1;
    temp_key+=gpio_get(K6)<<2;
    /*temp_key=000*/
    if(!temp_key)
        return 0;
    if(temp_key!=7&&temp_key!=3&&temp_key!=5)
    {
        gpio_init(K1, GPI, 1);
        gpio_init(K2, GPI, 1);
        gpio_init(K3, GPI, 1);
        port_init_NoAlt(K1,PULLUP);
        port_init_NoAlt(K2,PULLUP);
        port_init_NoAlt(K3,PULLUP);

        gpio_init(K4, GPO, 0);
        gpio_init(K5, GPO, 0);
        gpio_init(K6, GPO, 0);

        temp_key+=gpio_get(K1)<<3;
        temp_key+=gpio_get(K2)<<4;
        temp_key+=gpio_get(K3)<<5;
        /*temp_key=000000*/
        switch(temp_key)
        {
        case 9:
            return 1;
        case 17:
            return 2;
        case 33:
            return 3;
        case 10:
            return 4;
        case 18:
            return 5;
        case 34:
            return 6;
        case 11:
            return 7;
        case 19:
            return 8;
        case 20:
            return 9;
        default :
            return 0;
        }
    }
    return 0;
//  systick
}

最终调试

调试代码

keyboard.c

#include "keyboard.h"
#include "MK60_gpio.h"
#include "MK60_systick.h"
/*第一组*/
#define K1 B0
#define K2 B1
#define K3 B2
/*第二组*/
#define K4 B21
#define K5 B22
#define K6 B23
uint8_t which_button;
/*
初始化 对应管角在keyboard.c K1-K6中查看
*/
void keyboard_init( void )
{
    gpio_init( K1, GPO, 1 );
    gpio_init( K2, GPO, 1 );
    gpio_init( K3, GPO, 1 );
    gpio_init( K4, GPI, 0 );
    gpio_init( K5, GPI, 0 );
    gpio_init( K6, GPI, 0 );
    port_init( K4, PF | ALT1 | PULLDOWN );
    port_init( K5, PF | ALT1 | PULLDOWN );
    port_init( K6, PF | ALT1 | PULLDOWN );
}
/*
扫描 由key_function调用
return 扫描到的值 没有则返回0
*/
uint8_t key_scan( void )
{
    uint8_t temp_key = 0;
    systick_delay_ms( 10 );
    temp_key = gpio_get( K4 );
    temp_key += gpio_get( K5 ) << 1;
    temp_key += gpio_get( K6 ) << 2;
    /*temp_key=000*/
    if( !temp_key )
        return 0;
    if( temp_key != 7 && temp_key != 3 && temp_key != 5 )
    {
        gpio_init( K1, GPI, 0 );
        gpio_init( K2, GPI, 0 );
        gpio_init( K3, GPI, 0 );
        port_init_NoAlt( K1, PULLDOWN );
        port_init_NoAlt( K2, PULLDOWN );
        port_init_NoAlt( K3, PULLDOWN );

        gpio_init( K4, GPO, 1 );
        gpio_init( K5, GPO, 1 );
        gpio_init( K6, GPO, 1 );

        temp_key += gpio_get( K1 ) << 3;
        temp_key += gpio_get( K2 ) << 4;
        temp_key += gpio_get( K3 ) << 5;
        /*temp_key=000000*/
        switch( temp_key )
        {
        case 9:
            return 1;
        case 17:
            return 2;
        case 33:
            return 3;
        case 10:
            return 4;
        case 18:
            return 5;
        case 34:
            return 6;
        case 12:
            return 7;
        case 20:
            return 8;
        case 36:
            return 9;
        default :
            return 0;
        }
    }
    return 0;
//  systick
}
/*
键盘主函数
将键盘扫描值复制给which_button
并且复位
*/
void key_function( void )
{
    which_button = key_scan();
    gpio_init( K1, GPO, 1 );
    gpio_init( K2, GPO, 1 );
    gpio_init( K3, GPO, 1 );
    gpio_init( K4, GPI, 0 );
    gpio_init( K5, GPI, 0 );
    gpio_init( K6, GPI, 0 );
    port_init_NoAlt( K4, PULLDOWN );
    port_init_NoAlt( K5,  PULLDOWN );
    port_init_NoAlt( K6,  PULLDOWN );
}

keyboard.h

#ifndef _KEYBOARD_H
#define _KEYBOARD_H
#include "common.h"
extern uint8_t which_button;
void keyboard_init(void);
void key_function( void );
uint8_t key_scan(void);
#endif

main.c

#include "headfile.h"
#include "keyboard.h"
int main( void )
{
    get_clk();//上电后必须运行一次这个函数,获取各个频率信息,便于后面各个模块的参数设置
    //此处编写用户代码(例如:外设初始化代码等)
    keyboard_init();


    for( ;; )
    {
        //此处编写需要循环执行的代码
        key_function();
        if ( which_button )
            which_button = 0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值