对于单片机的显示方式有很多种:闪烁,交替,流水灯等等。但今天我做的就是流水灯,但实际上所用的代码都差不多,只有把显示方式的子程序改一下即可。我用到的语言是C语言,而且是用键盘控制的。
只要把相应的电平变为低电平就可以了;相反,如果要接LED熄灭,就要把相应的电平变为高电平;同理,接在P1.1~P1. 7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。同样的道理,可以让8个灯左移显示方式,右移显示方式,开幕式显示方式。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
代码:
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define COM8255
XBYTE[0xF003]
#define PA8255
XBYTE[0XF000]
#define PB8255
XBYTE[0xF001]
#define PC8255 XBYTE[0xF002]
#define uchar
unsigned char
#define u8
unsigned char
code const u8
SegArray1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //左移方式
code const u8
SegArray3[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //右移方式
code const u8 SegArray2[]={0xe7,0xdb,0xbd,0x7e}; //开幕式方式
static unsigned char n,m=1;
unsigned char
key_read(void); //函数声明
void delay( uchar
a) //延时函数
{
uchar z;
while(a–)
for(z=0;z<120;z++);
}
u8 AllKey()
{ PB8255 = 0x0; //全“0”->扫描口
return ~PC8255 & 0x3; //读键状态,取低二位
}
u8 keyi() //控制键盘的函数
{ u8 i,j;
if (AllKey() == 0) //调用判有无闭合键子程序
{
return 0xff;
}
i
= 0xfe;
j = 0;
while(i != 0xff)
{
PB8255 = i;
if ((PC8255 & 0x1) ==
0) //0行有键闭合
{
break;
}
else if ((PC8255 & 0x2)
== 0) //1行有键闭合
{
j += 8;
break;
}
j++; //列计数器+1
i = ((i<<1) | 1);
}
if
(i == 0xff)
return 0xff;
return
j; //键号
}
void main()
{
u8
i;
COM8255=0x89;
while(1)
{
n=keyi();
if(n!=0xff)
m=n;
switch(m)
{
case
0x01: //左移方式
{
PA8255=SegArray1[i];
i++;
if(i>7)
i=0;
delay(200);
} break;
case
0x02: //右移方式
{
PA8255=SegArray3[i];
i++;
if(i>7)
i=0;
delay(200);
} break;
case 0x03: //闭幕式方式
{
PA8255=SegArray2[i];
i++;
if(i>3)
i=0;
delay(200);
} break;
}
}
}
连接实图