|
小弟學(xué)習(xí)51單片機(jī),根據(jù)網(wǎng)上資料試驗了用STC15W204S做 一個i/o口驅(qū)動發(fā)光二極管并掃描按鍵的電路,程序燒入后按鍵沒反應(yīng),請各位大俠不吝賜教程序有何問題,謝謝。
#include <STC15.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P1^0; //LED端口聲明
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
uchar KeySec=0;//鍵值變量
/**********************************
1ms延時程序(僅限于STC15W 1T MCU)
**********************************/
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
/**********************************
按鍵掃描程序
**********************************/
void key_scan()
{
static uchar count=0;//靜態(tài)計數(shù)變量
static bit sign_key=0; //靜態(tài)標(biāo)志位
uchar time_key,time_LED;//臨時變量
// P1M0=0x00;//P1.0~3設(shè)置弱上拉
// P1M1=0x00;//P1.0~3設(shè)置弱上拉
time_LED=P1&0x0f;//保存4個LED狀態(tài)
P1M0=0x00;//P1.0~3設(shè)置弱上拉
P1M1=0x00;//P1.0~3設(shè)置弱上拉
P1|=0x0f; //P1.0~3置高電平
if(P1&0x0f!=0x0f)//有鍵按下
{
if(++count>=10 && sign_key==0)//消抖
{
sign_key=1;//自鎖
time_key=P1&0x0f;//保存P1.0~3狀態(tài)
switch(time_key)
{
case 0x0e: KeySec=1; break;//輸出鍵值
case 0x0d: KeySec=2; break;
case 0x0b: KeySec=3; break;
case 0x07: KeySec=4; break;
}
}
}
else //抬起
{
count=0;//計數(shù)變量清0
sign_key=0;//鍵態(tài)標(biāo)志清0
}
P1&=0xf0; //P1.0~3清0
P1|=time_LED;//還原4個LED狀態(tài)
P1M0=0x0f; //還原P1.0~3推挽設(shè)置
P1M1=0x00; //還原P1.0~3推挽設(shè)置
}
/*********************************
按鍵服務(wù)程序
*********************************/
void key_service()
{
switch(KeySec)
{
case 1: LED1=~LED1;KeySec=0;break;
case 2: LED2=~LED2;KeySec=0;break;
case 3: LED3=~LED3;KeySec=0;break;
case 4: LED4=~LED4;KeySec=0;break;
}
}
/********************************
主程序
********************************/
void main()
{
P1M0=0x0f;//P1.0~3設(shè)置推挽
P1M1=0x00;//P1.0~0設(shè)置推挽
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{
key_scan();
key_service();
Delay1ms();//控制主循環(huán)周期約1ms
}
}
|
|