找回密码
 立即注册
楼主: 小涵子爸爸

Ai8051U学习打卡记录贴

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:546
  • 最近打卡:2025-06-16 00:12:17
已绑定手机

1

主题

838

回帖

1687

积分

金牌会员

积分
1687
发表于 2025-4-30 15:22:05 | 显示全部楼层
第十一集-矩阵按键— 实验一:数码管第一位显示按键键号

void Seg_Task(void) //数码管显示任务,每毫秒刷新一次
{
    if(Key_num == 0xFF) //当未检测到按键按下
    {
        Display_Seg( SEG_NUM[17] , ~T_NUM[0]);        
    }
    else
    {
        Display_Seg( SEG_NUM[Key_num] , ~T_NUM[0]);    //如果被按下,发送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;  //如果按键没被按下
    }   
}





靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:546
  • 最近打卡:2025-06-16 00:12:17
已绑定手机

1

主题

838

回帖

1687

积分

金牌会员

积分
1687
发表于 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;   
    }

}



靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:546
  • 最近打卡:2025-06-16 00:12:17
已绑定手机

1

主题

838

回帖

1687

积分

金牌会员

积分
1687
发表于 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;   
    }

}

靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 05:22 , Processed in 0.114933 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表