dz.h
#include "system.h"
#include "intrins.h" //移位必须用的语句
sbit srclk=P3^6; //11号引脚,移位寄存器时钟输入
sbit rclk=P3^5; //12号引脚,储存寄存器时钟输入
sbit ser=P3^4; //14号引脚,串行数据输入
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
void MatrixLED_Init(); //点阵初始化
void _74HC595_WriteByte(unsigned char Byte); //最高位开始移位 输入dat到595芯片
void MatrixLED_ShowColumn(unsigned char Column,Data); //点阵显示数据
void dz_xs(void); //点阵显示
dz.c
#include "dz.h"
unsigned char code Animation[]={
0x00,0x49,0x49,0x7f,0x49,0x49,0x00,0x00,
0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,
0x08,0x10,0x3f,0x49,0x2d,0x7f,0x2d,0x09,
};
void MatrixLED_Init() //点阵初始化
{
SCK=0;
RCK=0;
}
/**
* @brief 74HC595写入一个字节
* @param Byte 要写入的字节
* @retval 无
*/
void _74HC595_WriteByte(unsigned char Byte) //最高位开始移位
{
unsigned char i,j=0;
for(i=0;i<8;i++)
{
ser=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
rclk=1;
rclk=0;
}
/**
* @brief LED点阵屏显示一列数据
* @param Column 要选择的列,范围:0~7,0在最左边
* @param Data 选择列显示的数据,高位在上,1为亮,0为灭
* @retval 无
*/
void MatrixLED_ShowColumn(unsigned char Column,Data) //点阵显示数据
{
_74HC595_WriteByte(Data); //data 选择哪一行 要点亮 1是点亮
P0=~(0x80>>Column); //=~1000 0000=0111 1111 >>要移位多少,就是要选择那一列 0是导通
Delay_us(100);
}
void dz_xs() //点阵显示
{
static uint timer=0,j=0;
u8 i;
for(i=0;i<8;i++)
{
MatrixLED_ShowColumn(i,Animation[i+j]); //
}
timer++;
if(timer>100)
{
timer=0;
j+=8;
}
if(j>16) {j=0;}
}
///**
// * @brief 74HC595写入一个字节
// * @param Byte 要写入的字节
// * @retval 无
// */
//void _74HC595_WriteByte(unsigned char Byte) //最高位开始移位
//{
// unsigned char i;
// for(i=0;i<8;i++)
// {
// ser=Byte&(0x80>>i);
// SCK=1;
// SCK=0;
// }
// rclk=1;
// rclk=0;
//}
///**
// * @brief LED点阵屏显示一列数据
// * @param Column 要选择的列,范围:0~7,0在最左边
// * @param Data 选择列显示的数据,高位在上,1为亮,0为灭
// * @retval 无
// */
//void MatrixLED_ShowColumn(unsigned char Column,Data) //点阵显示数据
//{
// _74HC595_WriteByte(Data); //data 选择哪一行 要点亮 1是点亮
// P0=~(0x80>>Column); //=~1000 0000=0111 1111 >>要移位多少,就是要选择那一列 0是导通
// Delay_us(100);
//}
//void dz_xs() //点阵显示
//{
// srclk=0; //
// rclk=0;
//
// MatrixLED_ShowColumn(0,0x3C); //显示第第1行,第1列
// MatrixLED_ShowColumn(1,0x42); //显示第第2行,第2列
// MatrixLED_ShowColumn(2,0xA9); //显示第第3行,第3列
// MatrixLED_ShowColumn(3,0x85); //显示第第4行,第4列
// MatrixLED_ShowColumn(4,0x85); //显示第第5行,第5列
// MatrixLED_ShowColumn(5,0xA9); //显示第第6行,第6列
// MatrixLED_ShowColumn(6,0x42); //显示第第7行,第7列
// MatrixLED_ShowColumn(7,0x3C); //显示第第8行,第8列
//}
main.c
#include "system.h"
//#include "key.h"
#include "dz.h"
extern uchar flag_1ms; //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
void main(void) //程序的主函数
{
Timer0_Init(); ////定时器0函数调用
MatrixLED_Init();//点阵初始化
while(1) //大括号里面的东西,被不停的循环执行
{
// dz_xs(); //点阵显示
//1ms进入一次
if(flag_1ms==1) //加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行
{
flag_1ms=0;
dz_xs(); //点阵显示
}
}
}
system.h
#include "reg51.h"
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整形
#define u8 unsigned char //定义无符号字符
#define u16 unsigned int //定义无符号整形
#define FOSC 12000000L //定义晶振频率
#define T1MS (65536-FOSC/12/1000) //定时10毫秒的时候,计数器要写入的值
void Delay_us(uint xus); //us级延时
void Delay_ms(uint xms); //ms级延时
void Timer0_Init(void); //定时器初始化
system.c
#include "system.h"
uchar flag_1ms=0;
void Timer0_Init(void)
{
TH0 = T1MS>>8; //赋初值
TL0 = T1MS; //赋初值
TMOD = 0x01; //设置定时器0用十六位定时器方式
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
void Timer0() interrupt 1 //中断号1
{
TH0 = T1MS>>8; //赋初值
TL0 = T1MS; //赋初值
flag_1ms=1;
}
void Delay_us(uint xus)
{
for(;xus>0;xus--);
}
void Delay_ms(uint xms)
{
for(;xms>0;xms--)
{
Delay_us(1000);
}
}