這個是動態顯示程序,能同時顯示幾個數字利用的動態掃描的原理,在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編輯過]
|