单片机流水灯显示方式

 对于单片机的显示方式有很多种:闪烁,交替,流水灯等等。但今天我做的就是流水灯,但实际上所用的代码都差不多,只有把显示方式的子程序改一下即可。我用到的语言是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;

}

}

}

连接实图

在这里插入图片描述

发布了8 篇原创文章 · 获赞 1 · 访问量 302

猜你喜欢

转载自blog.csdn.net/AJIEIT/article/details/104457965