矩阵LED和矩阵按键

先说矩阵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;
			
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值