先说矩阵LED,如图:

下面以行几、列几的表达方法说明
三极管可以当做开关使用
由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。
如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。
解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环就可以让该亮的灯亮起来,不该亮的灯关闭。下附源码(用的STM32F103芯片)
//这个任务放在时间片里跑
//将打开(关闭)一行(一列)封装成了四个小函数
//A[][]是个4X4的数组,对应矩阵16个LED
void TASK_LED(void)
{
static uint8_t flag=0;
static uint8_t H=0;
int a=0;
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除中断标志位
switch (flag) //用switch方法实现轮询
{
case 0:
{
for(a=0;a<4;a++)
{
if(A[H][a])
{
line_on(a); //打开一列
row_on(H); //打开一行 这两个函数的定义在后面
}
}
flag=1; //把标志位改成下一个,类似于指针,下一次进switch会进入下一种情况进行运行
break;
}
case 1:
{
for(a=0;a<4;a++)
{
if(A[H][a])
{
line_off(a);
row_off(H);
}
}
flag=2;
H=1;
break;
}
case 2:
{
for(a=0;a<4;a++)
{
if(A[H][a])
{
line_on(a);
row_on(H);
}
}
flag=3;


928

被折叠的 条评论
为什么被折叠?



