16x64LED点阵模块驱动记录(三)SST29EE020字库读取并显示

前言

        本文是16x64LED点阵模块驱动记录的第三篇。主要实现了读取外部存储SST29EE020,并简单地显示出来。本文所用模块介绍详见第一篇。->>16x64LED点阵模块驱动记录(一)简单实现

一、读取外部存储SST29EE020

        一开始被SST29EE020吓到了,这是一个256k*8的闪存,或者是EEPROM,反正是用来做存储。书上说51直接访问外部RAM最大到64k,所以无疑不能直接访问到256k的地址。

        加之本人就是二把刀,连51的书都没看,内部存储、外部存储如何访问完全没概念。SST29EE020的控制总线引脚CE、WE、OE控制云里雾里,看了好多资料也没有给C语言访问256k存储的例程。倒是找到汇编的例子,好吧,确实看不太懂。

        今天重读51的基本教程、还看了一个教学视频,发现WE,OE其实是系统自动管理的,只要适当的时候设一下CE就OK。对于超出64k的部分,人工设一下17位,18位高低电平,就完成了高位的设置,然后用XBYTE直接读低16位地址就可以了,原来如此简单。没打算研究怎么写SST29EE020。因为这个SST29EE020是字库,里面有6000多个汉字,会读就够了。

二、源码

1.main.c

#include <STC89C5xRC.H>
#include <intrins.h>
#include <absacc.h>

#define FLASH_ADDR_BASE 0x0000

sbit SH_CP = P1^5;
sbit DS = P2^7;
sbit ST_CP = P1^6;



sbit SST29EE020_CE = P3^4;	//SST29EE020,0有效
//sbit SST29EE020_WE = P3^6;	//不用定义,系统自动控制
//sbit SST29EE020_OE = P3^7;	//不用定义,系统自动控制
sbit A17=P3^3;              //SST29EE020 的高2位
sbit A16=P3^2;              //SST29EE020 的高2位


typedef unsigned int Uint16;
typedef unsigned char Uint8;

unsigned char xdata Table_BUFF[128];

Uint16 iHZ=0;


void delayms(unsigned int m)
{
	int i,j;
	for(i=0; i<m; i++)
		for(j=0; j<120; j++);
}


void HC595(unsigned char dat)
{
	unsigned char j;
	for(j=0;j<8;j++)
	{
		SH_CP = 0;	//为移位准备
		DS = dat & 0x01;	//先低位
		dat=dat>>1;
		SH_CP =1;  	//上升沿,移位
	}
}


void Matrix16x16(unsigned char num)
{
	unsigned char k,i;
	unsigned int m,n;
	unsigned char Char_num=num*32;
	Char_num=4;
	for(m=0;m<Char_num;m++)
	{
		for(n=0;n<32;n++)
		{
			for(k=0;k<16;k++)
			{
				P1=0xff;
				for(i=0;i<num;i++)
				{
					HC595(~Table_BUFF[32*i+2*k+1]);		//半部分
					HC595(~Table_BUFF[32*i+2*k+0]);		//半部分
				}
				ST_CP = 0;
				ST_CP = 1; //并行输出
				P1=k;
			}
		}
	}
}



Uint8 FlashRead(bit a17,bit a16,Uint16 offset)
{
	Uint16 dat;
	
	//SST29EE020_CE=0;	//片选有效
	A17=a17;
	A16=a16;

	//dat=XBYTE[FLASH_ADDR_BASE|offset];
    dat=XBYTE[FLASH_ADDR_BASE+offset];

	//SST29EE020_CE=1; //片选失效

	return dat;
}



void prepareBuff()
{
	unsigned char i;
	for(i=0;i<128;i++)
		Table_BUFF[i]=FlashRead(1,1,iHZ++);
}

void main(){
    SST29EE020_CE=0;	//一直有效
	while(1){
		prepareBuff();
		Matrix16x16(4);
		delayms(100);
	}
}

上面的程序在线修改的,没编译,应该没大问题吧。

        51外部地址总线是P2(高8位),P0(低8位),一共是16位,所以最多可以访问64k的外部空间。高出的17位,18位地址需要我们自己设置。

        XBYTE很强大,承包了P0,P2,SST29EE020_WE,SST29EE020_OE,这些51系统自己管了,我们只需要给XBYTE一个地址,它就把这4个参数管理好了。我们只需要额外设置A17,A16,SST29EE020_CE就可以访问外部存储。


总结

09e6b7f901374397a8aeb8499e75f790.jpg

6d547d2435804af09730a0009680b7b8.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值