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;
}
文章评论