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

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

文章网址

上一次讲到了利用定时器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;
	}
	
}

下一章-串口

文章地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章