對於單片機的顯示方式有很多種:閃爍,交替,流水燈等等。但今天我做的就是流水燈,但實際上所用的代碼都差不多,只有把顯示方式的子程序改一下即可。我用到的語言是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行有鍵閉合 { 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;
}
}
}
連接實圖