这次的程序是通过控制LED点阵,点亮一个+号。我们使用的是一个8×8的电子,需要操作16bit,实现对行和列的管理,这点其实和矩阵按键是有些类似,只不过一个是输入,一个是输出,都是通过逐行扫描实现的(矩阵按键由于每次只检查一个按键,也可以使用行列扫描)。
下面是LED点阵的原理图
从上图可以看出,每一个LED都是一个发光二极管,要让某一个LED发光,就需要在一端设置为高电平(1),另一端是低电平(0);按照上图的实现,行是要设置为高电平,列设置为低电平,行列交叉的LED就会被点亮。每次可以控制一行或一列的LED,然后进行逐行或逐列扫描即可。
下面是实现代码:
#include<reg51.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit SER=P3^4;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
#define LEDS P0
u8 tmp,i;
u8 ledNum;
u8 plus[8]={0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18}; //显示+号需要一次显示的内容
void Hc595SendByte(u8 byte) //这个函数是用来发送串转并的数据,每次发送一个字节,对应8个行引脚
{
u8 i;
RCLK=1;
SRCLK=1;
for(i=0; i<8; i++)
{
SER=byte >> 7; //将最高位右移7位到最低位,然后赋给SER
byte=byte<< 1; //将次高位左移到最高位,然后通过上一行代码,赋给SER
SRCLK=0; //这两句是让SRCLK产生一个上升沿,这样SER的值就可以
SRCLK=1; //保存在74HC595中的寄存器了
}
RCLK=0; //让RCLK输入一个上升沿,并口输出数据
RCLK=1;
}
void delay_ms(u16 n)
{
u8 i;
while(n--)
{
i = 111;
while(i--);
}
}
void main()
{
LEDS=0xFE;
ledNum=0xFF;
tmp=0xFE;
i=0;
while(1)
{
Hc595SendByte(plus[i]); //发送数组中的第一个字节,即控制第i列的LED显示
i=(i+1)%8; //移动到下一列,如果大于等于8,则从0开始
delay_ms(1);
tmp=_crol_(tmp, 1);//循环控制哪一列有效,
Hc595SendByte(0); //在打开具体一列有效时,先把该列LED全部关闭,防止出现残影
LEDS=tmp;
}
}
上面就是LED点阵的实现代码了,是通过逐列扫描实现的,当然也可以通过逐行事项,需要注意的就是残影的消除。