蓝桥杯STC基础代码
- 上一章-以定时器计数作为时间轴的模板
- 文章网址
- 代码下载地址
- 蓝桥杯必用基础外设
- LED
- 原理图
- 控制流程
- 代码
- 按键
- 原理图
- 控制流程
- 代码
- 数码管
- 原理图
- 控制流程
- 代码
- 下一章-串口
上一章-以定时器计数作为时间轴的模板
文章网址
上一次讲到了利用定时器2计数作为时间轴,根据每个任务特点分配运行时间。
文章网址
代码下载地址
代码在蓝桥杯的板子上测试过,基础定时器2的流水灯,以及矩阵按键读取,数码管显示,
代码下载地址
蓝桥杯单片机资源包
蓝桥杯必用基础外设
LED
原理图
原理图
控制流程
根据原理图,我们可以看到板子上的通过74HC138芯片来控制LED的。
当P2 = 0x80 即 P25 = 0 P26 =0 P27 =1 时 -----Y4 P0管脚就可以用来控制LED。
值得注意的是:LED是共阳极。
控制过程如下;
代码
代码如下
//这是一段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;
}
}