蓝桥杯STC基础代码-基础外设

   日期:2020-05-30     浏览:110    评论:0    
核心提示:蓝桥杯STC基础代码上一章-以定时器计数作为时间轴的模板上一章-以定时器计数作为时间轴的模板上一次讲到了利用定时器2计数作为时间轴,根据每个任务特点分配运行时间。博客网址嵌入式

蓝桥杯STC基础代码

  • 上一章-以定时器计数作为时间轴的模板
    • 文章网址
    • 代码下载地址
  • 蓝桥杯必用基础外设
    • LED
      • 原理图
      • 控制流程
      • 代码
    • 按键
      • 原理图
      • 控制流程
      • 代码
    • 数码管
      • 原理图
      • 控制流程
      • 代码
  • 下一章-串口

上一章-以定时器计数作为时间轴的模板

文章网址

上一次讲到了利用定时器2计数作为时间轴,根据每个任务特点分配运行时间。
文章网址

代码下载地址

代码在蓝桥杯的板子上测试过,基础定时器2的流水灯,以及矩阵按键读取,数码管显示,

代码下载地址

蓝桥杯单片机资源包

蓝桥杯必用基础外设

LED

原理图

原理图

控制流程

根据原理图,我们可以看到板子上的通过74HC138芯片来控制LED的。
P2 = 0x80 即 P25 = 0 P26 =0 P27 =1 时 -----Y4 P0管脚就可以用来控制LED。
值得注意的是:LED是共阳极。
控制过程如下;

P0管脚设置LED 把P25 P26 P27同时拉低 把P25 P26 P27 按所需要的的拉高 把P25 P26 P27 都拉低

代码

代码如下

    //这是一段led初始化代码 把 LED都灭掉 
	P0 = 0xff;
	P2 = P2 &  0x1f |0x80;
	P2 &= 0x1f;

亮一个灯的代码

// 参数 : core 为亮的灯的位置
void led_disp_one(u8 core)
{
	P0 = ~(1 << core);
	P2 = P2  &  0x1f | 0x80;
	P2 &= 0x1f;	
}

流水灯代码

//放置在500ms时间轴里
void led_water(void)
{
	static u8 i;
	
	led_disp_one(i);
	
	i++ ;
	if(i > 7)
	{
		i = 0;
	}
}

按键

按键分为独立按键跟矩阵按键,由于板子上独立按键比较少且比较简单,比赛的时候一般不会用到,所以我们采用4*4的矩阵按键。
注意:要用跳线帽把J5的1 2 脚连接起来

原理图

按键原理图

控制流程

拉低第一列其他拉高 如果按键按下可以检测到相应的引脚为低电平 把读取到的结果存储 依次检验第二列第三列第四列

代码

扫描代码如下

u8 key_scan(void)
{
	u8 key_val;
	u16 key_scan;
	
	P44 = 0 ; P42 = 1 ; P35 = 1; P34 = 1;
	key_scan = (key_scan << 4) | ( P3 & 0x0F);

	P44 = 1 ; P42 = 0 ; P35 = 1; P34 = 1;
	key_scan = (key_scan << 4) | ( P3 & 0x0F);

	P44 = 1 ; P42 = 1 ; P35 = 0; P34 = 1;
	key_scan = (key_scan << 4) | ( P3 & 0x0F);

	P44 = 1 ; P42 = 1 ; P35 = 1; P34 = 0;
	key_scan = (key_scan << 4) | ( P3 & 0x0F);	
	
	switch(~key_scan)
	{
		case 0x8000 : key_val = 4 ; break;
		case 0x4000 : key_val = 5 ; break;
		case 0x2000 : key_val = 6 ; break;
		case 0x1000 : key_val = 7 ; break;
		
		case 0x0800 : key_val = 8 ; break;
		case 0x0400 : key_val = 9 ; break;
		case 0x0200 : key_val = 10 ; break;
		case 0x0100 : key_val = 11 ; break;		
		
		case 0x0080 : key_val = 12 ; break;
		case 0x0040 : key_val = 13 ; break;
		case 0x0020 : key_val = 14 ; break;
		case 0x0010 : key_val = 15 ; break;	

		case 0x0008 : key_val = 16 ; break;
		case 0x0004 : key_val = 17 ; break;
		case 0x0002 : key_val = 18 ; break;
		case 0x0001 : key_val = 19 ; break;				
		
		default :key_val = 0 ; break;
	}
	
	return key_val;
}

在比赛中我们经常是要求不能连续按下,所以需要对扫描代码做点处理
代码如下

//此段代码放置在100ms时间轴里面 mat_key_val为最终读取到的结果
u8 mat_key_val;
void key_read(void)
{
	static u8 key_first_flag = True;
	u8 key_nu;
	key_nu = key_scan();
	
	if(key_first_flag == True)
	{
		mat_key_val = key_nu;
		key_first_flag = False;
	}
	else
	{
		mat_key_val = 0;
	}
	
	if(key_nu == 0)
	{
		key_first_flag = True;
		
	}
}

数码管

原理图

可以看到数码管的控制跟LED类似 ,也是通过74HC138定位,在数码管中,我们要定位两次,一次是Y6–控制数码管哪一个亮,一次是Y7控制数码管亮什么。

控制流程

消隐 定位数码管位置 控制数码管显示

代码

控制数码管亮一个的代码。、
参数:core亮的位置 ,num 显示的数字

u8 code t_display[]={                   
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40};

void seg_disp_one(u8 core,u8 num)
{
	P0 = 0;
	P2 = P2 & 0x1F | 0xE0;
	P2 &= 0x1F;
	
	P0 = 1 << core;
	P2 = P2 & 0x1F | 0xC0;
	P2 &= 0x1F;
	
	P0 = ~t_display[num];
	P2 = P2 & 0x1F | 0xE0;
	P2 &= 0x1F;	
}  

比赛中肯定不会只让我们显示一个数字,基本都是让我们显示时间,温度,电压等。
在这里我用一个数组存储每个数码管要显示的数字,然后在每1MS刷新一次数码管。
代码如下

u8 seg_buff[8];
//代码放入1ms时间轴
void seg_disp(void)
{
	static u8 i;
	
	seg_disp_one(i,seg_buff[i]);
	
	i++;
	
	if(i> 7)
	{
		i = 0;
	}
	
}

下一章-串口

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服