一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 1893|回复: 21

求教51流水灯

  [复制链接]
发表于 2013-1-24 22:07 | 显示全部楼层 |阅读模式
本帖最后由 benli 于 2013-1-24 22:09 编辑

自己学写的,设想是按下key1后P3口左移流水灯,按key2右移流水灯,但实际是按下按键一次只能移动一位,请教下如何修改,
另外keil里复制出来汉字怎么都成了乱码?
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P2^1;    //定义key1
sbit key2=P2^2;    //定义key2
void yanshi(uint);  //子函数
uchar aa;
void main(void) //主函数
{
  aa=0xfe;   //定义aa初值
  while(1)    //大循环
  {
  P3=aa;    //LED为P3
  if(key1==0)

    {
   yanshi(10); //按键延时
   if(key1==0)
   
   {
     yanshi(200);     //yanshi
   aa=_crol_(aa,1);   //aa左移1位   }
    while(!key1);  
   
   }
     if(key2==0)
    {
   yanshi(10);  //按键延时
   if(key2==0)
{
    yanshi(200);     //yanshi
   aa=_crol_(aa,-1);
   while(!key2);   //aa右移一位
   }
}
}
void yanshi(uint xms)  //延时子函数
{
         uint i,j;
      for(i=xms;i>0;i--)     //yanshi xms
       for(j=110;j>0;j--);  
}


QQ截图20130124220606.png
发表于 2013-1-24 22:29 | 显示全部楼层
本帖最后由 199003326 于 2013-1-24 22:30 编辑

程序按键检测内只让流水灯移了一位。

换个思路吧

一个思路,先把LED依次点亮的9人状态取码,然后放到数组内,进程序后主循环,分别检测按键,调用数组输出。
回复

使用道具 举报

发表于 2013-1-24 22:32 | 显示全部楼层
程序没有循环,不会有流水灯效果,要把aa循环左移或者右移一位才行,楼主的程序只是单一的循环一位。
我也是菜鸟说的不对请大侠修正~{:3_472:}
回复

使用道具 举报

发表于 2013-1-24 22:34 | 显示全部楼层
我看不懂程序。(C还木有入门)
但是要是我做的话,就设一个标志位,按键用来修改标志位,而移动的程式通过PAN断标志位来左移或右移,或是做别的什么,而不是直接读按键来左移或右移。如果不放心,还可以用其他的口把标志位的壮态指示出来。。
回复

使用道具 举报

 楼主| 发表于 2013-1-24 22:39 | 显示全部楼层
回复 2# 199003326


    太菜做不了
回复

使用道具 举报

 楼主| 发表于 2013-1-24 22:42 | 显示全部楼层
回复 3# nonoge


   刚学C, 就是不知道如何加入循环语句
回复

使用道具 举报

发表于 2013-1-24 23:11 | 显示全部楼层
本帖最后由 静夜思月晖 于 2013-1-24 23:13 编辑

问题是你的那个对于键盘的判断是一次性的,或者说是单次执行的,必须用while语句才能达到条件满足一直执行的目的,还需要用标志位,给你一个我自己写的程序#include<reg52.h>
#define  uchar unsigned char
#include<reg52.h>
#define  uchar unsigned char
#define  uint unsigned int
sbit set=P3^2;
sbit add=P3^3;
sbit dec=P3^4;
int shi,fen,miao;
void xianshi(int weizhi,int shuzhi);
void xianshi1(int c);
void delay(x);
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code weizhi[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void delay(x)
{
int i;               
while(x--)
for(i=0;i<110;i++);
}
main()
{ int i,flag=0;
EA=0;
ET0=0;
TMOD=0X02;
TH0=0X38;
TL0=0X38;
TR0=1;
while(1)
{
if(TF0==1)
{
  i++;
  TF0=0;
  if(i==108)
  {
   i=0;
   miao++;
   if(miao==60)
   {
    miao=0;
    fen++;
    if(fen==60)
    {
     fen=0;
     shi++;
     if(shi==24)         
     {
      shi=0;
     }
    }
   }
  }
}
  if(set==0)
  {
   delay(10);
   if(set==0)
   {
    TR0=0;
    flag=1;
    while(~set);
   }
  }
    while(flag==1)
    {
     xianshi(7,miao);
     xianshi(4,fen);
     xianshi(1,shi);
     xianshi1(2);
     xianshi1(5);
     if(set==0)
     {
      delay(10);
      if(set==0)
      {
       flag=2;
      //TR0=1;
       }
       while(~set);
     }
    if(add==0)
    {
     delay(10);
     if(add==0)
     {
      shi++;
      if(shi==24)
      {
       shi=0;
      }
      while(~add);
     }
    }
     if(dec==0)
     {
      delay(10);
      if(dec==0)
      {
       fen++;
      
       if(fen==60)
       {
        fen=0;
       }
      }
      while(~dec);
     }
     
    }
    if(flag==2)
    {
     flag=0;
     TR0=1;
    }
  //TR0=1;
  xianshi(7,miao);
  xianshi(4,fen);
  xianshi(1,shi);
  xianshi1(2);
  xianshi1(5);
}
}
void xianshi(int c,int shuzhi)
{
int a,b;
a=shuzhi/10;
b=shuzhi%10;
P2=weizhi[c];
c--;
P0=table;
delay(1);
P0=0xff;
P2=weizhi[c];
P0=table[a];
delay(1);
}
void xianshi1(int c)
{
P2=weizhi[c];
P0=0x40;
}
void dingshi() interrupt 1
{
//TH0=0X38;
//TL0=0X38;
}
回复

使用道具 举报

发表于 2013-1-24 23:13 | 显示全部楼层
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P2^1;    //定义key1
sbit key2=P2^2;    //定义key2
void yanshi(uint);  //子函数
uchar aa;
void main(void) //主函数
{uchar i;
  aa=0xfe;   //定义aa初值
  while(1)    //大循环
  {
  P3=aa;    //LED为P3
  if(key1==0)

    {
   yanshi(10); //按键延时
   if(key1==0)
   
   {
     yanshi(200);     //yanshi
    for(i=0;i<7;i++)
    {
     aa=_crol_(aa,1);   //aa左移1位   

     yanshi(100);   
    }

     while(!key1);  
   }
     if(key2==0)
{
   yanshi(10);  //按键延时
   if(key2==0)
{
    yanshi(200);     //yanshi
    for(i=0;i<7;i++)
   {
    aa=_cror(aa,1);
    yanshi(100);
    }
    while(!key2);   //aa右移一位
  }
}
}
void yanshi(uint xms)  //延时子函数
{
         uint i,j;
      for(i=xms;i>0;i--)     //yanshi xms
       for(j=110;j>0;j--);  
}
回复

使用道具 举报

 楼主| 发表于 2013-1-25 07:44 | 显示全部楼层

标题

回复 7# 静夜思月晖


    初学,还搞不懂那么多
回复

使用道具 举报

 楼主| 发表于 2013-1-25 07:51 | 显示全部楼层
回复 8# xiaosongj210


    多谢!不过不懂为何加上一个for语句就变成了循环。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-19 08:50 , Processed in 0.063312 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表