P3.0~P3.2接3个按键,P1口接8个发光二极管。现要求编程实现:
(1)按下K1,8个二级管亮灭交替,间隔时间为100ms;
(2)按下K2,发光二级管从左向右流动,间隔时间为200ms;
(3)按下K3,发光二级管从右向左流动,间隔时间为200ms。
这是我写的单片机代码,只是实现了K1的循环亮灭交替,K2和K3实现不了,不知函数_crol_和_cror_是否正确使用,希望大家可以指点我改进代码。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit LED=P1;
static bit flag=0;
static bit kp=0;
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
uchar key_scan(void)
{
static bit kp=0;
if((P3&0x07)!=0x07)
{
delayms(10);
if(((P3&0x07)!=0x07)&&(kp==0))
{
kp=1;
if((P3&0x07)==0x06)return 1;
if((P3&0x07)==0x05)return 2;
if((P3&0x07)==0x03)return 3;
}
}
else kp=0;
return 0;
}
void main(void)
{
uchar key_val;
while(1)
{
key_val=key_scan();
if(key_val==1)
{
do
{
P1=~P1;
delayms(100);
}
while(1);
}
if(key_val==2)
{
LED=0xfe;
P1=LED;
delayms(200);
while(1)
{
delayms(200);
LED=_crol_(LED,1);
//P1=((P1<<1)|(P1>>7));
}
}
if(key_val==3)
{
LED=0xfe;
P1=LED;
delayms(200);
while(1)
{
delayms(200);
LED=_cror_(LED,1);
//P1=((P1<<7)|(P1>>1));
}
}
}
}
1,你这种左右移动肯定有问题的。举个例子。0100<<1为1000。那么1000<<1为0000。而0000<<1依旧是0000。
2,你按键消抖建议延时20ms,因为根据按键不同,抖动时间不同。但一般是5-20ms。所以我建议延时20ms而不是10ms