STC89c52控制LED

2015年6月18日 5125点热度 0人点赞 0条评论

STC89c52是STC公司的8051单片机系列产品之一。在以后的两个月的时间里,我将记录以STC89C52为代表的嵌入式开发学习之路。

无论是led、红外线、超声波、WIFI、光线、加速度、倾斜角、烟雾、湿度、温度传感器还是四轴飞行器套件、3D打印机套件,对于单片机的学习都可归结于对IO口的控制。类似wrtnode的linux开发板也许可以提供更好的编程环境,可以使用python等高效的编程语言。但是这都要基于对IO口的熟练操作。

如果同为学习者,欢迎交流学习。

昨天一直为独立键盘控制流水灯郁闷,偶然间一段代码BUG竟然解决了。
本来我要实现的是:
1. K2点亮所有LED。
2. K1关闭所有LED。
3. K3点亮并左移一颗LED,
4. K4点亮并右移一颗LED。

我将按键释放检测代码定义为一个函数tset()后丢在后面,然后真机测试k1、k2键一切正常,然后k3、k4出问题了:按住k3后LED向左移动形成流水灯,释放后led停驻,住k4后LED向右移动形成流水灯,释放后led停驻。哎呀!这不就是流水灯吗!好像还可以用来做抽奖大转盘,只不过有点费手(逃

丑代码献上

#include <reg51.h>
#include <intrins.h>
#define uint   unsigned int
#define uchar  unsigned char
#define sled   P2
sbit    beep    = P1 ^ 5;
sbit    K1  = P3 ^ 0;
sbit    K2  = P3 ^ 1;
sbit    K3  = P3 ^ 2;
sbit    K4  = P3 ^ 3;
uint    i, k, key;
uchar   j;
void test( void );


void delay( void );


void main( void )
{
    while ( 1 )
    {
        if ( K1 == 0 ) 
        {
            delay();
            if ( K1 == 0 )
                j = 0x00;
            key = K1;
            test();
        }
        if ( K2 == 0 ) /*  */
        {
            delay();
            if ( K2 == 0 )
                j = 0xff;
            key = K2;
            test();
        }
        if ( K3 == 0 ) /*  */
        {
            delay();
            if ( K3 == 0 )
            {
                if ( (j == 0) || (j == 0xff) )
                {
                    j   = 0xfe;
                    beep    = 1;
                }else
                    j = _crol_( j, 1 );
                beep = 0;
            }
            while ( (i < 50) && (K3 == 0) )
            {
                delay();
                i++;
            }
            i = 0;
        }
        if ( K4 == 0 ) /*  */
        {
            delay();
            if ( K4 == 0 )
            {
                if ( (j == 0) || (j == 0xff) )
                {
                    j   = 0xfe;
                    beep    = 1;
                }else
                    beep = 0;
                j = _cror_( j, 1 );
            }
            key = K4;
            test();
        }
        sled = j;
    }
}


void delay( void ) /*  */
{
    unsigned char a, b, c;
    for ( c = 1; c > 0; c-- )
        for ( b = 38; b > 0; b-- )
            for ( a = 130; a > 0; a-- )
                ;
}


void test( void )
{
    while ( (i > 50) && (key == 0) )
    {
        delay();
        i++;
    }
    i = 0;
}

Dong Wang

I will work as a PhD student of TU Graz in Austria. My research interests include Embedded/Edge AI, federated learning, computer vision, and IoT.

文章评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据