实现P0口驱动8个发光二极管流水灯点亮,设置三个按键 c51单片机 急用!

 我来答
繁星满天0001
2016-12-31 · 超过37用户采纳过TA的回答
知道小有建树答主
回答量:69
采纳率:0%
帮助的人:46.9万
展开全部
LED灯简单,设置P0为推挽输出,根据按键不同,使P0输出不同的值,根据以下代码修改以下吧。

//============================================================================
//按键测试程序.按下S1-S3,在LCD上分别显示1-3

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include <c8051f310.h> // SFR declarations
#include <INTRINS.H>
#include <stdio.h>

sbit key1=P2^1;
sbit key2=P2^2;
sbit key3=P2^3;

unsigned long q;
unsigned char led;

//--------------------------------
void YJ_Init(void);
void SPI0_Init (void);
void Write_CHAR(unsigned char yjchar);
unsigned char key_in(void);
//-----------------------------------------------------
void delay(void)
{
int a=1000;
while(a!=0)
{
a--;
}
}

/*----------------------------------------------------*/
//按键连接到p2.0、p2.1、p2.2、P2.3,均为开漏输出
unsigned char key_in(void)
{
XBR0 =0X00;
P2=0xff;
if(key1==0)
{
key1=1;
delay();//延时
if(key1==0)
{
while(key1==0);
XBR0 =0X02;
return(0x32);//返回字符"1"表示按键SW1按下
}
}

if(key2==0)
{
key2=1;
delay();//延时
if(key2==0)
{
while(key2==0);
XBR0 =0X02;
return(0x33);//返回字符"3"表示按键SW1按下
}
}

if(key3==0)
{
key3=1;
delay();//延时
if(key3==0)
{
while(key3==0);
XBR0 =0X02;
return(0x34);//返回字符"3"表示按键SW1按下
}
}

if(key4==0)
{
key4=1;
delay();//延时
if(key4==0)
{
while(key4==0);
XBR0 =0X02;
return(0x31);//返回字符"4"表示按键SW1按下
}
}
XBR0 =0X02;
return(0);//返回0,表示没有按键按下
}

//---------------------------------------------
void main(void)
{
unsigned char data1;
value =1;

PCA0MD &= ~0x40; // WDTE = 0 (watchdog timer enable bit)
OSCICN |= 0x03; // Set internal oscillator to highest
// setting (24500000)

/* XBR0 = 0x00; // XBAR0: Initial Reset value
XBR1 = 0x40; // XBAR1: Initial Reset value

P2MDOUT = 0xf0; // Output configuration for P2
P3MDOUT = 0x1f; // Output configuration for P3
*/
P0SKIP = 0xFE;
P1SKIP = 0x7F;
XBR0 = 0x02; // Enable SMBus pins
XBR1 = 0x40; // Enable crossbar and weak pull-ups

P0MDOUT = 0xFF; // All P0 pins open-drain output
P0 = value;

P2MDOUT = 0xFF;
P3MDOUT |= 0x04; // P3.3 push-pull output

P2 |=0X01;

SPI0_Init ();

YJ_Init();
while(1)
{
data1=key_in(); //读按键
if(data1!=0x32) //根据按键返回值
{
for(q=0;q<1000;q++);
P0 = value<<1; //控制LED从右向左点亮
for(q=0;q<1000;q++);

}
if(data1!=0x33) //有按键按下,显示对应的按键
{
YJ_Init(); //LCD初始化

for(q=0;q<1000;q++);
P0 = value>>1; //控制LED从左向右点亮

for(q=0;q<1000;q++);

}

}

}
帐号已注销
2016-12-31 · TA获得超过2062个赞
知道小有建树答主
回答量:342
采纳率:0%
帮助的人:339万
展开全部
刚好昨天帮朋友做了一个流水灯的程序,三个按键改变状态的

但是没有数码管部分,若需要请自行添加,不多说了,程序如下

若满意请记得采纳! 星号只是为了区分各个函数的,不喜欢可删除

/***************************************************************************/
#include<reg52.h>

sbit k0=P1^0;//按键 1
sbit k1=P1^1;//按键 2
sbit k2=P1^2;//按键 3
int n,i,t;
char fa=0,fe=0;
char aa[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//单个流动编码
char bb[9]={0xff,0xfe,0xfb,0xef,0xbf,0xfd,0xf7,0xdf,0x7f};//13572468循环用编码
char cc[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
/***************************************************************************/
void main()
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
t=200;//间隔时间,单位毫秒 1000毫秒=1秒
while(1)
{
//对端口赋值
switch(fa)//根据标识符的状态控制输出
{
case(0):P2=aa[i]; break;//功能 1 输出
case(1):P2=bb[i]; break;//功能 2 输出
case(2):P2=cc[i]; break;//功能 3 输出
}

if(k0==0){fa=0;i=0;}//功能 1
if(k1==0){fa=1;i=0;}//功能 2
if(k2==0){fa=2;i=0;}//功能 3
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(fe==0&&n>t){n=0;i++;if(i>=9){fe=1;}}//如果达到一秒,且是状态一
if(fe==1&&n>t){n=0;i--;if(i<=0){fe=0;}}//如果达到一秒,且是状态二
}
/***************************************************************************/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式