一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3424|回复: 10

[其他综合] 玩垃圾流水灯暂时到这里了,请高手指点

[复制链接]
发表于 2013-7-15 19:37 | 显示全部楼层 |阅读模式
垃圾流水灯虽然功能很少,耽误了半个下午的时间,哎
请高手指点,有好的简洁语句吗

//fosc=12.0M  STC90C516RD+ 破烂花样流水灯
#include <reg51.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
int i,m;
uint16 j,k;
#define delay() j = 8000;while(j--);
void main()
{
m = 0x80;
while(1)
{
  for(i = 0;i < 8;i++)
  {
   P0 = ~(1 << i);
   delay();
  }
  for(i = 0;i < 8;i++)
  {
   P0 = ~(m >> i);
   delay();
  }
  for(i = 0;i < 9;i++)
  {
   P0 = (0x01|0xff) << i;
   delay();
  }
  for(i = 0;i < 9;i++)
  {
   P0 = ~((0x01|0xff) << i);
   delay();
  }
  for(i = 0;i < 8;i++)
  {
   P0 = (0x7f&0xff) >> i;
   delay();
  }
  for(i = 0;i < 8;i++)
  {
   P0 = ~((0x7f&0xff) >> i);
   delay();
  }

  for(i = 0;i < 4;i++)
  {
   P0 = ~((0x08 >> i)|(0x10 << i));
   delay();
  }
  for(i = 0;i < 4;i++)
  {
   P0 = ~(((0x80 >> i)|(0x01 << i)));
   delay();
  }
  
  for(i = 0;i < 4;i++)
  {
   P0 = ((0xef&0xf0) << i)|((0xf7&0x0f) >> i);
   delay();
  }
  for(i = 0;i < 4;i++)
  {
   P0 = ((0x7f) >> i)&((0xfe) << i);
   delay();
  }
}  
}

下一个目标,数码管显示
发表于 2013-7-15 19:53 | 显示全部楼层
学习些驱动液晶  或者数码管的吧   或者IIC   spi    串口   等等    led不会长见识    或者  在液晶上做流水灯吧
回复

使用道具 举报

发表于 2013-7-15 19:54 | 显示全部楼层
能加上注释吗?这是一个良好的习惯,不然过一段你再看这段程序自己都会头疼的.良好的注释也便于代码复用.另外主函数尽量不要有太多的内容,功能用子函数实现,作到良好的模块化.这样程序结构好,以后代码复用也方便些.
回复

使用道具 举报

发表于 2013-7-15 19:55 | 显示全部楼层
再有单片机程序最好附上电路图,至少及相关电路连接的文字说明.比如哪个口作什么,哪个引脚作什么.
回复

使用道具 举报

 楼主| 发表于 2013-7-15 21:35 | 显示全部楼层
谢谢各位的指导,我会注意自己的书写格式与养成良好的习惯的;8个LED接P0.0~P0.7口;从上至下,以此为单个LED左移与右移;逐个左移点亮,左移熄灭;逐个右移点亮,右移熄灭;中间向两边单个点亮,两边向中间单个点亮;中间向两边逐个点亮,两边箱中间逐个点亮;这个视功能的演示,可以下载到单片机里自己看效果
回复

使用道具 举报

发表于 2013-7-16 09:52 | 显示全部楼层
一个简单的流水灯用了四个全局变量?是不是有点太奢侈了?
另外定义变量的时候尽量清楚,最好是从字面上就能看出这个变量是干嘛使的。

进阶:简单的流水灯点亮后,试着用不同的思路去点亮,再加入更多的功能,比如按键改变流水方式等等,慢慢扩展,保证被流水灯玩的团团转,HOHO
回复

使用道具 举报

 楼主| 发表于 2013-7-16 15:41 | 显示全部楼层
谢谢大家,我现在在学数码管,学到按键就做个定时器模拟的时钟发挥一下,对我提的建议很好,我都会向着大家学习;请大家多给我提意见,这样我的进度才会有保障
回复

使用道具 举报

发表于 2013-7-16 16:55 | 显示全部楼层
多看些编程方面基础的书吧,学一下程序结构和编程风格

1楼这类代码写不了功能复杂的程序的。
回复

使用道具 举报

 楼主| 发表于 2013-7-16 17:19 | 显示全部楼层
再贴一个简单的定时器:

//流水灯接P3口;4位数码管位选接138译码器,
//段显接P0口    0000~9999S计数
#include <reg52.h>
typedef unsigned int uint16;
typedef unsigned char uint8;
uint8 code LED[] = {0x3f,0x06,0x5b,0x4f,//0,1,2,3
     0x66,0x6d,0x7d,0x07,//4,5,6,7
     0x7f,0x6f,0x77,0x7c,//8,9,A,b
     0x58,0x5e,0x79,0x71,//c,d,E,F
     0x54,0x40,0x76,0x80,0};//n,-,H,.
sbit LD = P1^1;
sbit LE = P1^0;
sbit AD = P2^2;
sbit BD = P2^3;
sbit CD = P2^4;
uint16 gx,sx,bx,qx,tx = 0;
void init()            
{
P0 = 0;
LD = 1;
LE = 1;
TMOD = 0X10;
TH1 = 0XFC;
TL1 = 0X18;
TR1 = 1;
}
void stac()
{
static uint8 i = 0;
gx = tx%10;
sx = tx/10%10;
bx = tx/100%10;
qx = tx/1000/100%10;
switch(i)
{
  case 0:AD = 0;BD = 0;CD = 0;i++;P0 = LED[qx];break;//14 E
  case 1:AD = 1;BD = 0;CD = 0;i++;P0 = LED[bx];break;//16 n
  case 2:AD = 0;BD = 1;CD = 0;i++;P0 = LED[sx];break;//13 d
  case 3:AD = 1;BD = 1;CD = 0;i=0;P0 = LED[gx];break;//17 -
  default:break;
}
}
void main()
{
uint8 i;
uint16 cont;
init();
while(1)
{
  if(TF1 == 1)
  {
   TF1 = 0;
   TH1 = 0XFC;
   TL1 = 0X18;
   cont++;
   stac();
  }
  if(cont == 1000)
  {
   cont = 0;

   tx++;
   if(tx == 9999)
    tx = 0;
   
   P3 = ~(1 << i++);
   if(i == 8)i = 0;
  }   
}
}
回复

使用道具 举报

 楼主| 发表于 2013-7-16 17:21 | 显示全部楼层
数码管用的是4位供阴数码管;用的都是普中开发板HC6800-EM3  V2.0
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-11-1 11:37 , Processed in 0.036554 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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