11.矩阵按键
io.c代码
- #include "io.h"
-
- u8 State1 = 0; //LED1初始状态
- u8 State2 = 0; //LED2初始状态
- u8 State3 = 0; //LED3初始状态
-
- u16 Key_Vol = 0; //按键按下持续时间(几个十秒)
-
- u8 SEG_NUM[] =
- {
- 0x3F, /*'0', 0*/
- 0x06, /*'1', 1*/
- 0x5B, /*'2', 2*/
- 0x4F, /*'3', 3*/
- 0x66, /*'4', 4*/
- 0x6D, /*'5', 5*/
- 0x7D, /*'6', 6*/
- 0x07, /*'7', 7*/
- 0x7F, /*'8', 8*/
- 0x6F, /*'9', 9*/
- 0x77, /*'A', 10*/
- 0x7C, /*'B', 11*/
- 0x39, /*'C', 12*/
- 0x5E, /*'D', 13*/
- 0x79, /*'E', 14*/
- 0x71, /*'F', 15*/
- 0x40, /*'-', 16*/
- 0x00, /*' ', 17*/
- 0x80, /*'.', 18*/
- };
-
- u8 T_NUM[8] =
- {
- 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
- };
-
-
- void LED0_Blink(void)
- {
- State1 = !State1;
- P00 = State1;
- }
- void LED1_Blink(void)
- {
- State2 = !State2;
- P01 = State2;
- }
- void LED2_Blink(void)
- {
- State3 = !State3;
- P02 = State3;
- }
- void Key_Task(void)
- {
- if( P32 == 0 )
- {
- Key_Vol++;
- if(Key_Vol == 5)
- {
- printf("按键单击\r\n");
- }
- }
- else
- {
- Key_Vol = 0;
- }
- }
-
- /*
- ----------行------------
- #define ROW1 P06 //定义端口
- #define ROW2 P07
- ----------列-------------
- #define COL1 P00
- #define COL2 P01
- #define COL3 P02
- #define COL4 P03
- */
- //任务1:数码管显示当前的按键号
-
- u8 key_num = 0xff; //key_num =0 给按键传递一个键值
-
- void Task_1(void)
- {
- //static静态变量,只有第一次进来时才赋值,key_num =0 给按键传递一个键值
-
- // ①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
- COL1 = 0;
- COL2 = 0;
- COL3 = 0;
- COL4 = 0;
- ROW1 = 1;
- ROW2 = 1;
-
- if((ROW1 == 0) || (ROW2 == 0)) //"||"或的符号,只要满足其中之一的条件(行按键按下)
- {
- if((ROW1 == 0) && (ROW2 == 0)) //如果两行都有按键按下,不处理
- {
-
- }
- else if ( ((ROW1 == 1)&&(ROW2 == 0)) || ((ROW1 == 0)&&(ROW2 == 1)) ) //如果有按键按下,而且只有一颗
- {
- if( ROW1 == 0 ) //判断哪一行,输出行开始的序号
- key_num = 0;
- else if(ROW2 == 0)
- key_num = 4;
-
- //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
- COL1 = 1;
- COL2 = 1;
- COL3 = 1;
- COL4 = 1;
- ROW1 = 0;
- ROW2 = 0;
-
- //判断哪一列,叠加按键的序号
- if(COL1 ==0)
- {
- // key_num = key_num +0;
- }
- else if( COL2 == 0)
- {
- key_num = key_num +1;
- }
- else if( COL3 == 0)
- {
- key_num = key_num +2;
- }
- else if( COL4 == 0)
- {
- key_num = key_num +3;
- }
- }
- COL1 = 0;
- COL2 = 0;
- COL3 = 0;
- COL4 = 0;
- ROW1 = 1;
- ROW2 = 1;
- }
- else
- {
- key_num =0xff;
- }
-
- // ③第三步:行列组合一下就可以判断出是哪个按键按下了。
- }
-
- void Init_595(void)
- {
- HC595_SER = 0;
- HC595_RCK = 0;
- HC595_SCK = 0;
- }
-
-
- void Send_595( u8 dat )
- {
- u8 i;
- for( i=0; i<8; i++ )
- {
- dat <<= 1; //数值左移一位
- HC595_SER = CY; //数据写到引脚
- HC595_SCK = 1; //输出上升沿的时钟信号
- HC595_SCK = 0;
- }
- }
-
-
- void Display_Seg( u8 HC595_1,u8 HC595_2)
- {
- Send_595(HC595_1); //数码管段码输出 高电平点亮
- Send_595(HC595_2); //数码管位码输出 低电平点亮
- HC595_RCK = 1; //数据输出
- HC595_RCK = 0;
- }
-
- //void SEG_Task(void)
- //{
- // if(key_num == 255)
- // Display_Seg( SEG_NUM[17], ~T_NUM[0]); //数码管段码和位码
- // else
- // Display_Seg( SEG_NUM[key_num], ~T_NUM[0]); //数码管段码和位码
- //}
-
- //任务二:简易密码箱
- u8 passward[8] = { 16,16,16,16,16,16,16,16};
- u8 Seg_no = 0;
- void SEG_Task(void)
- {
- u8 num = 0;
- if( Seg_no ==0 ) //小时十位
- {
-
- Display_Seg( SEG_NUM[passward[0]] , ~T_NUM[0]); //数码管刷段码和位码
- }
- else if( Seg_no ==1 ) //小时的个位
- {
-
- Display_Seg( SEG_NUM[passward[1]] , ~T_NUM[1]); //数码管刷段码和位码
- }
- else if( Seg_no ==2 ) //第一个横杠
- {
- Display_Seg( SEG_NUM[passward[2]] , ~T_NUM[2]); //数码管刷段码和位码
- }
- else if( Seg_no ==3 ) //分钟的十位
- {
-
- Display_Seg( SEG_NUM[passward[3]] , ~T_NUM[3]); //数码管刷段码和位码
- }
- else if( Seg_no ==4 )
- {
-
- Display_Seg( SEG_NUM[passward[4]] , ~T_NUM[4]); //数码管刷段码和位码
- }
- else if( Seg_no ==5 )
- {
- Display_Seg( SEG_NUM[passward[5]] , ~T_NUM[5]); //数码管刷段码和位码
- }
- else if( Seg_no ==6 )
- {
-
- Display_Seg( SEG_NUM[passward[6]] , ~T_NUM[6]); //数码管刷段码和位码
- }
- else if( Seg_no ==7 )
- {
-
- Display_Seg( SEG_NUM[passward[7]] , ~T_NUM[7]); //数码管刷段码和位码
- }
- else
- {
-
- }
- Seg_no ++;
- if( Seg_no>7 )
- Seg_no=0;
- }
- u8 Key_Vol3 = 0; //判断按钮是否按下
- u8 Key_no = 0; //数码管位计数
- //密码输入显示
- void PW_write_Task(void)
- {
- if( key_num <0xff )
- {
- Key_Vol3 ++;
- if(Key_Vol3 == 5)
- {
- if(Key_no == 0) //数码管没有按下时显示“-”
- {
- passward[0] = 16;
- passward[1] = 16;
- passward[2] = 16;
- passward[3] = 16;
- passward[4] = 16;
- passward[5] = 16;
- passward[6] = 16;
- passward[7] = 16;
- }
- passward[Key_no] = key_num;
- Key_no++;
-
- if( Key_no == 8 ) //密码输入到了八位
- {
- if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==8))
- {
- //密码正确八位数码管显示为1
- passward[0] = 17;
- passward[1] = 17;
- passward[2] = 17;
- passward[3] = 17;
- passward[4] = 17;
- passward[5] = 17;
- passward[6] = 17;
- passward[7] = 1;
- }
- else //密码输入错误八位数码管显示为空
- {
- passward[0] = 16;
- passward[1] = 16;
- passward[2] = 16;
- passward[3] = 16;
- passward[4] = 16;
- passward[5] = 16;
- passward[6] = 16;
- passward[7] = 16;
- }
- Key_no = 0;
- }
-
- }
- }
- else
- {
- Key_Vol3 = 0;
- }
- }
复制代码
io.h代码
- #ifndef __IO_H
- #define __IO_H
-
- #include "config.h" //调用头文件
-
- //定义引脚名称
-
- #define HC595_SER P34
- #define HC595_RCK P35
- #define HC595_SCK P32
-
- /*-----------定义端口-------------*/
- #define ROW1 P06 //定义端口
- #define ROW2 P07
- #define COL1 P00
- #define COL2 P01
- #define COL3 P02
- #define COL4 P03
-
- extern u8 key_num ;
-
- /*-----------函数声明-------------*/
- void LED0_Blink(void);
- void LED1_Blink(void);
- void LED2_Blink(void);
-
- void Key_Task(void);
- void Task_1(void);
- void SEG_Task(void);
- void Init_595(void);
- void PW_write_Task(void);
-
- #endif
复制代码
task.c代码
- #include "task.h"
- #include "io.h"
-
- //========================================================================
- // 本地变量声明
- //========================================================================
-
- static TASK_COMPONENTS Task_Comps[]=
- {
- //状态 计数 周期 函数
-
- // {0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
- // {0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */
- // {0, 900, 900, LED2_Blink}, /* task 1 Period: 900ms */
- // {0, 10, 10, Key_Task}, /* task 1 Period: 50ms */
- {0, 10, 10, Task_1}, /* task 1 Period: 10ms */
- {0, 1, 1, SEG_Task}, /* task 1 Period: 10ms */
- {0, 10, 10, PW_write_Task}, /* task 1 Period: 100ms */
-
-
- };
-
- u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);
-
- //========================================================================
- // 函数: Task_Handler_Callback
- // 描述: 任务标记回调函数.
- // 参数: None.
- // 返回: None.
- // 版本: V1.0, 2012-10-22
- //========================================================================
- void Task_Marks_Handler_Callback(void)
- {
- u8 i;
- for(i=0; i<Tasks_Max; i++)
- {
- if(Task_Comps[i].TIMCount) /* If the time is not 0 */
- {
- Task_Comps[i].TIMCount--; /* Time counter decrement */
- if(Task_Comps[i].TIMCount == 0) /* If time arrives */
- {
- /*Resume the timer value and try again */
- Task_Comps[i].TIMCount = Task_Comps[i].TRITime;
- Task_Comps[i].Run = 1; /* The task can be run */
- }
- }
- }
- }
-
- //========================================================================
- // 函数: Task_Pro_Handler_Callback
- // 描述: 任务处理回调函数.
- // 参数: None.
- // 返回: None.
- // 版本: V1.0, 2012-10-22
- //========================================================================
- void Task_Pro_Handler_Callback(void)
- {
- u8 i;
- for(i=0; i<Tasks_Max; i++)
- {
- if(Task_Comps[i].Run) /* If task can be run */
- {
- Task_Comps[i].Run = 0; /* Flag clear 0 */
- Task_Comps[i].TaskHook(); /* Run task */
- }
- }
- }
-
复制代码
11.矩阵按键.rar
(183.66 KB, 下载次数: 0)
|