请问马老师,将HZK16标准字库放到有19根地址线的外部flash,如何根据字的偏移量来计算各
放在外部flash里面,flash的大小肯定得大于262k,那就需要用19跟地址线来进行寻址,那么如何根据偏移地址来计算这个字模在flash中的实际地址呢,我手上有一个程序,但是我看不懂是如何进行寻址的,硬件电路时这样连接的
点击此处下载 ourdev_598133FJ74RS.pdf(文件大小:43K) (原文件名:Protel Schematic.pdf)
字库文件是放在u25芯片的flash中,u25一共有19跟地址线,需要分开寻址,a0-a12,q0-q5,一共19跟地址线寻址
显示汉字程序时这样的:
#define B377 XBYTE //原理图中的u4芯片
/*-----------------------------------------------------------------------------------------
**函数名:hzdisplay()
**功能:显示一个汉字
**参数:x-列,y-行,party-汉字内码区号,addr-汉字内码位码,style-反显正常显示
**返回:void
------------------------------------------------------------------------------------------*/
void hzdisplay(uchar x, uchar y, uchar party, uchar addr,uchar style) //显示一个汉字
{
uchar i;
uint realaddr,ttp,temp;
uchar xdata *hz;
ttp=party*94+addr-95; //计算汉字在GB 2312-80区中的位置 index = (94*(region-1)+location-1)*32;//数组内地址
temp=ttp<<5; //每个字模有32个字节,所以计算得到的地址需要乘以32
temp&=0x1fff;
temp|=0xa000; //取低13位,此时temp为此字字模的首地址
B377=ttp>>8; //取高6位,并用74hc377锁存送出,共19位地址,采用040做字库
ttp=x+y*30; //计算液晶控制器ram的地址
for(i=0;i<16;i++)
{
realaddr=ttp+i*30;
addrset(realaddr);//写地址
hz=temp;
hz+=i<<1;
data1w((style)?~(*hz):*hz);//写数据显示
addrset(realaddr+1);
hz++;
data1w((style)?~(*hz):*hz);
}
}
这几句不明白:
temp&=0x1fff;
temp|=0xa000; //取低13位,此时temp为此字字模的首地址
B377=ttp>>8; //取高6位,并用74hc377锁存送出,共19位地址,采用040做字库
我想问一下,确定字在字库中的位置后,如何去rom寻址,a0-a12这个显而易见,那q0-q5如何取值呢?即如何高6位地址,为什么是右移8位呢? 简单的二进制地址计算啦。
ttp是16位的,放汉字区位指针,具体首地址是:ppt乘32,也就是后面补上5个0,那么如下图:
00xxxxxx xxxxxxxx 00000
所以非常明显:ttp的低8位加上5个0是低13位地址。而ttp的高8位本身就是地址的高6位,ttp最高2位永远是0的。
页:
[1]