小弟学习51单片机,根据网上资料试验了用STC15W204S做 一个i/o口驱动发光二极管并扫描按键的电路,程序烧入后按键没反应,请各位大侠不吝赐教程序有何问题,谢谢。
#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;//静态计数变量
static bit sign_key=0; //静态标志位
uchar time_key,time_LED;//临时变量
// P1M0=0x00;//P1.0~3设置弱上拉
// P1M1=0x00;//P1.0~3设置弱上拉
time_LED=P1&0x0f;//保存4个LED状态
P1M0=0x00;//P1.0~3设置弱上拉
P1M1=0x00;//P1.0~3设置弱上拉
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状态
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;//计数变量清0
sign_key=0;//键态标志清0
}
P1&=0xf0; //P1.0~3清0
P1|=time_LED;//还原4个LED状态
P1M0=0x0f; //还原P1.0~3推挽设置
P1M1=0x00; //还原P1.0~3推挽设置
}
/*********************************
按键服务程序
*********************************/
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设置推挽
P1M1=0x00;//P1.0~0设置推挽
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{
key_scan();
key_service();
Delay1ms();//控制主循环周期约1ms
}
}
|