8051的問題,可以的話請幫幫忙
以下是我自已寫出來的程式,但是,PWM在Low的時候不是為0(約1%),high的時候也不是完全為1(約99%左右),可否有人教學一下,如何修改會比較好些
//硬體:P0接LED共陽,P1接SW落地
//目的:按SW,LED燈漸亮,再按一次,LED漸滅
//ok
#include <C8051F330.h>
sbit P10 = P1^0;
char one=0;
char zero=0;
unsigned char KeyTemp=0xff;
unsigned char KeyData=0xff;
unsigned char a;
void delay(unsigned int t);
void main(void)
{
void KeyScan(void); //呼叫按鍵掃描函數
unsigned int CYCLE=1000,PWM_LOW=1;
PCA0MD &= ~0x40; //關看門狗
XBR1 = 0x40; //Cossbar Enable
while(1)
{
KeyScan(); //掃描按鍵
if(KeyData!=0xff) //按下任何按鍵
{
a++;
if(a>1)
a=0;
KeyData=0xff;
}
if(a==0x00)
{
P0=0x00;
delay(PWM_LOW);
P0=0xff;
delay(CYCLE-PWM_LOW);
PWM_LOW--;
if(PWM_LOW<=0)
PWM_LOW++;
}
else if(a==0x01)
{
P0=0x00;
delay(PWM_LOW);
P0=0xff;
delay(CYCLE-PWM_LOW);
PWM_LOW++;
if(PWM_LOW>=999)
PWM_LOW--;
}
}
}
void KeyScan(void) //按鍵掃描函數
{
bit KeyStatus; //按鍵狀態
P10=1; //設定P10為輸入
KeyStatus=~P10; //反相讀取按鍵狀態
if(KeyStatus!=0) //按下?
{
one=0;
if(KeyTemp!=KeyStatus) //與上次所讀的鍵值不同?
{
KeyTemp=KeyStatus; //儲存新鍵值
zero=1; //設定zero=1
}
else //與上次所讀的鍵值相同
{
if(zero<5) //zero<5?
{
zero+=1; //zero+1
if(zero==5) //zero=5?
KeyData=KeyTemp; //按鍵已除彈跳
}
}
}
one+=1;
if(one==5) //按鍵已放開
{
zero=0;
KeyTemp=0xff; //清除按鍵值
KeyData=0xff; //清除按鍵值
}
}
void delay(unsigned int t)
{
while(--t);
}