如何用C51单片机实现P0口接两个按键,P1口接8个LED灯。key1按下左移动1位点亮LED key2按下右移动1位点LED

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

sbit key=P0^0;

void Delay_ms(uint xms) //延时程序,xms是形式参数

{

uint i, j;

for(i=xms;i>0;i--)

for(j=115;j>0;j--);

}

void main()
{

uchar led_data=0xfe;

while(1)

{

P1=led_data;//默认第一位亮

if(key==0)

Delay_ms(10);

if(key==0)

{

while(!key);

Delay_ms(200); //延时0.5s

led_data=_crol_(led_data,1);//移位函数,使led_date向左循环移动1位

}

}
}
我的目的要在程序里面添加1个按键,控制右移。

给个四路:
定意一个变量;
if(按键1按下)
变量为1;
if(按键2按下)
变量为2;

if(变量==1)

左移控制;

else if(变量==2)

右移控制;
追问

谢谢!通过楼上的方法成功实现。
还有一个问题,就是单片机上电P1.0是亮的,我想实现上电的状态是0xff
当按键按下开始从0xfe开始移位。

追答

那就判断,当按键按下时,赋值为0xfe,然后一次移位一次,循环移位,当移动到0x00时,赋初值继续移位就行了。

追问

怎么写(赋值为0xfe,然后一次移位一次,循环移位,当移动到0x00时,赋初值)
我不会啊,能不能像楼上的网友详细的。举一个例子?

追答

定义一个变量a,初始值为0;
当按键按下后,a赋值为2;
主循环中判断,如果a是2,就一次左移。、
char a =0;
uchar lsv =0xfe;
while(1)
{
if(key0==0)
{
delay(20); //20ms消抖
if(key0==0)
{
a=2;
}
}

if(a==2)
{
lsv=lsv<<1; //左移一次
delay(100); //根据需要延时一段时间
if(lsv==0x00)
{
lsv=0xfe;
}
}
}

追问

谢谢!能不能给完整的?
这个是主函数吗?
前面要不要声明,定义什么?

追答

这个就是主程序里面的,前面只要定义变量就可以了。

追问

我按照你的方法试了,还是不行。

编译错误:if(key0==0)

追答

key0 是一个按键的检测管脚,你要定义一下

追问

我按照你的方法试了,LED不亮,按键按下也没反应。

追答

你还要加一条:
P1=lsv;
LED 接在哪个口就赋值给哪个口。

追问

左移没有规律,按1下移动1位,再按3位,再按全亮............
P1=lsv;这个具体加在哪个位置?

追答

if(a==2)
{
lsv=lsv<<1; //左移一次
delay(100); //根据需要延时一段时间
if(lsv==0x00)
{
lsv=0xfe;
}
}

放在这里........

追问

哈哈,成了流水灯。

追答

你想要的是什么呢?

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-26
主函数,改改即可:

void main()
{
uchar led_data=0xfe;//默认第一位亮
P1=led_data;
while(1) {
if(key==0) {
Delay_ms(10);
if(key==0) {
while(!key);
led_data=_crol_(led_data,1);//led_date向左循环移动1位
P1=led_data; //一位亮
Delay_ms(200); //延时0.5s
}
}
}
}

试试看。追问

你的方案,我试了不行。
谢谢你!我已经解决了此问题。

追答

前面给出的,仅仅是主函数。


在主函数的前面,再写上楼主原来的部分:


#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

sbit key = P0^0;


void Delay_ms(uint xms)  //延时程序

{

    uint i, j;

    for(i = xms; i > 0; i--)  for(j = 115; j > 0; j--);

}


void main()      //同上
{

……


本程序,仿真运行的截图如下:


实践证明,前面给出的程序,是完全正确的。

追问

我要的是两个按键的,KEY1控制左移KEY2控制右移。
你给的程序只有1个按键,只能左移。

追答

哦,看你的程序,仅仅给出一个按键接口,就以为,你是一个按键,没有调好。

再增加一个,也不难,复制一下前面的程序,简单的改改即可。

指定一个按键接口 KEY2,主函数程序修改如下:

void main()
{
uchar led_data=0xfe;//默认第一位亮
P1=led_data;
while(1) {
if(key==0) {
Delay_ms(10);
if(key==0) {
while(!key);
led_data=_crol_(led_data,1);//led_date向左循环移动1位
P1=led_data; //一位亮
Delay_ms(200); //延时0.5s
}
}
//--------------------------控制右移部分程序如下
if(key2==0) {
Delay_ms(10);
if(key2==0) {
while(!key2);
led_data=_cror_(led_data,1);//led_date向右循环移动1位
P1=led_data; //一位亮
Delay_ms(200); //延时0.5s
}
}
//--------------------------
}
}

本回答被提问者和网友采纳
相似回答