两天速成蓝桥杯单片机之数码管想显示(3)

it2023-09-04  71

前言

其实大家看一看近些年的题目,就会发现,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(); } }
最新回复(0)