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