//發時間所有函數,先參考七段,背好、寫好
#include <reg51.h>
sbit wled = P2^0;
char code DATA_7SEG[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0x46, 0xa1, 0x86, 0x8e};
char act[4]={0xfe, 0xfd, 0xfb, 0xf7 }; //個十百千之電晶體輪流低電位PNP導通
char data disp[4];
char di=0;//BJT基極腳--act一維陣列的索引值
int value;
unsigned char hi, lo;
//============================================
void delay(int d)
{
int i, j;
for(i=0; i<d; i++)
for(j=0; j<100; j++) ;
}
/*----------------------------*/
void led_bl()//二、一開始讓led亮2秒
{
int i;
for(i=0; i<1; i++)
{
wled=0; delay(2000);
wled=1;
}
}
/*----------------*/
void init_buf()//一、預設千百十個顯示為0000,用回圈跑4次
{
int i;
for(i=0; i<4; i++) disp[i]=DATA_7SEG[0];
}
/*------------------*/
void t0isr(void) interrupt 1 //計時器0中斷函數
{
/* 2 mS ISR...scan 1 time */
TH0=hi;//初始設定重抄一遍,計時中斷0 2ms 掃瞄一次,消除視覺暫留
TL0=lo;
P0=disp[di];//2ms掃瞄一次七段顯示器P0 P1是同時動作的
P1=act[di]; //P1 掃瞄個十百千即com0 com1 com2 com3
di++;
if(di==4) di=0;//週期為com0 com1 com2 com3 0123
}
/*------------------*/
void init_t1()//二、初始值設定TH0 TL0
{//中斷2ms會去執行
value=65536-2000;//模式1 值=2ms進來一次,初始值設定,獨立出來
TH0=hi=value/256;
TL0=lo=value%256;
TMOD=0x01;//模式1打開
IE=0x82;//Timer0中斷打開
TR0=1;//TR0打開,中斷一起動就會去跑
}
//----------------------------------------
void show_data(char c)
{
int d;
d=DATA_7SEG[c];//一維陣列7段顯示器=0~9
disp[0]=d;
disp[1]=d;
disp[2]=d;
disp[3]=d;
}
/*------------------*/
void test_seg()//三、測試7段顯示器
{
int i;
for(i=0; i<10; i++) //顯示0000 1111 2222 ~ 9999
{
show_data(i); //顯示資料,丟0~9
delay(500);
}
}
//----------------------------
main()
{
init_buf();
init_t1();
test_seg();
led_bl();
while (1)
{
test_seg();
}
}
沒有留言:
張貼留言