跟着冲哥打卡第11集,已手敲代码,测试通过
任务1:数码管显示当前的按键号
程序如下:
- #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
- */
-
-
-
- u8 key_num=0xff;
-
- //任务1:数码管显示当前的按键号
- void Task_1(void)
- {
-
- //第一步:现将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))) //如果有按键按下,而且只有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; //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;
- }
- 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]);
- }
复制代码
任务2:密码锁
程序如下:
- #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
- */
-
- u8 key_num=0xff;
- //任务1:数码管显示当前的按键号
- void Task_1(void)
- {
- //第一步:现将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))) //如果有按键按下,而且只有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) //判断哪一列,叠加按键的序号
- {
-
- }
- 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;
- }
- //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 ++;
- // passward[7]=17;
- if(key_no==8) //密码输入到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;
- }
- }
复制代码
|