一.仿真电路图
二.c语言代码
#include"at89x51.h"
unsigned int j;
unsigned char i,k,cz;
unsigned char code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x7c};//数码管的码表,0-9
unsigned char b[]={0,0,0,0};
unsigned int wx=1150;
bcd()//将一个四位数拆开
{
b[0]=wx/1000;
b[1]=(wx%1000)/100;
b[2]=(wx%100)/10;
b[3]=wx%10;
}
tv()//每一个for循环只显示一位数,且位选与段码相对应,
//程序快速、反复执行tv函数,肉眼就分辨不出这四个数是一位一位显示出来的,这就是动态扫描
{
cz=0xfe; //位选端初值1111 1110从左往右一次是P0_7,P0_6...P0_0
for(i=0;i<4;i++)
{
k=b[i];//k作为中转保存b数组中的数例如:b[0]=1,则k=1
P2=a[k];//P2口是段码,a[1]即a数组中的第二个:0x06,在数码管上显示出1的模样
P0=cz;
for(j=0;j<550;j++);//延时
cz=(cz<<1)+1;//将'0'左移:1111 1110先左移一位,空出来的用0补上即1111 1100,再加1即为1111 1101
}
}
Key()
{
if(P3_2==0)//P3_2按键按下
{
while(P3_2==0);//在按键按下时程序在这里进入死循环等待按键松开
wx=wx+9;//按键松开后执行这一句
if(wx>=1200){wx=1200;}//判断wx是否大于1200,如果大于1200则wx不再增加
}
if(P3_3==0)//P2_3按键按下
{
while(P3_3==0);
wx=wx-12;
if(wx<=1100){wx=1100;}//判断wx是否小于1100,如果小于1100则wx不再减少
}
}
void main(void)
{
while(1)
{
key();
bcd();
tv();
}
}
数码管本质是8个长条形状的发光二极管,组成一个‘8’的形状,这些二极管全亮就是8全不亮就是0,8个发光二极管按顺序排列,并表上abcdefgh的序号,通过控制个别二极管的亮与不亮来达到显示数字的效果。
至于四位数码管,段码是8根线,也就是一位数码管的那8根线,位选四根线,位选就相当于四个数码管的开关,因为段码的8跟线一次只能传一个数,所以数码管只能有一位数显示出来,如果开关全部打开那么四位数码管就会显示出一样的数字,与我们想要表达的东西是不一样的,所以位选端一次只打开一个数码管的开关,而且从左往右依次打开,相应的,段码也送出相应的数的段码,只要给数的速度够快,人眼就分辨不出来。
工具:keil c、proteus