一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
楼主: benli

求教51流水灯

  [复制链接]
发表于 2013-1-25 09:52 | 显示全部楼层
  1. #include <REGX51.H>

  2. #define LED P1

  3. sbit KEY = P3^0; //按键,用于切换方向

  4. unsigned char lightcode[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED逐个点亮的代码

  5. bit flag = 0; //用于标志流水灯方向

  6. void delay(unsigned int delaynms) //延时
  7. {
  8. unsigned int i,j;
  9. for(i=0;i<delaynms;i++)
  10. {
  11. for(j=0;j<110;j++)
  12. {
  13. ;
  14. }
  15. }
  16. }

  17. void keyscan(void)
  18. {
  19. if(KEY==0)
  20. {
  21. delay(1);
  22. if(KEY==0)
  23. {
  24. flag=~flag;
  25. }
  26. }
  27. }

  28. int main(void)
  29. {
  30. unsigned char display=0; //用于查表
  31. while(1)
  32. {
  33. keyscan();

  34. if(flag==0) //标志位判断
  35. {
  36. display++;
  37. if(display>8)
  38. {
  39. display=1;
  40. }
  41. }
  42. else
  43. {
  44. display--;
  45. if(display==0)
  46. {
  47. display=8;
  48. }
  49. }


  50. LED=lightcode[display]; //送显

  51. delay(100); //延时
  52. }
  53. }
复制代码
回复

使用道具 举报

发表于 2013-1-25 09:56 | 显示全部楼层
楼上的代码可实现LZ所提的要求,单键就可更改流水灯方向。
但以上程序还有不完美的地方:
1、按键响应不够及时,原因在于主循环内使用延时函数,使按键检测频率降低,可通过使用定时器方式扫描按键来改善体验。
2、效率低下,大部分时间单片机都在加数玩,提高效率方法同样是使用定时器,呵呵。
回复

使用道具 举报

 楼主| 发表于 2013-1-25 12:05 | 显示全部楼层
回复 11# 199003326


    初学C语言,很多语句还没接触到,无法看懂。这源码是如何复制出来的,我从keil里复制汉字都是乱码。
回复

使用道具 举报

发表于 2013-1-25 18:06 | 显示全部楼层
回复  199003326


    初学C语言,很多语句还没接触到,无法看懂。这源码是如何复制出来的,我从keil里 ...
benli 发表于 2013-1-25 12:05 https://www.yleee.com.cn/images/common/back.gif



    呃,复制-粘贴就完了啊....
回复

使用道具 举报

 楼主| 发表于 2013-1-25 19:05 | 显示全部楼层
回复 14# 199003326


    俺复制出来汉字怎么全成了乱码
回复

使用道具 举报

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


    试了一下,无效。
回复

使用道具 举报

 楼主| 发表于 2013-1-26 11:38 | 显示全部楼层
if(key==0)
这里为何要用2个等号?与一个有什么区别
回复

使用道具 举报

发表于 2013-1-26 17:16 | 显示全部楼层
回复 17# benli


   2个等号是判断语句;相当于比较KEY是否等于0;if(key==0) //判断key是否等于0
{
         yanshi(10);  //延时10ms 按键消抖
          if(key==0)//再次判断key是否等于0,等于0表示有按键按下,不等于0则表示没有按键按下(直接跳出if语句或执行else里面的语句)
              {
                             //这里写有按键按下时需要执行的程序
                             }
               else
               {
                      //这里写没有按键按下时需要执行的程序
                       }
                 }
回复

使用道具 举报

发表于 2013-1-26 17:42 | 显示全部楼层
回复 17# benli

    笼统来说,
    A==B   是判断表达式,它的值,如果A等于B就是1;如果A不等于B就是零。
    例:
A=3, B=4,
A==B 这个表达式的值就是0,
如果if(A==B) doSomething(); 这个doSomething()这个函数就不会被执行。

又例:
A=4, B=4,
A==B 这个表达式的值就是1,
如果if(A==B) doSomething(); 这个doSomething()这个函数就被执行。



A=B则是赋值表达式,将B的值赋值给A。
例,
B=3;   --------将3赋值给B
A=B;   --------将A的值赋给B,A会得到B的值,也就是3.
回复

使用道具 举报

 楼主| 发表于 2013-1-26 18:10 | 显示全部楼层

标题

回复 18# nonoge


    明白了,多谢!
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-19 13:48 , Processed in 0.035279 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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