小涵子爸爸
发表于 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;
}
}