小涵子爸爸 发表于 2025-4-30 15:22:05

第十一集-矩阵按键— 实验一:数码管第一位显示按键键号

void Seg_Task(void) //数码管显示任务,每毫秒刷新一次
{
    if(Key_num == 0xFF) //当未检测到按键按下
    {
      Display_Seg( SEG_NUM , ~T_NUM);      
    }
    else
    {
      Display_Seg( SEG_NUM , ~T_NUM);    //如果被按下,发送Key_num值
    }
   
}

u8 Key_num = 0xFF;
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 + 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;
            }
      }
    }
    else
    {
      Key_num = 0xFF;//如果按键没被按下
    }   
}





小涵子爸爸 发表于 2025-5-3 15:22:57

第十五集-定时器做计数器— 实验一:P35/T1模拟外部脉冲,P33打印脉冲总计数

u16 P35_Pulse_Count = 0;
u8 P35_Inter_Count = 0;

void Timer1_Counter_Init(void)
{
    T1_CT = 1;    //定时器1用做计数器,P3.5/T1作为外部脉冲输入引脚
    T1_M1 = 0;    //设置为16位自动重载模式
    T1_M0 = 0;
    T1_GATE = 0;//默认0
    TH1 = (65536-Count_num)>>8;    //设置定时初始值
    TL1 = (65536-Count_num);    //设置定时初始值
    P3PU |= 0x20;//打开P35端口的上拉电阻
    TR1 = 1;    //置1后开始计数
    ET1 = 1;    //使能定时器1中断   
}


void Timer1_Counter_Isr(void) interrupt 3
{
    P35_Inter_Count++; //每检测到3个外部脉冲变量加1
}

void Key_Task(void)
{
    if(P33 == 0 )
    {
      Key_Vol++;
      if(Key_Vol == 5)
      {
            P35_Pulse_Count = (u16)(Count_num*P35_Inter_Count)+(((u16)TH1<<8)+((u16)TL1)-(65536-Count_num));
            printf("%d",P35_Pulse_Count);
      }
    }
    else
    {
      Key_Vol = 0;   
    }

}



小涵子爸爸 发表于 2025-5-3 15:27:57

第十五集-定时器做计数器— 实验二:利用定时器1检测P33端口低压脉宽

void Timer1_Isr(void) interrupt 3   
{
    if(P33==0)
    {
      Count_num++;   
    }
    else
    {
      if(Count_num>0)
      {
            P33_Count = Count_num;
            Count_num = 0;
      }      
    }   
}

void Key_Task(void)
{
    if(P35 == 0 )
    {
      Key_Vol++;
      if(Key_Vol == 5)
      {
            P33_Low_Time = (P33_Count*100)/1000;
            printf("P33按下的时间约为:%d毫秒",P33_Low_Time);
      }
    }
    else
    {
      Key_Vol = 0;   
    }

}

页: 1 2 [3]
查看完整版本: Ai8051U学习打卡记录贴