前言
本文是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就可以访问外部存储。