[技术问答]

新手求助一下关于LCD的RAM配置问题

[复制链接]
944|8
手机看帖
扫描二维码
随时随地手机跟帖
a88963178|  楼主 | 2019-8-12 22:13 | 显示全部楼层 |阅读模式
      如题,很新的新手,C51也是略知皮毛,用赛元的MCU还不少,但是都是花钱请别人写的程序:),现在有点闲空,想自己玩玩。手头的92F7547根据说明书例配置了LCD显示。当给寄存器写单独的值,显示器可以显示出想要的值。但是我用数组去做,RAM貌似就配置不了。
      我的尝试代码如下:
      uchar code  lcd_data [] = {0x9f,0x90,0xa7,0xb5,0xb8,0x3d,0x3f,0x94,0xbf,0xbd} ;
       LCDRAM[0]=lcd_data [0];
       LCDRAM[1]=lcd_data [0]<<4;
       LCDRAM[2]=lcd_data [1];
       LCDRAM[3]=lcd_data [1]<<4;
我这样写,LCD就没显示。


但是如果我写成;
       LCDRAM[0]=0x9f;
       LCDRAM[1]=0x9f<<4;
       LCDRAM[2]=0x90;
       LCDRAM[3]=0x90<<4;
就能显示0和1。

请问可以告诉我我的问题出在哪里吗?谢谢帮忙的朋友!


使用特权

评论回复

相关帖子

ayb_ice| | 2019-8-13 11:49 | 显示全部楼层
这个没道理的,除非这个MCU有特别之处,仔细看下手册,可能与lcd_data的地址有关系

使用特权

评论回复
a88963178|  楼主 | 2019-8-13 12:11 | 显示全部楼层
ayb_ice 发表于 2019-8-13 11:49
这个没道理的,除非这个MCU有特别之处,仔细看下手册,可能与lcd_data的地址有关系 ...

感谢回复,我就是想不通。然后昨天打开仿真,看LCDRAM[0]~LCDRAM[3]的值,始终是0。然后还不服,弄了4个变量a0~a3,先把lcd_data[0]和lcd_data[1]赋值到a0~a3。再用a0~a3去给LCDRAM[]去赋值,仿真中LCDRAM是被赋值了,但是还是不显示。换回直接写常量就显示,折腾到1点,不知道自己问题出在哪里,见笑了。

使用特权

评论回复
ayb_ice| | 2019-8-13 13:08 | 显示全部楼层
a88963178 发表于 2019-8-13 12:11
感谢回复,我就是想不通。然后昨天打开仿真,看LCDRAM[0]~LCDRAM[3]的值,始终是0。然后还不服,弄了4个 ...

改成这个试试

uchar idata  lcd_data [] = {0x9f,0x90,0xa7,0xb5,0xb8,0x3d,0x3f,0x94,0xbf,0xbd} ;

使用特权

评论回复
a88963178|  楼主 | 2019-8-13 13:28 | 显示全部楼层
ayb_ice 发表于 2019-8-13 13:08
改成这个试试

uchar idata  lcd_data [] = {0x9f,0x90,0xa7,0xb5,0xb8,0x3d,0x3f,0x94,0xbf,0xbd} ; ...

感谢!改成idata区就可以了,太感谢了!为啥子code区不行呢?提供一下思路。

使用特权

评论回复
a88963178|  楼主 | 2019-8-13 14:14 | 显示全部楼层
ayb_ice 发表于 2019-8-13 13:08
改成这个试试

uchar idata  lcd_data [] = {0x9f,0x90,0xa7,0xb5,0xb8,0x3d,0x3f,0x94,0xbf,0xbd} ; ...

试了idata,xdata区都可,换回code就不好使,前两个编译好了以后比code区编译好了以后code大130左右。idata是片内数据存储区,可以简介寻址。但是xdata和code都是通过DPTR访问。为何有不同的效果啦。

使用特权

评论回复
a88963178|  楼主 | 2019-8-13 14:27 | 显示全部楼层
好了,我找到问题点了,92系列单片机,起始256b RAM,禁止movc的code寻址。所以导致了这个问题。我重新规划了一下code区,用code也可以正常显示了。怪我不仔细,曾经看到过这个说明的,但是不太记得在哪里看到的了。但是那个时候没当回事。这会儿看到另一个帖子,想起来了

使用特权

评论回复
knk| | 2019-8-13 19:44 | 显示全部楼层
a88963178 发表于 2019-8-13 14:14
试了idata,xdata区都可,换回code就不好使,前两个编译好了以后比code区编译好了以后code大130左右。ida ...

你是没有仔细看赛元MCU使用注意事项吧,赛元所有MCU的ROM空间前256字节是不可以使用MOVC指令寻址的,你定义的uchar code  lcd_data [] = {0x9f,0x90,0xa7,0xb5,0xb8,0x3d,0x3f,0x94,0xbf,0xbd} ;这段常量被分配到ROM空间的前面256字节里面了,所以查表的时候读不到数据。
有两个解决办法,一是把ROM空间前256字节屏蔽掉,另一种方法是把这些常量定义在ROM空间256之后的地址。

使用特权

评论回复
a88963178|  楼主 | 2019-8-14 10:44 | 显示全部楼层
knk 发表于 2019-8-13 19:44
你是没有仔细看赛元MCU使用注意事项吧,赛元所有MCU的ROM空间前256字节是不可以使用MOVC指令寻址的,你定 ...

是的,我后来发现到这个问题了,怪我看指导书书不仔细,谢谢回复

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

28

帖子

0

粉丝