本帖最后由 马新豪 于 2023-2-3 11:30 编辑
C51单片机 静态及动态数码管显示(详细)
(详细版学习笔记,如有错误或不足,欢迎指正)
我们要做的第一件事是要先点亮数码管,我们单片机所用的是共阳数码管,点亮需要激活相应数码管,再把想要点亮的LED处给0。
将数码管对应的管脚赋值为0,即点亮。这里让第一个数码管显示字母S。
代码如下:
- #include <STC12C5AXX.h>
- void main ()
- { P11=0;
- P22=0;
- P21=0;
- P20=0;
-
- P00=0;
- P01=1;
- P02=0;
- P03=0;
- P04=1;
- P05=0;
- P06=0;
- P07=1;
-
- while (1)
- {
复制代码
由下图可以看出对a-g对应的各个数码管是什么,咱们的板子是高位对高位,低位对低位,所以赋值时,DB0对应个位,DB1对应十位,以此类推,可得0-9的数码管段码为0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98。
下面可以用switch case及数组来做到更方便的显示,这需要如上的段码来做到。这里让第六个数码管显示6。
代码如下: - #include <STC12C5AXX.h>
- unsigned char Nixie[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
- void Nixietube(unsigned char Location,unsigned char Number)
- {
- switch (Location)
- {
- case 1:P20=0;P21=0;P22=0;break;
- case 2:P20=1;P21=0;P22=0;break;
- case 3:P20=0;P21=1;P22=0;break;
- case 4:P20=1;P21=1;P22=0;break;
- case 5:P20=0;P21=0;P22=1;break;
- case 6:P20=1;P21=0;P22=1;break;
- }
- P0=Nixie[Number];
- }
- void main()
- {
- P11=0;
- Nixietube(6,6);
- while(1)
- {
-
- }
- }
复制代码
下一步需要做到多个数码管同时显示数字,但因为电路限制,不能让代码同时运行,所以可以用人眼的余晖效应,让每个数码管高速循环,以至于我们眼睛无法判断,来达到同时显示数字的目的。(这里需要添加延时函数,后面还需要清零来消影。)
代码如下:
- #include <STC12C5AXX.h>
- #include <intrins.h>
- void Delay1us() //@32MHz
- {
- unsigned char i;
- i = 5;
- while (--i);
- }
- unsigned char Nixie[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
- void Nixietube(unsigned char Location,unsigned char Number)
- {
- switch (Location)
- {
- case 1:P20=0;P21=0;P22=0;break;
- case 2:P20=1;P21=0;P22=0;break;
- case 3:P20=0;P21=1;P22=0;break;
- case 4:P20=1;P21=1;P22=0;break;
- case 5:P20=0;P21=0;P22=1;break;
- case 6:P20=1;P21=0;P22=1;break;
- }
- P0=Nixie[Number];
- Delay1us();
- P0=0xFF; //??:?????0xFF,?????0x00;
- }
- void main()
- {
- P11=0;
- while(1)
- {
- Nixietube(1,0);
- Nixietube(2,2);
- Nixietube(3,0);
- Nixietube(4,3);
- }
- }
复制代码注意:共阳归零0xFF,共阴0x00.
|