前言
其实大家看一看近些年的题目,就会发现,LED数码管这种是比较多,以及按键操作。数码管基本上是必有,所以说熟练掌握数码管以及其显示,极其重要。
硬件略解
20191402779.png)]
在前面几章的结束之后,你会发现整块板子的这些IO口都是差不多的操作。所以这里就不再赘述了
其实大家还需要知道的是数码管的一个LED顺序,因为很多时候题目会让你亮一些奇奇怪怪的东西。下图是一个数码管的引脚号。
其实你能注意观察到就是,从低位到高位就是从左往右顺时针的以及中间的横杠以及DP的点。虽然比赛现在给了共阳数码管的码表,但是我们还是需要知道怎么去计算的。
软件详解
其实像其他一样会有操作锁存器的操作,数码管这里需要操作锁存器时我们需要操作俩个,分别是段选和位选。至于数码管的动态扫描显示就也不详细说了,我自己写了一个,函数自己感觉挺好使的,这里给大家参考一下吧。
#include "smg.h"
char code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0x7f, (~0x40)};
//0-15 16为点
void comOpen(void)
{
P2 = (P2 & 0x1f) | 0xc0;
}
void comClose(void)
{
P2 &= 0x1f;
}
void showNumOpen(void)
{
P2 = (P2 & 0x1f) | 0xe0;
}
void showNumClose(void)
{
P2 &= 0x1f;
}
//简介@数码管八位显示指定的
//参数@从左到右分别是想显示的,数字代表上面的数组的索引序号,if中的数字代表那一位不显示
void smgDisplay(uint num1, uint num2, uint num3, uint num4, uint num5, uint num6, uint num7, uint num8)
{
int i;
uint nums[8];
nums[0] = num1;
nums[1] = num2;
nums[2] = num3;
nums[3] = num4;
nums[4] = num5;
nums[5] = num6;
nums[6] = num7;
nums[7] = num8;
for (i = 0; i < 8; i++)
{
if (nums[i] == 18) //不显示的数字号
{
continue;
}
comOpen(); //需要先位选后段选
P0 = (0x01 << i); //位选
comClose();
P0 = 0xff;
showNumOpen();
P0 = table[nums[i]]; //段选
delay_ms(1);
P0 = 0xff;
showNumClose();
}
}