当前位置: 代码迷 >> 综合 >> 点阵屏8*8基于74HC595移位锁存器驱动
  详细解决方案

点阵屏8*8基于74HC595移位锁存器驱动

热度:46   发布时间:2024-02-06 05:59:00.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,//00xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC7,0xE7,//10xC3,0xDF,0xDF,0xEF,0xF7,0xFB,0xDB,0xE7,//20xE7,0xDB,0xFB,0xFB,0xC7,0xFB,0xDB,0xE7,//30xF7,0xF7,0xF7,0x81,0xB7,0xD7,0xEF,0xF7,//40xC7,0xFB,0xFB,0xF7,0xCF,0xDF,0xC3,0xDF,//50xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xEF,0xF3,//60xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xC3,//70xC3,0xDB,0xDB,0xE7,0xE7,0xDB,0xDB,0xE7,//80xC3,0xFB,0xFB,0xFB,0xC3,0xDB,0xDB,0xC3,//90x19,0xB6,0xB6,0xB6,0xB6,0xB6,0x36,0xB9,//100xFF,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;}}}
}

 

  相关解决方案