《第十一集 矩阵按键》学习
一、注册任务
- static TASK_COMPONENTS Task_Comps[]=
- {
- //状态 计数 周期 函数
-
- {0, 500, 500, wash_Task},
- {0, 10, 10, KEY_Task},
- {0, 10, 10, KEYBOARD_Task}, /*矩阵键盘*/
- {0, 200, 200, matrix_Task},
- };
复制代码
KEYBOARD_Task是矩阵按键任务
二、矩阵按键处理函数
这部分基本都是抄冲哥的,只是改成了4*4矩阵按键
- void KEYBOARD_Task(void)
- {
- //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
- KEY_COL1 = 0;
- KEY_COL2 = 0;
- KEY_COL3 = 0;
- KEY_COL4 = 0;
- KEY_ROW1 = 1;
- KEY_ROW2 = 1;
- KEY_ROW3 = 1;
- KEY_ROW4 = 1;
-
-
- if(( KEY_ROW1 == 0 ) || ( KEY_ROW2 == 0 )|| ( KEY_ROW3 == 0 )|| ( KEY_ROW4 == 0 )) //如果行按键有按下
- {
- if(( KEY_ROW1 ==0 ) && ( KEY_ROW2 ==0 )&& ( KEY_ROW3 ==0 )&& ( KEY_ROW4 ==0 )) //如果两行都有按键按下,不处理
- {
-
- }
- else if( KEY_ROW1==0||KEY_ROW2==0||KEY_ROW3 ==0||KEY_ROW4 ==0 ) //如果有按键按下,而且只有一颗
- {
- if( KEY_ROW1 ==0 ) //判断哪一行,输出行开始的序号
- key_num = 0;
- else if( KEY_ROW2 ==0 )
- key_num = 4;
- else if( KEY_ROW3 ==0 )
- key_num = 8;
- else if( KEY_ROW4 ==0 )
- key_num = 12;
-
- //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
- KEY_COL1 = 1;
- KEY_COL2 = 1;
- KEY_COL3 = 1;
- KEY_COL4 = 1;
- KEY_ROW1 = 0;
- KEY_ROW2 = 0;
- KEY_ROW3 = 0;
- KEY_ROW4 = 0;
-
- if( KEY_COL1 ==0 ) //判断哪一列,叠加按键的序号
- {
- // key_num = key_num ;
- }
- else if( KEY_COL2 ==0 )
- {
- key_num = key_num + 1;
- }
- else if( KEY_COL3 ==0 )
- {
- key_num = key_num + 2;
- }
- else if( KEY_COL4 ==0 )
- {
- key_num = key_num + 3;
- }
-
-
- }
- KEY_COL1 = 0;
- KEY_COL2 = 0;
- KEY_COL3 = 0;
- KEY_COL4 = 0;
- KEY_ROW1 = 1;
- KEY_ROW2 = 1;
- KEY_ROW3 = 1;
- KEY_ROW4 = 1;
- }
- else
- {
- key_num = 0xff;
- }
-
- //③第三步:行列组合一下就可以判断出是哪个按键按下了。
- }
复制代码
三、在点阵屏上显示
- void matrix_Task(void)
- {
- static u8 num=0;
-
- if(key_num!=0xff) num=key_num;
-
- clear_matrix8x8();
-
- if(num!=0xff){
- set_matrix8x8(4,num%10);
- set_matrix8x8(0,num/10);
- }
- show_matrix8x8(matrix1); //显示
- }
复制代码
下面是595的驱动控制:
- void show_matrix8x8(u8 *pBuff)
- {
- unsigned char k;
- unsigned int m,n;
-
- for(m=0;m<32;m++) //为移动预留
- {
-
- for(k=0;k<8;k++) //行扫描
- {
- for(n=0;n<32;n++)//控制显示速度,防止闪烁
- {
- HC595(~pos[k],0);
- HC595(pBuff[k],0);
- //delay_us(10);
-
- LED_RCK_CLR;
- LED_RCK_SET; //并行输出
- delay_us(5);
- }
-
- }
- }
- }
复制代码
- void HC595(u8 c,u8 PN)
- {
- u8 i;
- for(i=0;i<8;i++){
-
- if(PN==0){ //正常显示
- if((c>>i) & 0x01) LED_SER_SET;
- else LED_SER_CLR;
- }
- else{ //反显
- if((c>>i) & 0x01) LED_SER_CLR;
- else LED_SER_SET;
- }
- LED_SRCK_CLR;
- LED_SRCK_SET; // 上升沿进行一次数据移入
- }
- }
复制代码
- void set_matrix8x8(u8 startPos,u8 num)
- {
- u8 i;
- for(i=0;i<3;i++)
- {
- matrix1[i+startPos]=NUM[i+num*3];
- }
- }
-
- void clear_matrix8x8()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- matrix1[i]=0x00;
- }
- }
复制代码
全貌
|