程序特点,模块化设计,可以不用关心 7segled.c 以及7segled.h 和key_board.c 以及 key_board.h中的内容,只需要修改配置即可在主函数中使用。
矩阵键盘设计从2×2到8×8通用,其实1*x也是可以用的,只是这样就成独立按键了,没有矩阵的意义了。
需要根据自己的情况修改的定义,更改数码管的连接设置:
CODE:
/*********************************************************/
#define Seg7_Bitselect_Port PORTC
#define Seg7_Bitselect_Ddr DDRC
#define Seg7_Data_Port PORTB
#define Seg7_Data_Ddr DDRB
#define Seg7_Bit0 7
#define Seg7_Bit1 6
#define Seg7_Bit2 1
#define Seg7_Bit3 0
/********************************************************/
修改矩阵键盘的行列数,以及连接设置。
CODE:
#define KEY_DDR_COL DDRA
#define KEY_PORT_COL PORTA
#define KEY_PIN_COL PINA
#define KEY_DDR_ROW DDRA
#define KEY_PORT_ROW PORTA
#define KEY_PIN_ROW PINA
#define WAIT_KEY_UP 1
//每行每列的按键数
#define PER_POW 4
#define PER_COL 4
//按键声
#define BEEP_EN 1 //使用蜂鸣器
#define BEEP_BIT 0 //PD0接蜂鸣器
#define BEEP_DDR DDRD
#define BEEP_PORT PORTD
//不使用中断脚
#define KEY_USE_INT 0
//在中断初始化中使用 GICR |= (1<<INT_BIT); //中断允许位,如INT0
#define IV_number iv_INT0 // iv_INT1 iv_INT2
#define INT_BIT INT0
//PD2为INT0 作为中断口
#define KEY_INT 2
#define KEY_INT_DDR DDRD
#define KEY_INT_RORT PORTD
#if KEY_USE_INT==1
extern volatile uint8 KEY_FLAG,key;
#endif
//行连接所对应的IO口
#define KEY_ROW_0 4
#define KEY_ROW_1 5
#define KEY_ROW_2 6
#define KEY_ROW_3 7
#define KEY_ROW_ALL ((1<<KEY_ROW_0)|(1<<KEY_ROW_1)|(1<<KEY_ROW_2)|(1<<KEY_ROW_3))
//可以扩展成更多,当然,这样就不能只有一个端口来实现了,需要行列所在的端口不同。
//最多可以到8*8,也可以缩减到2*2,甚至1*X,但是那样没有意义,超过16个键是修改key_board_table数组。
//#define KEY_ROW_5 0
//#define KEY_ROW_6 1
//#define KEY_ROW_7 2
//#define KEY_ROW_8 3
//列连接所对应的IO口
#define KEY_COL_0 0
#define KEY_COL_1 1
#define KEY_COL_2 2
#define KEY_COL_3 3
#define KEY_COL_ALL ((1<<KEY_COL_0)|(1<<KEY_COL_1)|(1<<KEY_COL_2)|(1<<KEY_COL_3))
//同理可以和上面注释部分一样扩展,注意 KEY_COL_ALL 要跟着修改
//#define KEY_COL_4 4
//#define KEY_COL_5 5
//#define KEY_COL_6 6
//#define KEY_COL_7 7
#define HAVE_KEY_DOWN ( (KEY_PIN_COL & KEY_COL_ALL) != KEY_COL_ALL )
//有键按下判断,默认初始化为行输出低,列输入,并使能内部上拉
//判断是否有按键即是判断列的输入是否是全为高,这样也有利于设计低电平触发的中断按键。
