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;
}
}
}
}