数码管静态及动态显示
先试着让一个数码管亮起来
首先我们要知道,一个数码管有很多引脚,并且一般不单独使用。为了节省,我们使用三八译码器,三个端口就可以控制八个端口。
规定是从高位到低位顺序为A2、A1、A0。比如赋值P22=0,P21=0,P20=0,000转化为十进制就是0,就接通到Y0端口,也就是第一个数码管。P22=0,P21=1,P20=1,转化为十进制就是3,就接通到Y3端口,也就是第四个数码管。
已经选择了接通哪个数码管,接下来就该决定该让这个被选的怎么亮。以第一个为例。
注意是共阳还是共阴的的数码管,共阳接通赋低电平,共阴赋高电平。
我们让他显示数字一,就要让b,c端口接通,对照原理图,为P01、P02赋0。a、d、e、f、g、dp口不显示,就为P00、P03、P04、P05、P06、P07赋1。
代码如下:- <font face="楷体, 楷体_GB2312" size="6">#include <STC12C5A60S2.H>
- void main ()
- { P11=0;
-
-
- P22=0;
- P21=0;
- P20=0;
- P01=0;
- P02=0;
-
-
- P00=1;
- P03=1;
- P04=1;
- P05=1;
- P06=1;
- P07=1;
-
- while (1)
- {
- }
- }
- </font>
复制代码 第一个数码管被点亮。
一个数目管显示数字已经做到,接下来就是多个数码管同时显示数字。
因为电路原因,所有数码管输出端口都一起的,所以不可能同时让他们显示数字,不能既显示这个又显示那个。所以我写一个软件延迟代码,定义延迟函数。极短的延迟,人眼反应不过来,利用视觉暂留,做到人眼观察时接近同时显示。
又因为端口过多,为了方便,我定义一个函数,采用switch case语句和数组来选择数码管和它显示的数字,显示数字时也可以使用switch case语句,但是数组更加方便,一到八直接就是0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98。注意共阳归零为0xFF,共阴为0x00。
- <font face="楷体, 楷体_GB2312" size="6">#include <STC12C5A60S2.H>
- #include <INTRINS.H>
- void Delay(unsigned int xms)
- {
- unsigned char i, j;
- while(xms--)
- {
-
- _nop_();
- _nop_();
- i = 234;
- j = 114;
- do
- {
- while (--j);
- } while (--i);
-
- }
-
- }
- void Nixie (unsigned char Location,Number)
- {
-
- unsigned int Numbertable []={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
-
- 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=Numbertable [Number];
- Delay (1);//短暂延迟达到消影目的
- P0=0xFF;//共阳归零为0xFF,共阴为0x00
- }
- void main ()
- {
- P11=0;
-
- while(1)
- {
- Nixie (1,0);
- Nixie (2,4);
- Nixie (3,0);
- Nixie (4,7);
- Nixie (5,1);
- Nixie (6,2);
-
- }
- }
- </font>
复制代码 从左到右显示040712.
|