芯启航 发表于 2024-12-20 12:00:31

第十集 虚拟LED和数码管 已手敲代码测试通过
任务1:P2口流水灯,P10闪烁



任务2:左边数码管显示P32按下次数 右边数码管显示P33按下次数



任务3:按下数字按键在数码管显示对应的按键数字!


代码如下:

#include "io.h"

u8 State1= 0;                     //LED1初始状态
u8 State2= 0;                      //LED2初始状态
u8 State3= 0;                      //LED3初始状态

u16 Key_Vol;                                //按键按下持续时间
u16 Key_Vol_2;                                //按键按下持续时间

void LED0_Blink(void)
{
        State1 = !State1;
        P00 = State1;
}

void LED1_Blink(void)
{
        State2 = !State2;
        P01 = State2;
}

void LED2_Blink(void)
{
        State3 = !State3;
        P02 = State3;
}

u16 KEY1_COUNT = 0;                                //P32按钮计数
u16 KEY2_COUNT = 0;                                //P33按钮计数

void Key_Task(void)
{
//-----------------P32按钮计数----------------
        if( P32 ==0 )
        {
                Key_Vol++;
                if( Key_Vol==5 )
                {
                  KEY1_COUNT++;
                }
        }
        else
        {
                Key_Vol = 0;
        }
       
//-----------------P33按钮计数-----------------
                if( P33 ==0 )
        {
                Key_Vol_2++;
                if( Key_Vol_2==5 )
                {
                  KEY2_COUNT++;
                }
        }
        else
        {
                Key_Vol_2 = 0;
        }
       
       
}


u8 P2_STATE = 0x01;

u8 P10_STATE = 0;

//任务1:P2口流水灯,P10闪烁
void TASK_1( void )
{

//----------------------------------P2端口流水灯                  
          LED40_SetPort(2,~P2_STATE);                //点亮P20端口
       
          P2_STATE = (P2_STATE<<1);                //1000 0000 _> 1 0000 0000
          if( P2_STATE == 0 )
                  P2_STATE = 1;
          
          
//----------------------------------P10端口闪烁
          if( P10_STATE == 0)
              LED40_SetBit(1,0);
          else
              LED40_ClrBit(1,0);
          
          P10_STATE = !P10_STATE;
}



u32 KEY_Count = 0;

//任务2:左边数码管显示P32按下次数 右边数码管显示P33按下次数
void TASK_2( void )
{
        KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;
       
        SEG7_ShowLong(KEY_Count ,10);
       
}       

u32 REC_NUM = 0;

//任务3:按下数字按键在数码管显示对应的按键数字!
void TASK_3( void )
{
        SEG7_ShowLong( REC_NUM ,10);
}


芯启航 发表于 2024-12-27 10:43:22

第十一集 矩阵按键 已手敲代码,测试通过

任务1:数码管显示当前的按键号

470


任务2:密码锁

1.没有输入时,显示“- - - - - - - -”
2.有输入时,按下一个按键,开始按顺序写入
    例如,第一个按下1,显示“1 - - - - - - -”   
    例如,第二个按下3,显示“1 3 - - - - - -”
3.当按下的密码为“ 1 2 3 4 5 6 7 0”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”


481

代码如下:
#include "io.h"

u8 State1= 0;                     //LED1初始状态
u8 State2= 0;                      //LED2初始状态
u8 State3= 0;                      //LED3初始状态

u16 Key_Vol;                              //按键按下持续时间

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 =
{
      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 )))                //如果有按键按下,而且只有一颗
               {
                        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 ;
                         }
                         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, ~T_NUM);
//      else
//                Display_Seg( SEG_NUM, ~T_NUM);
//}

u8 passward = {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], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==1)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==2)                              //第一个横杠
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==3)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==4)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==5)                              //第二个横杠
      {
                Display_Seg( SEG_NUM], ~T_NUM);         //数码管刷段码和位码
      }
      else if(Seg_no==6)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==7)                              //秒钟的个位
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      
      else
      {
               
      }
      Seg_no ++;
      if( Seg_no >7)
                Seg_no=0;
}

u8 Key_Vol3 = 0;
u8 key_n0 = 0;

void PW_write_Task(void)
{
      if( key_num <0xff )
      {
                Key_Vol3++;
                if(Key_Vol3== 5 )
                {
//                        if(key_num ==0 )
//                        {
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                        }
                        passward[ key_n0 ] = key_num;
                        key_n0 ++;
//                        passward = 17;
                        if( key_n0== 8)               //密码输入到了八位
                        {
                              if((passward==1)&&(passward==2)&&(passward==3)&&(passward==4)&&(passward==5)&&(passward==6)&&(passward==7)&&(passward==0))
                              {
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 1;
                            }
                              else
                              {
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                              }
                                 key_n0 = 0;
                        }
                        
                }
      }
      else
      {
                Key_Vol3= 0;
      }
}


芯启航 发表于 2025-1-14 13:59:11

第十二集 复位系统 已手敲代码,测试通过

任务一:编写看门狗程序

511
代码如下:
#include "config.h"
#include "task.h"
#include "io.h"

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
      
      Sys_int();                                                                                 //系统初始化
      usb_init();                                    //USB CDC 接口配置

    IE2 |= 0x80;                                                                         //使能USB中断
      Timer0_Init();                                                                        //定时器初始化
    Init_595();
      EA = 1;                                                                                        //IE |= 0X80;
      
      P40=0;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      WDT_CONTR =0X24;

    while(1)
      {
               
      if (bUsbOutReady)                                                      //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
                        usb_OUT_done();                                                      //
      }
                        Task_Pro_Handler_Callback();                        //执行功能函数
                        if( P33 !=0 )
                        WDT_CONTR =0X34;

      }
}

void Timer0_Isr(void) interrupt 1                                                //1MS执行一次
{
      Task_Marks_Handler_Callback();                                                //系统计时
}任务二:软件复位

514
代码如下:
#include "io.h"

u8 State1= 0;                     //LED1初始状态
u8 State2= 0;                      //LED2初始状态
u8 State3= 0;                      //LED3初始状态

u16 Key_Vol;                              //按键按下持续时间

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 =
{
      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( P33 ==0 )
      {
                Key_Vol++;
                if(Key_Vol==5 )
                {
                        //按键按下的任务
//                        printf( "按键单击\r\n" );
                        
                        USB_Reset_U();
                        
                        IAP_CONTR = 0X60;
                }
      }
      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 )))                //如果有按键按下,而且只有一颗
               {
                        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 ;
                         }
                         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, ~T_NUM);
//      else
//                Display_Seg( SEG_NUM, ~T_NUM);
//}

u8 passward = {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], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==1)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==2)                              //第一个横杠
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==3)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==4)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==5)                              //第二个横杠
      {
                Display_Seg( SEG_NUM], ~T_NUM);         //数码管刷段码和位码
      }
      else if(Seg_no==6)                              
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      else if(Seg_no==7)                              //秒钟的个位
      {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
      }
      
      else
      {
               
      }
      Seg_no ++;
      if( Seg_no >7)
                Seg_no=0;
}

u8 Key_Vol3 = 0;
u8 key_n0 = 0;

void PW_write_Task(void)
{
      if( key_num <0xff )
      {
                Key_Vol3++;
                if(Key_Vol3== 5 )
                {
//                        if(key_num ==0 )
//                        {
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                              passward = 16;
//                        }
                        passward[ key_n0 ] = key_num;
                        key_n0 ++;
//                        passward = 17;
                        if( key_n0== 8)               //密码输入到了八位
                        {
                              if((passward==1)&&(passward==2)&&(passward==3)&&(passward==4)&&(passward==5)&&(passward==6)&&(passward==7)&&(passward==0))
                              {
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 1;
                            }
                              else
                              {
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                              }
                                 key_n0 = 0;
                        }
                        
                }
      }
      else
      {
                Key_Vol3= 0;
      }
}







芯启航 发表于 2025-1-23 16:55:51

跟着冲哥打卡第13集,已手敲代码,测试通过


560
#include "io.h"

u8 State1= 0;                     //LED1初始状态
u8 State2= 0;                      //LED2初始状态
u8 State3= 0;                      //LED3初始状态

u16 Key_Vol;                                //按键按下持续时间

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 =
{
        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( P33 ==0 )
        {
                Key_Vol++;
                if(Key_Vol==5 )
                {
                        //按键按下的任务
//                        printf( "按键单击\r\n" );
                       
                        USB_Reset_U();
                       
                        IAP_CONTR = 0X60;
                }
        }
        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 )))                //如果有按键按下,而且只有一颗
               {
                        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 ;
                       }
                       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, ~T_NUM);
//        else
//                Display_Seg( SEG_NUM, ~T_NUM);
//}

u8 passward = {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], ~T_NUM);      //数码管刷段码和位码
        }
        else if(Seg_no==1)                              
        {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
        }
        else if(Seg_no==2)                              //第一个横杠
        {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
        }
        else if(Seg_no==3)                              
        {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
        }
        else if(Seg_no==4)                              
        {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
        }
        else if(Seg_no==5)                              //第二个横杠
        {
                Display_Seg( SEG_NUM], ~T_NUM);         //数码管刷段码和位码
        }
        else if(Seg_no==6)                              
        {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
        }
        else if(Seg_no==7)                              //秒钟的个位
        {
                Display_Seg( SEG_NUM], ~T_NUM);      //数码管刷段码和位码
        }
       
        else
        {
               
        }
        Seg_no ++;
        if( Seg_no >7)
                Seg_no=0;
}

u8 Key_Vol3 = 0;
u8 key_n0 = 0;

void PW_write_Task(void)
{
        if( key_num <0xff )
        {
                Key_Vol3++;
                if(Key_Vol3== 5 )
                {
//                        if(key_num ==0 )
//                        {
//                                passward = 16;
//                                passward = 16;
//                                passward = 16;
//                                passward = 16;
//                                passward = 16;
//                                passward = 16;
//                                passward = 16;
//                                passward = 16;
//                        }
                        passward[ key_n0 ] = key_num;
                        key_n0 ++;
//                        passward = 17;
                        if( key_n0== 8)                 //密码输入到了八位
                        {
                                if((passward==1)&&(passward==2)&&(passward==3)&&(passward==4)&&(passward==5)&&(passward==6)&&(passward==7)&&(passward==0))
                                {
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 17;
                                        passward = 1;
                          }
                                else
                                {
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                        passward = 16;
                                }
                               key_n0 = 0;
                        }
                       
                }
        }
        else
        {
                Key_Vol3= 0;
        }
}

void INT1_Init(void)
{
        IT1 = 1;                //下降沿中断
        EX1 = 1;                //打开中断允许
        EA = 1;                        //打开总中断
}
void INT_ISR(void) interrupt 2
{
        P01 = !P01;
}

芯启航 发表于 2025-1-24 17:02:03

跟着冲哥打卡第14集IO口中断,已手敲代码,测试通过
任务一:编写IO口中断程序



574

任务二:编写P4端口的IO中断 打断 P3低电平中断的的程序(注意优先级)

575


页: 1 [2]
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习打卡