这个是动态显示程序,能同时显示几个数字利用的动态扫描的原理,在51hei开发板上运行成功显示,没参考任何资料自己写的请大家多多指教
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code we[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
sbit dula=P2^6;
sbit wela=P2^7;
uchar c,d,e;
void sixseg(uint seg);
void delay(uint z);
void light(uchar c);
void main()
{
//初始化
// num1 = 0;
// cnt=table1[shu];
//设置计数器
//选取计数方式1
TMOD = 0x11;
//给计数器写初值
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%256;
////////////////////
//操作单片机
//开启CPU中断
EA = 1;
///////////////////
//开启定时器T0位中断
ET0 = 1;
//开启计数器
TR0 = 1;
//调用子函数
while(1)
{
sixseg(43456);
}
}
//子函数
void light(uchar c)
{
P0=0xff;
wela=1;
wela=0;//数码管消影。由于上次位选值被锁存,被选数码管就是上次的。
//导致下次段选输入会在上次位置显示本次值。
P0=table[c];
dula=1;
// P0=table[c];
dula=0;
P0=we[d];
wela=1;
// P0=we[d]; wela=1输出跟随输入,wela=0保持输出,在此赋值
//可能导致上次的输入被跟随而输出即不满足锁存器的建立和保存时间
//也可能是输入的IO口反转速度不够。
wela=0;
}
//子函数
void sixseg(uint seg)//seg只能表示<65536的数
{
int a;//注意当seg为long型时uint很慢,分两组显示
//int型相对清晰,而a为long型时程序龟速行驶。
//数码管呈流水灯状
uchar y,z,l,m,n;
/* x=seg/100000;
y=seg%100000/10000;
z=seg%100000%10000/1000;
l=seg%100000%10000%1000/100;
m=seg%100000%10000%1000%100/10;
n=seg%100000%10000%1000%100%10;
*/
y = seg/10000;
a = seg%10000;
z = a/1000;
a = a%1000;
l = a/100;
a = a%100;
m = a/10;
n = a%10;
if(e==2)
{
d=1;
light(y);
}
if(e==3)
{
d=2;
light(z);
}
if(e==4)
{
d=3;
light(l);
}
if(e==5)
{
d=4;
light(m);
}
if(e==6)
{
d=5;
light(n);
}
}
//中断函数
void time () interrupt 1
{
//自变量自加
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
e++;
if(e==7)
{
e=2;
// d++;
}
}
[此贴子已经被作者于2011-2-18 12:15:10编辑过]
|