登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 花样流水灯

[复制链接]
发表于 2017-2-8 19:40:44 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 数组,中断
学习安排: 自己多思考算法
开始时间: 2017-02-08
结束时间: 2017-02-08
本帖最后由 骆海洋 于 2017-2-8 19:40 编辑
花样流水灯
刚开始学单片机的时候点亮LED小灯已经让我们高兴不已,
学习到了现在感觉只点亮LED小灯好Low啊,所以突发奇想来个花样流水灯吧。
  • 今天点亮两种花样的流水灯:


[mw_shl_code=c,true]#include <STC12C5A60S2.H>

sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;

unsigned int cnt = 0;
unsigned char a1 = 0;
unsigned char i = 0;
unsigned char cnt1 = 0;
unsigned char key = 0;

unsigned char code a[] =
{
                0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,
                0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,
                0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,
                0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00        
};

void main ()
{
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ENLED = 0;
        
        TMOD = 0X01;
        TH0 = 0XF5;
        TL0 = 0X96;
        TR0 = 1;
        
        while(1)
        {
                if(TF0 == 1)
                {
                        TF0 = 0;
                        TH0 = 0XF5;
                        TL0 = 0X96;
                        cnt++;
                        
                        if(cnt >= 250)
                        {
                                cnt = 0;
                                a1++;
                                cnt1++;
                                i++;
                                
                                if(cnt1 >= 8)
                                {
                                        cnt = 0;
                                }
                        }
                }
               
                if(i <= 7)
                {
                        P0 = ~(0x01 << cnt1);
                }
                else
                {
                        P0 = ~(0x80 >> cnt1);
                }
                if(i >= 16)
                        i = 0;
               
                if(a1 == 40)
                                {
                                        a1 = 0;
                                }
                P0 = ~a[a1];
        }
}[/mw_shl_code]

    这个程序用于实现LED小灯流水,并且左边每流过去一个右边就增加一个小灯持续点亮。本程序的关键在于数组的计算。

[mw_shl_code=c,true]#include <STC12C5A60S2.H>

sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;

unsigned char cnt = 0;
unsigned char i = 0;
unsigned int a = 0;

void main ()
{
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ENLED = 0;
        
        TMOD = 0X01;
        TH0 = 0XF5;
        TL0 = 0X96;
        TR0 = 1;
        P0 = ~ (0x01);
        
        while(1)
        {
                if(TF0 == 1)
                {
                        TF0 = 0;
                        TH0 = 0XF5;
                        TL0 = 0X96;
                        a++;
                        
                        if(a >= 500)
                        {
                                cnt++;
                                i++;
                                a = 0;
                        
                                if(cnt >= 8)
                                {
                                        cnt = 0;
                                }
                        }
                }
                if(i <= 7)
                {
                        P0 = ~(0x01 << cnt);
                }
                else
                {
                        P0 = ~(0x80 >> cnt);
                }
                if(i >= 16)
                        i = 0;
        }
}[/mw_shl_code]

       这个程序用于实现LED小灯的往复流水,这个程序的难点在于最后几句cnt,i值的确定。

[mw_shl_code=c,true]#include<STC12C5A60S2.H>

sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;

unsigned char a[] =
{
        0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
        0xbf,0xdf,0xef,0xf7,0xfb,0xfd
};

void main()
{
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ENLED = 0;
                        
        TMOD = 0x01;               
        TL0 = 0x96;               
        TH0 = 0xf5;                        
        TR0 = 1;

        while(1)
        {
        static unsigned char i = 0;
        static unsigned int cnt = 0;
        
        P0 = a;
                if(TF0 == 1)
                {
                        TL0 = 0x96;               
                        TH0 = 0xf5;        
                        TF0 = 0;
                        cnt++;
                        if(cnt == 500)
                        {
                                i++;
                                cnt = 0;
                        }
                }
                if(i >= 14)
                        i = 0;
        }
}

[/mw_shl_code]

             这个程序实现的功能和上一个程序相同,只不过用数组来实现,逻辑上比较简单。

代码还是得多写啊,不经常写手就会生,会浪费很多时间。也有可能是我是新手的原因吧。


人生无根蒂,生如陌上尘。
发表于 2017-2-10 09:21:50 | 显示全部楼层
借鉴下程序,
...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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