目录
一、关于数码管、LED点阵屏显示的注意点
- 一定要消影,不然显示的画面有重影。不管是数码管还是LED点阵屏,都是"段选--位选--段选--位选"或者"位选--段选--位选--段选"循环来显示的,在每一个"段选--位选"或者"位选--段选"单元后面都要加一个延时函数,延时1ms等待显示稳定后,再进行"位选"或者"段选"的清零,即"段选—位选—延时1ms—清零位选—段选—位选"或者"位选—段选—延时1us—清零段选—位选—段选"。注意是清零段选还是清零位选。
- 判断按键按下操作。有时按下按键,数码管就显示一下,又灭了,这可能就是没有对按键按下进行判断。在使用按键时,只有当我们按下按键时才会把键值返回,在没按的期间,返回的值是初始化的值。也就是说,返回的键值没有保存下来,只会在你按下的时候显示一次键值,没按的时候显示的是初始的值。
二、功能介绍
用LED点阵屏显示滚动的画面。
三、主要模块的介绍
3.1 74HC595模块和点阵屏显示函数
3.1.1 74HC595介绍
74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据。这里主要用来拓展I/O口。
74HC595的8个输出端DPh~DPa分别接点阵屏列的输入端D7~D0。从而控制列的显示。
通过SER口输入串行的数据,当SRCLK有上升沿信号时,数据就往下移一位,当数据满了8位时,给RCLK上升沿信号时,8位数据就锁存到QA~QH,QH'连接到下一片74HC595,继续拓展16位、32位....,这里只是3线拓展到8线,QH'就不用接了。这样单片机通过3个I/O口连接74HC595,输出8位数据。
3.1.2 74HC595初始化函数和输入函数
sbit SER=P3^4;
sbit SCL=P3^6;
sbit RCL=P3^5;
/*
*函数名: _74HC595Write(unsigned char byte)
*函数功能:向74HC595串行输入一个字节的数据
*输入: byte :一个字节数据
*输出: 无
*/
void _74HC595Write(unsigned char byte)
{
int i=0;
for(i=0;i<8;i++)
{
SER=byte&(0x80>>i);
SCL=1;
SCL=0;
}
RCL=1;
RCL=0;
}
/*
*函数名: _74HC595_Init()
*函数功能:初始化74HC595的SCL、RCL
*输入: 无
*输出: 无
*/
void _74HC595_Init()
{
SCL=0;
RCL=0;
}
3.1.3 点阵屏显示函数MatrixLED()
这里需要注意的就是要消影。
/*
*函数名: MatrixLED(unsigned char COL,unsigned char byte)
*函数功能: 控制点阵屏某一列的显示
*输入: COL:列 范围0~7; byte:要显示数据的二进制形式(8位)
*输出: 无
*/
void MatrixLED(unsigned char COL,unsigned char byte)
{
_74HC595Write(byte);
P0=~(0x80>>COL);
Delay(1);
P0=0xff;//消影
}
3.2定时器中断模块
这里用定时器控制画面的移动速度,每100ms移动一下。
void Timer0_Init()//定时器0,工作方式1
{
TMOD=0x01;
TH0=0xfc;//1ms
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
}
//定时100ms中断
void Timer0_ISR() interrupt 1
{
static int count=0;
count++;
TH0=0xfc;
TL0=0x18;
if(count==100)//每100ms,offset加一,画面移动左一下
{
count=0;
offset++;
if(offset>34)
{
offset=0;
}
}
}
四、程序实现
#include <REGX52.H>
#include<INTRINS.H>
int offset=0;
sbit SER=P3^4;
sbit SCL=P3^6;
sbit RCL=P3^5;
unsigned char Animation[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7E,0x81,0x81,0x81,0x81,0x82,0x00,0x03,
0x03,0x03,0x03,0x03,0x00,0xFE,0x01,0x01,
0x01,0x01,0x01,0xFE,0x00,0xFF,0x90,0x90,
0x90,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//C_UP
void Delay(unsigned int Xms) //11.0592Mhz 1ms
{
unsigned char i, j;
while(Xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Timer0_Init()//定时器0,工作方式1
{
TMOD=0x01;
TH0=0xfc;//1ms
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
}
void _74HC595Write(unsigned char byte)
{
int i=0;
for(i=0;i<8;i++)
{
SER=byte&(0x80>>i);
SCL=1;
SCL=0;
}
RCL=1;
RCL=0;
}
void _74HC595_Init()
{
SCL=0;
RCL=0;
}
void MatrixLED(unsigned char COL,unsigned char byte)
{
_74HC595Write(byte);
P0=~(0x80>>COL);
Delay(1);
P0=0xff;//消影
}
//定时100ms中断
void Timer0_ISR() interrupt 1
{
static int count=0;
count++;
TH0=0xfc;
TL0=0x18;
if(count==100)//每100ms,offset加一,画面移动左一下
{
count=0;
offset++;
if(offset>34)//42-8
{
offset=0;
}
}
}
int main()
{
int i=0;
_74HC595_Init();
Timer0_Init();//T0初始化
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED(i,Animation[i+offset]);
}
}
}
五、效果演示
LED点阵屏滚动显示