第十一集 矩阵按键
任务二:密码锁
- #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;
- }
- }
- u8 key_num=0xff;
- void Task_1(void)
- {
- 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;
- COL1 = 1;
- COL2 = 1;
- COL3 = 1;
- COL4 = 1;
- ROW1 = 0;
- ROW2 = 0;
-
- if(COL1 == 0) //判断哪一列,叠加按键的序号
- {
- // key_num = key_num;
- }
- 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; //DAT=(DAT<<1); //CY
- 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;
- }
- 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++;
- // passward[7]=17;
- 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]==0))
- {
- 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;
- }
- }
复制代码
|