51单片机——点阵屏8*8基于74HC595移位锁存器驱动1.0

1、8*8共阳极点阵屏,8行8列。2片74HC595串联芯片。

2、1.使用小工具建立了0-10及心型图标真值表。2.复位显示。3.写1字节数据。4.将数据锁存并输出。5.点阵屏的随意显示(显示的真值表)。6.应用测试代码(不太全未加入全部都亮)。

3、8行8列,故每次要写入2个字节,第一个字节由于硬件连接到的是列,故第一个字节为列数据,第二个字节为行扫字节。

4、由于硬件原因,74HC595有部分操作不了。代码里我给注释掉了。

#ifndef __DISPLAY88_H__
#define __DISPLAY88_H__

#include "reg52.h"

sbit DI = P3^4;
sbit CLK = P3^5;
sbit LE = P3^6;

//点阵屏显示,每次显示1个字符,若显示多个须额外加循环
void Display_Data(unsigned char * P);

//测试点阵屏显示驱动代码,需要搭配while循环
void Display_Test(void);

#endif // !__DISPLAY88_H__
#include "display88.h"

static unsigned char Row;//扫描的行号
static code unsigned char Display[13][8]=
{ 
	0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7,//0
	0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC7,0xE7,//1
	0xC3,0xDF,0xDF,0xEF,0xF7,0xFB,0xDB,0xE7,//2
	0xE7,0xDB,0xFB,0xFB,0xC7,0xFB,0xDB,0xE7,//3
	0xF7,0xF7,0xF7,0x81,0xB7,0xD7,0xEF,0xF7,//4
	0xC7,0xFB,0xFB,0xF7,0xCF,0xDF,0xC3,0xDF,//5
	0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xEF,0xF3,//6
	0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xC3,//7
	0xC3,0xDB,0xDB,0xE7,0xE7,0xDB,0xDB,0xE7,//8
	0xC3,0xFB,0xFB,0xFB,0xC3,0xDB,0xDB,0xC3,//9
	0x19,0xB6,0xB6,0xB6,0xB6,0xB6,0x36,0xB9,//10
	0xFF,0xE7,0xC3,0x81,0x00,0x00,0x18,0x3C,//心,顶
	0xE7,0xC3,0x81,0x00,0x00,0x18,0x3C,0xFF//心,低
};
//复位8*8点阵屏由于芯片复位脚强制接VCC及输出使能脚强制接GND故无法进行复位操作
//此复位后并行口输出0
static void Res_Display(void)
{
	//RES=0;//复位脚拉低,清除移位寄存器里的数据
	CLK = 0;
	LE = 0;
	LE = 1;//产生上升沿,将全部0锁存到下级寄存器里
	LE = 0;
	//OE=0;//寄存器的值输出
}

//写入1字节数据
static void Write_1_Byte(unsigned char Datax)
{
	unsigned char i;//流水号
	CLK = 0;
	for (i = 0; i < 8; i++)
	{
		DI = Datax & 0x01;
		CLK = 1;//产生上升沿
		Datax >>=1;
		CLK = 0;//方便下次产生上升沿
	}
	DI = 0;
}
//将移位寄存器内的值进行并行输出
static void Look_Out(void)
{
	LE = 1;//产生上升沿,移位寄存器的值输出并锁存在锁存器里
	LE = 0;//方便下次产生上升沿
	//OE = 0;//并行输出数据,OE默认接GND了
}

//点阵屏显示,每次显示1个字符,若显示多个须额外加循环
void Display_Data(unsigned char *P)
{
	unsigned char i;//流水号
	unsigned int k;//流水号
	Res_Display();//复位初始化显示
	for (k = 0; k < 1000; k++)//字符刷新1000次
	{
		Row = 0x80;//先点亮第一行
		for (i = 0; i < 8; i++)//循环点亮8列
		{
			Write_1_Byte(*P);//写列的值
			Write_1_Byte(Row);//写行的值
			Look_Out();//输出点亮LED灯
			P++;
			Row >>= 1;
		}
		P -= 8;//恢复指针初始指向状态
	}
}

//测试点阵屏显示代码,需要搭配while循环
void Display_Test(void)
{
	unsigned char i;//流水号
	unsigned char j;//流水号
	unsigned int k;//流水号
	Res_Display();//复位初始化显示
	for (i = 0; i < 13; i++)
	{
		for (k = 0; k < 500; k++)//每行字符刷新1000次
		{
			Row = 0x80;//先点亮第一行
			for (j = 0; j < 8; j++)//循环点亮8列
			{
				Write_1_Byte(Display[i][j]);//写列的值
				Write_1_Byte(Row);//写行的值
				Look_Out();//输出点亮LED灯
				Row >>= 1;
			}
		}
	}
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金丝草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值