大家都知道,51系统最大的寻址空间是64K. 但我们可能有时候会碰到要求更大的空间内的寻址,这时就需要用到分页技术.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在一个LED项目中,需要RAM扩展到最大.64K. 还要有标准16点阵汉字库256K.
所以在设计时候,将RAM定义成0页, 汉字库共分四页.页号为 1,2,3,4.5
首先在硬件上设计好.
RAM在第0页,按正常连接方法接线.
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
汉字库芯片选用AT<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />49F040.共地址线 A0---A18。 其中A0---A15与地址线相连,A16,A17,A18用于页号选择线。如图:
A16,A17,A18由CPLD芯片经过组合逻辑后得到。
CPLD内需要做的工作有:
1. 确定写页号的地址 !HZK_PAGE=( ADD==^hF030);
2. 锁存数据低三位
3. 由页号的值来确定汉字库芯片的片选信号。只要有一个不为0,片选信号即为低
HZK_CS=!(HZK_AA16 || HZK_AA17|| HZK_AA18)
4. RAM 的片选信号和HZK_CS 刚好是反逻辑. 即 选择汉字库,就不能对RAM进行操作.
至此 ,硬件的工作基本就完成了.下面是软件上如何进行分页操作.
大多数的时候,我们是对RAM进行计算和操作.
xdata unsigned char PageAdd _at_ 0xf030;
初始化: PageAdd = 0;
当需要读字库芯片的内容的时候:
首先要通过计算确定页号和偏移量. 计算方法略. 然后进入读字库芯片的函数.
ReadFontDot(unsigned char page,unsigned int offset)
函数内部:
1.首先关中断 EA = 0;
2.偏移量强制转换成指针 p=(unsigned char xdata *)offset;
3.写页号,也就是确定A16,A17,A18的电平 PageAdd = page;
4.连续读出32个点阵数据
for (i=0;i<040;i++)
Dbuf = *p++ ; /* pdata unsigned char Dbuf[32] _at_ 0x40;*/
5. 恢复页号到0 PageAdd = 0;
6. 开中断 EA = 1;
注意:当读字库的时候,数据是通过片内RAM进行数据中转的.先写入到片内RAM,读完字库后,再从片内RAM将数据写到外部RAM.
至此,分页的操作基本就完成了.
对于需要超过64K 的RAM或者EEPROM的操作,都可以通过这种方式进行.
这是我在工作中一点点的应用,如果有什么不到的地方,欢迎大家指正.
文章评论(0条评论)
登录后参与讨论