目录
一、led流水灯(flowing water lamp)
二、静态数码管
一、led流水灯(flowing water lamp)
我们在点亮一个led灯的基础上,对8个led灯按照某种特定的点亮规律进行操作,从而形成像水按顺序流动的效果。
为了减少画图的时间,直接使用一个将10个led集成在一起的器件(LED-GROVE-BARGRAPH)这个器件(1-10)是阳极,(11-20)是阴极。反过来则无法点亮。
上图为点亮效果(色彩丰富)。
接下来我们使用keil4来编写程序:
新建工程,选择芯片(直到芯片型号可以直接搜),然后点击OK。
之后就会跳出一个对话框,这个的意思是说 “ 是否需要将STARTUP.A51这个文件复制进工程 ” ,我们这里编写的是普通的程序,就不需要啦。后期使用其他操作系统就可能需要了。
所以我们这里点击“否(N)”。
记住,一定要创建main.c文件,不然你往哪里写程序。打开“魔术棒”选“Output”选项,勾选Create Hex File这个选项,不然就没有hex文件去给proteus使用了。
程序编写完成后直接烧入,效果就是从1-8依次点亮。(其实写流水灯的方法很多,只要按要求点亮指定的灯就可以了)。
//从上往下依次点亮
#include <reg52.h>
#include <intrins.h>
void delay(int a)
{
int i;
for(i=0;i<a;i++)
_nop_();
}
void main()
{
int i;
P1=0x00;
while(1)
{
for(i=0;i<8;i++)
{
P1=0x01;
P1=P1<<i;
delay(10000);
}
}
}
//这是从下往上循环依次点亮
#include <reg52.h>
#include <intrins.h>
void delay(int a)
{
int i;
for(i=0;i<a;i++)
_nop_();
}
void main()
{
int i;
P1=0x00;
while(1)
{
for(i=0;i<8;i++)
{
P1=0x80;
P1=P1>>i;
delay(10000);
}
}
}
如何实现像数据加载一步一步上升呢?如下所示(延时多次只是为了更好观察效果)
#include <reg52.h>
#include <intrins.h>
void delay(int a)
{
int i;
for(i=0;i<a;i++)
_nop_();
}
void main()
{
int i;
P1=0x00;
while(1)
{
P1=0xff;
for(i=0;i<8;i++)
{
P1=P1>>1;
P1=~P1;
delay(10000);
delay(10000);
delay(10000);
delay(10000);
delay(10000);
P1=~P1;
}
}
}
二、静态数码管
静态数码管(直接搜seg就可以找到),共阴共阳已标出。
共阴编码:[0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,0x39,0x5e,0x79,0x71]; 0~F
共阳编码:[0xc0, 0xf9, 0xa4, 0xb0,0x99,0x92,0x82,0xf8, 0x80 ,0x90 , 0x88,0x83,0xc6 ,0xa1,0x86,0x8e]; 0~F
我们以上一个程序的图进行修改,这次使用的是P0口,P0口需要接一个上拉电阻。
由于P0口在做输入输出是,输出低电平的时候是没有问题的。
但是,在输出高电平时,输出的高电平为高阻态,不能称为正真意义上的高电平,所以需要外接一个上拉电阻,提高P0口的输出电流。
电路如下图所示(显示结果如下图):
#include <reg52.h>
#include <intrins.h>
char code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,0x39,0x5e,0x79,0x71};
void delay(int a)
{
int i;
for(i=0;i<a;i++)
_nop_();
}
void main()
{
int i;
P0=0x00;
while(1)
{
for(i=0;i<16;i++)
{
P0=table[i];
delay(10000);
delay(10000);
}
P0=0x00;
}
}