#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wei =P2^7;
sbit duan=P2^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
uint temp,n,bai,shi,ge;
void delay();
void display (uchar bai,uchar shi,uchar ge); //顯示子函數
void main()
{ wei=0;temp=0;
duan=0;
TMOD=0x01; //選擇定時器及其工作方式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定式終端
TR0=1; //啟動定時
while(1)
{
wei=1;
P0=0xfb;
wei=0;
duan=1;
P0=table[ge];
duan=0;
delay();
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=table[shi];
duan=0;
delay();
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=table[bai];
duan=0;
delay();
}
}
void jishuqi () interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
if(n==20)
{ n=0;
temp++;
}
bai=temp/100;
shi=temp%100/10;
ge =temp%100%10;
}
void delay()
{ uint x,y;
for(x=5;x>0;x--)
for(y=110;y>0;y--);
}
這位是我學郭天祥編寫的數碼管自家計數器可是為何有的數字不顯示
這是我看他的視頻寫的。你參考下
#include<reg52.h>//導入頭文件
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義
sbit dula=P2^6;//定義段選口
sbit wela=P2^7;//定義位選口
//數碼表
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar temp,bai,shi,ge,aa;//變量聲明
void display(uchar bai,uchar shi,uchar ge);//三位數顯示函數聲明
void delay(uint z);//延時函數聲明
void init();//初始化聲明
void main()
{
init();//調用初始化函數
while(1)
{
if(aa==20)//判斷定時器1S時間
{
aa=0;//定時器清0
temp++;
if(temp==100)
{
temp=0;
}//只規定從0加到100
bai=temp/100;//求百位數
shi=temp%100/10;//求十位數
ge=temp%10;//求個位數
}
display(bai,shi,ge);//調用三位數顯示函數
}
}
//1MS延時函數
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//三位數顯示函數
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];//P0口送百位數碼
dula=0;
P0=0xff;//消隱
wela=1;
P0=0xfe;
wela=0;
delay(5);//延時5MS,不能超過定時器的時間,不然會出錯
dula=1;
P0=table[shi];//P0口送十位數碼
dula=0;
P0=0xff;//消隱
wela=1;
P0=0xfd;
wela=0;
delay(5);//延時5MS,不能超過定時器的時間,不然會出錯
dula=1;
P0=table[ge];//P0口送個位數碼
dula=0;
P0=0xff;//消隱
wela=1;
P0=0xfb;
wela=0;
delay(5);//延時5MS,不能超過定時器的時間,不然會出錯
}
//程序初始化函數
void init()
{
dula=0;//消隱,上電時關掉段鎖存器
wela=0;//消隱,上電時關掉位鎖存器
TMOD=0x01;//給TMOD賦值確定T0和T1的工作方式
//50MS定時
TH0=(65536-50000)/256;//高八位存入60轉換成十六進制數是3C
TL0=(65536-50000)%256;//低八位存入176轉換成十六進制數是B0
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
}
void timer0() interrupt 1//值為0時是外部中斷0,為1時是定時器計數器0
{
////再裝一次初值,因為值裝滿后清0,這樣下次進入中斷就會變成0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |