芯的搬砖工 发表于 2025-1-21 14:58:09

第十三集   外部中断,代码手输测试成功
图片:

视频:


代码:

#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=
{
        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_no=0;

void PW_write_Task(void)
{
           if(key_num<0xff)
       {
          Key_Vol3++;
                  if(Key_Vol3==5)
                        {
                                if(key_no==0)
                                {
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;                               
                                }
                                       
                                passward=key_num;
                                key_no++;
//                        passward=17;
                                if(key_no==8)    //密码输入到了八位
                                {
                                        if((passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6))
                                        {
                                                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_no=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-23 13:48:39

第十四集IO中断手敲代码测试成功

任务一IO的中断程序
图片:


视频:


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=
{
      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_no=0;

void PW_write_Task(void)
{
         if(key_num<0xff)
         {
            Key_Vol3++;
                  if(Key_Vol3==5)
                        {
                              if(key_no==0)
                              {
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;                              
                              }
                                       
                              passward=key_num;
                              key_no++;
//                        passward=17;
                              if(key_no==8)    //密码输入到了八位
                              {
                                        if((passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6))
                                        {
                                                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_no=0;
                              }         
                        }
         }
         else
         {
            Key_Vol3=0;
         }
}

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

//void INT_ISR(void)interrupt 2
//{
//                P01=!P01;
//}

void P3_IO_Init(void)
{
                P3IM0=0X00;//IO中断模式设置为下降沿
                P3IM1=0X00;
      
                P3INTE=0X08;//打开中断
}

void P3_IO_ISR(void)    interrupt 40
{
                u8 intf;
      
                intf=P3INTF;
               
                if(intf)//判断有没有io触发中断
                {
                        P3INTF=0;
                        
                        if (intf & 0x08)//判断是否是P33按键按下
                        {
                                        P01=!P01;
                        }
                }
}      



任务二中断优先级设置
图片:


视频:


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=
{
      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={17,17,17,17,17,17,17,17};

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_no=0;

void PW_write_Task(void)
{
         if(key_num<0xff)
         {
            Key_Vol3++;
                  if(Key_Vol3==5)
                        {
                              if(key_no==0)
                              {
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;
                                                passward=16;                              
                              }
                                       
                              passward=key_num;
                              key_no++;
//                        passward=17;
                              if(key_no==8)    //密码输入到了八位
                              {
                                        if((passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6)&&(passward==6))
                                        {
                                                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_no=0;
                              }         
                        }
         }
         else
         {
            Key_Vol3=0;
         }
}

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

//void INT_ISR(void)interrupt 2
//{
//                P01=!P01;
//}

//数码管显示0;执行while函数   1;执行p3_IO中断2;执行p4_IO中断

void P3_IO_Init(void)
{
                P3IM0=0X00;//IO中断模式设置为下降沿
                P3IM1=0Xff;
      
                P3INTE=0X08;//打开中断
}

void P3_IO_ISR(void)    interrupt 40
{
                u8 intf;
      
                intf=P3INTF;
               
                if(intf)//判断有没有io触发中断
                {
                        P3INTF=0;
                        
                        if (intf & 0x08)//判断是否是P33按键按下
                        {
                                                passward=1;
//                                        P01=!P01;
                        }
                }
}      

void P4_IO_Init(void)
{
                P4IM0=0X00;//IO中断模式设置为下降沿
                P4IM1=0Xff;
      
                P4INTE=0X80;//打开中断
         
          PINIPH|=(1<<4);   //写入最高优先级
                PINIPL|=(1<<4);
}

void P4_IO_ISR(void)    interrupt 41
{
                u8 intf;
      
                intf=P4INTF;
               
                if(intf)//判断有没有io触发中断
                {
                        P4INTF=0;
                        
                        if (intf & 0x80)//判断是否是P33按键按下
                        {
                                        passward=2;
                        }
                }
}      






芯的搬砖工 发表于 2025-1-24 14:15:59

第十五集定时器做计数器代码手敲测试成功
任务一定时器1计数程序
主程序

视频


任务二INT1测低电平时间
主程序


视频





芯的搬砖工 发表于 2025-2-6 15:14:33

第十六集DS18B20测温手输代码测温测试成功
图片:


视频:


主程序:
#include "18b20.h"

u8    MinusFlag=0;      //如果等于0,正数;如果等于1,负数
u32Temp_18b20;      //最终的温度,0.0625

void Delay480us(void)      //@24.000MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      _nop_();
      i = 2878UL;
      while (i) i--;
}

void Delay60us(void)      //@24.000MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      _nop_();
      i = 358UL;
      while (i) i--;
}

void Delay1us(void)      //@24.000MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      _nop_();
      i = 4UL;
      while (i) i--;
}


//复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
void DS18B20_Reset(void)
{
      u8 flag=1;
      
      while(flag)   //只要括号里的变量大于0,就会一直执行
      {
                DQ = 0;
                Delay480us();
                DQ = 1;
                Delay60us();
                flag=DQ;      // 设备存在,拉低总线
                Delay480us();
      }
}

//写逻辑0(输出0保持60us+,输出1保持1us+)
void DS18B20_Write_0(void)
{
          DQ = 0;
          Delay60us();
          DQ = 1;
          Delay1us();
          Delay1us();
}

//写逻辑1(输出0保持1us+,输出1保持60us+)
void DS18B20_Write_1(void)
{
          DQ = 0;
          Delay1us();
          Delay1us();
          DQ = 1;
          Delay60us();
}

//读逻辑0/1(输出0保持1us+,输出1保持1us+,读取当前电平,延时60us)
bit DS18B20_Read(void)
{
          bit state=0;
               
          DQ = 0;
          Delay1us();
          Delay1us();
          DQ = 1;
          Delay1us();
          Delay1us();
          state=DQ;   // 暂时保存这个DQ的数值
          Delay60us();
      
          return state;
}

//写1字节(先输出低位,在输出高位)
void DS18B20_WriteByte (u8 dat )
{
      u8 i ;
      for(i=0;i<8;i++)
      {
                if (dat & 0x01)// 最低位是1,发逻辑1电平
                {
                        DS18B20_Write_1();
                }
                else         //否则,发逻辑0电平
                {
                        DS18B20_Write_0();
                }
                dat>>=1;      //dat=(dat>>1);
      }
}

//读1字节(先读到的是低位,后读到的是高位)
u8 DS18B20_ReadByte (void)
{
      u8 i ;
      u8 dat =0;      //数据暂存
      
      for(i=0;i<8;i++)   //循环读取8次
      {
                dat >>=1;
                if(DS18B20_Read())   //如果读回来的是逻辑1// 0000 0000 ->1000 0000->0100 00000
                {
                   dat |=0x80;
                }
                else
                {
                }
      }
         return dat;
}

//(复位-CCH-44H-等待-复位-CCH-BEH-读取2字节温度数据-换算)
void DS18B20_ReadTemp(void)
{
                u8 TempH=0;
                u8 TempL=0;
                u16 Temp=0;
//----------------------发送检测命令---------------------------
      DS18B20_Reset();            //1.发送复位命令
      DS18B20_WriteByte(0xcc);      //2.跳过ROM命令
      DS18B20_WriteByte(0x44);      //3.开始转化命令
      while(!DQ);                   //4.等待这个引脚变成高电平
      
//----------------------发送读取命令---------------------------
      DS18B20_Reset();            //1.发送复位命令
      DS18B20_WriteByte(0xcc);      //2.跳过ROM命令
      DS18B20_WriteByte(0xBE);      //3.开始转化命令
      TempL=DS18B20_ReadByte();   //4.读取低字节温度
      TempH=DS18B20_ReadByte();   //4.读取高字节温度
      
      if(TempH & 0x80)             //如果最高位是1,这个就是负数
      {
                MinusFlag=1;
                Temp=(((u16)TempH<<8) | ((u16)TempL<<0));
                Temp=(~Temp) +1;
                Temp_18b20=(u32)Temp*625;
      }
      else
      {
                MinusFlag=0;
                Temp=(((u16)TempH<<8) | ((u16)TempL<<0));
                Temp_18b20=(u32)Temp*625;
      }
}







芯的搬砖工 发表于 2025-2-13 16:35:57

第十六集串口的简单应用手敲代码成功

一 截图


二 视频


三 主程序
#include "usart.h"
#include "io.h"

u8 Rec_Dat;//接收缓冲区
u8 Rec_Num=0;    //接收计数
bit B_TX2_Busy=0;
void Uart2_Isr(void) interrupt 8
{
        if (S2CON & 0x02)        //检测串口2发送中断
        {
                S2CON &= ~0x02;        //清除串口2发送中断请求位
                B_TX2_Busy=0;
        }
        if (S2CON & 0x01)        //检测串口2接收中断
        {
                S2CON &= ~0x01;        //清除串口2接收中断请求位
               
                //S2BUF
                Rec_Dat=S2BUF;
        }
}

void Uart2_Init(void)        //9600bps@24.000MHz
{
       
        P_SW2 |= 0x01;                                                //UART2/USART2: RxD2(P4.6), TxD2(P4.7)

        S2CON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0x8F;                        //设置定时初始值
        T2H = 0xFD;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        IE2 |= 0x01;                //使能串口2中断
       
        Rec_Num=0;
        B_TX2_Busy=0;
}

void Uart2_SendStr(u8 *puts)   //串口数据发送函数
{
        for(; *puts !=0;puts++)   //遇到停止符0结束
        {
                S2BUF = *puts;
                B_TX2_Busy=1;
                while(B_TX2_Busy);
        }
}
//1.发送OPEN\r\n打开数码管,数码管显示“----”
//2.发送CLOSE\r\n打开数码管,数码管全部熄灭


void Usart2_RunTask(void)
{
        if(Rec_Num>=6)   // 是否接收到了六位数据
        {
                if ((Rec_Dat=='\n') && (Rec_Dat=='\r'))//末尾判断
                {
                        if((Rec_Dat=='O') && (Rec_Dat=='P') && (Rec_Dat=='E') && (Rec_Dat=='N'))   
                        {
                                passward=16;
                                passward=16;
                                passward=16;
                                passward=16;
                                Uart2_SendStr("打开成功!\r\n");
                        }
                        else if((Rec_Dat=='C') && (Rec_Dat=='L') && (Rec_Dat=='O') && (Rec_Dat=='S')&& (Rec_Dat=='E'))
      {
                                passward=17;
                                passward=17;
                                passward=17;
                                passward=17;
                                Uart2_SendStr("关闭成功!\r\n");
                        }
                        Rec_Num=0;
                }
        }
}
页: 1 [2]
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习打卡