本帖最后由 郑中源 于 2023-1-23 17:02 编辑
一、静态数码管显示
有了点灯的基础后,我们就能很快理解如何操作数码管
如图,我们的板子上有六个数码管,每个数码管由8个led小灯组成,可以理解为原来排成一排的灯现在有了摆放的图案,摆成了“8”这个数字和它右下角的点
那么比如让最左边的数码管亮起的话,你只需要按照原理图对应一下,点亮八个中的哪几个灯能得到你想要的数字,然后像写点灯程序那样写入程序就好。
值得注意的是,由于74HC138每次只能让LEDSx(x=1~6)中一个为低电平,所以静态状态下,只能由一个数码管是亮的。
以下是我的程序,效果是让第六个数码管显示6,Nixietube函数中第一个数字代表第几个数码管,第二个数字代表显示几(提前设置好一个数组,P0口自动对应里面的十六进制数字)。
- #include <stdio.h>
- #include <STC12C5A60S2.H>
- void Nixietube(unsigned char position,unsigned char number);
- void main(){
- P11=0;
- Nixietube(6,6);
- while(1){
- }
- }
- void Nixietube(unsigned char position,unsigned char number){
- unsigned char Nixie[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
- switch(position){
- case 1:P22=0;P21=0;P20=0;break;
- case 2:P22=0;P21=0;P20=1;break;
- case 3:P22=0;P21=1;P20=0;break;
- case 4:P22=0;P21=1;P20=1;break;
- case 5:P22=1;P21=0;P20=0;break;
- case 6:P22=1;P21=0;P20=1;break;
-
-
- }
- P0=Nixie[number];
-
- }
复制代码 二、动态数码管显示(即让不同的数码管同时显示)
有了前面的基础,动态数码管也不是很难了,我们很快就能猜到加个延时就可以,延时不能太长,同时也不能不加,不然单片机的速度太快,数据传输会有误,每次显示完之后让P0全为1,以避免数据传输太快造成的错误。
程序如下:延时函数的赫兹根据晶振自行调整,由于人眼的余晖效应,不是同时发生的事会让你觉得同时,以达到目的。- #include <stdio.h>
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- void Nixietube(unsigned char position,unsigned char number);
- void Delay(unsigned char xms);
- void main(){
- P11=0;
- while(1){
- Nixietube(4,4);
- Nixietube(5,5);
- Nixietube(6,6);
- }
- }
- void Nixietube(unsigned char position,unsigned char number){
- unsigned char Nixie[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
- switch(position){
- case 1:P22=0;P21=0;P20=0;break;
- case 2:P22=0;P21=0;P20=1;break;
- case 3:P22=0;P21=1;P20=0;break;
- case 4:P22=0;P21=1;P20=1;break;
- case 5:P22=1;P21=0;P20=0;break;
- case 6:P22=1;P21=0;P20=1;break;
-
-
- }
- P0=Nixie[number];
- Delay(1);
- P0=0xFF;
-
- }
- void Delay(unsigned char xms) //@11.0592MHz
- {
- unsigned char i, j;
- while(xms--){
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- }
复制代码
end. |