STC89C52RC驱动16x64LED点阵模块驱动记录(三)SST29EE020字库读取并显示
本帖最后由 sujingliang 于 2023-11-24 22:09 编辑一、读取外部存储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多个汉字,会读就够了。
二、源码
#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;
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); //半部分
HC595(~Table_BUFF); //半部分
}
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;
dat=XBYTE;
//SST29EE020_CE=1; //片选失效
return dat;
}
void prepareBuff()
{
unsigned char i;
for(i=0;i<128;i++)
Table_BUFF=FlashRead(1,1,iHZ++);
}
void main(){
SST29EE020_CE=0; //一直有效
while(1){
prepareBuff();
Matrix16x16(4);
delayms(100);
}
}
文章内容成文于半年前,先发于个人blog。
听说发文可以得芯愿,换MCU,^-^{:titter:}。
页:
[1]