预备知识
1.数码管的显示共有两种方法---静态的与动态的
动态的显示方法是需要不断刷新的
本文主要阐述的是动态显示的方法
代码
#include <REGX52.H>
#include "Delay.h"
unsigned char Nixie_Buf[9]={10,10,10,10,10,10,10,10,10};//此函数调用NixieTable()函数Nixie_Loop中调用
//第十位即为不显示为0x00
unsigned char NixieTable[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x08};
//点才是第一个然后往后推
//.,g,f,e,d,c,b,a,//0到9,不显示,显示中间一段,显示底下一段
void Nixie_SetBuf(unsigned char Location,Number)//配置数码数组
{
Nixie_Buf[Location]=Number;//制位Nixie_Buf
}
void Nixie_Scan(unsigned char Location,Number) //数码管需要循环扫描才能正常显示
{
P0=0x00;//清零 消影 单片机运行速度过快防止数据串到下一个数据位
switch(Location)位选
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;//7
case 2:P2_4=1;P2_3=1;P2_2=0;break;//6
case 3:P2_4=1;P2_3=0;P2_2=1;break;//5
case 4:P2_4=1;P2_3=0;P2_2=0;break;//4
case 5:P2_4=0;P2_3=1;P2_2=1;break;//3
case 6:P2_4=0;P2_3=1;P2_2=0;break;//2
case 7:P2_4=0;P2_3=0;P2_2=1;break;//1
case 8:P2_4=0;P2_3=0;P2_2=0;break;//0
}
P0=NixieTable[Number];//段选
}
void Nixie_Loop(void) //2ms调用
{
static unsigned char i=1; //定时器充当Delay的角色 充分显示
Nixie_Scan(i,Nixie_Buf[i]); //NixieScan才为真正的显示
i++; //刷新值显示放入Nixie_Scan
if(i>=9){i=1;}
}
代码的阐述
方法:
前面说过数码管的动态显示是需要不断地扫描,此代码使用的是定时器的扫描方法,Nixie_Loop函数是放在一个定时器中断中的,因此可以不断的进行扫描,利用了人眼的余晖效应,扫描完整个数码管也才16ms,人眼看来是一直在亮的,但实际上是一次次扫描的结果
上述代码中
先要明白数码管的显示都是在Nixie_Scan函数中进行的
我们调用了Nixie_SetBuf数组
Nixie_SetBuf数组又调用了Nixie_Buf数组
Nixie_Buf有9个成员的原因是数组从零开始 , 有九个就可以让一就是一而不是零
Nixie_Buf函数整个又被Nixie_Scan数组调用
Nixie_Scan就真正的显示了
看不懂可以多看几次
确实比较难理解