#include <reg51.h>
sbit wled = P2^7;
sbit spk = P3^4;
sbit k1 = P3^2;
sbit k2 = P3^3;
sbit op = P3^0;
//共陽 target >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
char code DATA_7SEG[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
char code act[6]={0xfe, 0xfd, 0xfb, 0xf7}; /* p2.0--p2.3 2.5*/
char data disp[6];
char di=0;
//============================================
void delay(int d)
{
int i, j;
for(i=0; i<d; i++)
for(j=0; j<100; j++) ;
}
/*----------------------------*/
void led_bl()
{
int i;
for(i=0; i<1; i++)
{
wled=0; delay(50);
wled=1; delay(50);
}
}
/*----------------*/
void init_buf()
{
int i;
for(i=0; i<6; i++) disp[i]=DATA_7SEG[0];
}
/*------------------*/
void t0isr(void) interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
P0=disp[di];
P1=act[di]; //P1 scan data not P2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
di++;
if(di==4) di=0;
}
void init_t1()
{
/* mode 1 2ms ISR */
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TMOD=0x01;
IE=0x82;
TR0=1;
}
//----------------------------------------
void show_data(char c)
{
int d;
d=DATA_7SEG[c];
disp[0]=d;
disp[1]=d;
disp[2]=d;
disp[3]=d;
}
/*------------------*/
void test_seg()
{
int i;
for(i=0; i<10; i++)
{
show_data(i);
delay(500);
}
}
//------------------------
void bz()
{
int i;
for(i=0; i<100; i++)
{
spk=0; delay(1);
spk=1; delay(1);
}
delay(50);
}
//-----------------------------------
void del() /* 100 uS 0.1 mS delay */
{
char i;
for(i=0; i<25; i++) ; //需微調
}
//-----------------------------
test_kx()
{
int c, i,j;
//wait k1 .......
//長按下 ---0 短按 2 下 pause
//
show_data(0); TR0=1;
c=0;
while(1)
{
go:
show_data(c); c++; if(c==9) c=0;
//短按 2 下 pause test 5000 次 k1==1 表示放開 在次按下) pause / clear
for(i=0; i<5000; i++) //5000
{
del();
if(k1==0) //表示放開 K=1 K=0 K=1 在次按下?
{
delay(100);
// while(1) if(k1==1) { delay(100); break;}
while(1) //loop count delay 5000
{ for(j=0; j<8000; j++) if(k1==1) { delay(100); goto next;}
if(k1==0) { delay(300); c=0; show_data(c);
while(1) if(k1==1) { delay(100); break;}
goto go; }
}
next:
// --------------------------------------------------
while(1) if(k1==0) { delay(100); break;}
while(1) if(k1==1)
{ //短按 2 下 pause.....get it!!!!!!!!!....
bz(); delay(500); //key to go.......
while(1) if(k1==0) { delay(300); goto go;}
break; //last state k1==1;放開
}
}
}//test t times key off
//一直案注 k1=0
// if(k1==0) { delay(300); if(k1==0) c=0; }
}//loop
}
//-------------------------------------
// 250HZ---4 ms =10x0.4 ms
// PWM 10~90% 切成 10 等分來控制
void del4() /* 400 uS 0.4 mS delay */
{
char i;
for(i=0; i<110; i++) ; //25x4=100 需微調>
}
//-------------------------------------------
void pwm(char du) //1~9
{
char i;
//wait k2 next
while(1)
{
if(k1==0) { delay(300); break; }
op=1; for(i=0; i<du; i++) del4();
op=0; for(i=0; i<(10-du); i++) del4();
}
}
//---------------------------
test_pwm()
{
//pwm1 seg=1 op=10% 250HZ LED8=10B
while (1)
{
show_data(1); TR0=1; pwm(1);
show_data(2); TR0=1; pwm(2);
show_data(3); TR0=1; pwm(3);
show_data(4); TR0=1; pwm(4);
show_data(5); TR0=1; pwm(5);
show_data(6); TR0=1; pwm(6);
}
}
//--------------------------------------------
main()
{
init_buf(); bz();
led_bl();
init_t1();
// test_seg();
// test_kx(); //測試按鍵按下 等基本功能,理解才容易記憶
test_pwm(); //測試 PWM 輸出 250HZ 如圖,k1 切換5組
while (1) {}
}
沒有留言:
張貼留言