OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4742|回复: 17

定义了一个code数组,用变量做数组下标结果取不出数来是怎么回事?

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
发表于 2016-10-24 19:44:54 | 显示全部楼层 |阅读模式
5金钱
这两天在做一个LCD实验,用1621驱动一个定制屏,定义了一个code数组来存段码。结果用变量取数组的元素显示不出,用常量却能正常显示。。。。
比如这样:
        LED_G0 = LED1_Disp[Value%1000000/100000];
        LED_G1 = LED1_Disp[Value%1000000%100000/10000];
        LED_G2 = LED1_Disp[Value%1000000%100000%10000/1000];         
        LED_G3 = LED1_Disp[Value%1000000%100000%10000%1000/100];   
        LED_G4 = LED1_Disp[Value%1000000%100000%10000%1000%100/10];   
        LED_G5 = LED1_Disp[Value%1000000%100000%10000%1000%100%10];
        HT1621_LCD();           //写入数据

        给变量赋值了(比如10),就是显示不出想要的数字出来(显示207。。。),甚至对变量加加减减显示的数都不改变。
然后我改成这样:
        LED_G0 = LED1_Disp[123456%1000000/100000];
        LED_G1 = LED1_Disp[123456%1000000%100000/10000];
        LED_G2 = LED1_Disp[123456%1000000%100000%10000/1000];         
        LED_G3 = LED1_Disp[123456%1000000%100000%10000%1000/100];   
        LED_G4 = LED1_Disp[123456%1000000%100000%10000%1000%100/10];   
        LED_G5 = LED1_Disp[123456%1000000%100000%10000%1000%100%10];
        HT1621_LCD();            //写入数据

        就能正常显示123456了。换成其他数字,几个数字轮流显示也行得通(123456,234567,345678这样)。
        究竟是什么原因,跟code这个关键字有关吗,我还把Memory Model改成Large了,有影响吗?
       数组定义是这样的:
//LED显示表(七段码)
code u8     LED1_Disp[29] = { 0XF5,0X60,0XB6,0XF2,0X63,0XD3,0XD7,0X30,0XF7,0XF3,
                                                0X77,0XC7,0X95,0XE6,0X97,0X17,0X00,0X00,0X00,0X00,                                         
                                                0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00 };        //大数码管

最佳答案

查看完整内容[请看2#楼]

问题已经解决了,应该和芯片的内存分布有关(可能不连续吧),把各个大数组改成256字节的整数倍就没问题了,类似rom的扇区。话说ram也有扇区的说法吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-24 19:44:55 | 显示全部楼层
问题已经解决了,应该和芯片的内存分布有关(可能不连续吧),把各个大数组改成256字节的整数倍就没问题了,类似rom的扇区。话说ram也有扇区的说法吗?
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-10-24 20:22:21 | 显示全部楼层
Value是什么类型的变量?初始值是多少?
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-10-24 20:24:49 | 显示全部楼层
描述的现象与数组的code修饰无关吧
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-10-24 20:39:19 | 显示全部楼层
问题描述不清,问题难解决了
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-24 21:00:53 | 显示全部楼层
mcudiy 发表于 2016-10-24 20:22
Value是什么类型的变量?初始值是多少?

u8,初始值10
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-24 21:02:52 | 显示全部楼层
龙之谷 发表于 2016-10-24 20:39
问题描述不清,问题难解决了

就是这么简单,我也不知道还能怎么描述啊,我感觉完全没问题,但它就是这样的现象。。。要不我把工程上传了?
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-10-24 21:07:33 | 显示全部楼层
夜不能寐 发表于 2016-10-24 21:02
就是这么简单,我也不知道还能怎么描述啊,我感觉完全没问题,但它就是这样的现象。。。要不我把工程上传 ...

看2楼
别轻易上传程序、贴程序,轻易不看的
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-24 21:12:03 | 显示全部楼层
龙之谷 发表于 2016-10-24 21:07
看2楼
别轻易上传程序、贴程序,轻易不看的

哎,我明天再试试吧,这屏我都弄两天了
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-24 21:15:09 | 显示全部楼层
void main()
{
        u8 Value=10,i=0;
        BU = 0;
        GPIO_Configuration();
       
        HT1621();
        Init_LCD_Display();
       
        while(1)
        {
                LED_G0 = LED1_Disp[Value%1000000/100000];
                LED_G1 = LED1_Disp[Value%1000000%100000/10000];
                LED_G2 = LED1_Disp[Value%1000000%100000%10000/1000];         
                LED_G3 = LED1_Disp[Value%1000000%100000%10000%1000/100];   
                LED_G4 = LED1_Disp[Value%1000000%100000%10000%1000%100/10];   
                LED_G5 = LED1_Disp[Value%1000000%100000%10000%1000%100%10];       
                i++;
                if(i>100)
                        i=10;
                HT1621_LCD();
                delay();
        }
}
只是想先试验一下循环计数,结果出来一个乱七八糟的数还超范围,还不会递增,郁闷
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-10-25 13:45:53 | 显示全部楼层
按理说应该显示000010才对。你的代码中意思是想把i中的值显示出来,但是代码其实只能显示Value,i虽然定义了,但是没有使用。delay()函数延时是多少?你调试一下看看就明白了。
LED_G0 = LED1_Disp[Value%1000000/100000]这一句的意思是显示十万位,其余的以此类推。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-25 18:24:57 | 显示全部楼层
mcudiy 发表于 2016-10-25 13:45
按理说应该显示000010才对。你的代码中意思是想把i中的值显示出来,但是代码其实只能显示Value,i虽然定义 ...

哈,我写错了,不过问题不在这里,找到解决方法了。
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-10-25 18:36:39 | 显示全部楼层
可能是RAM不足导致,我把几个u16的大数组改成u8就可以了,算了一下超过大概4k就不行了。。。我用的是SCT8A8K64S4A12,应该是有8k的内部扩展RAM的吧,怎么会不足呢
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-10-25 20:17:03 | 显示全部楼层
类型定义成long型试试
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6661
金钱
6661
注册时间
2016-5-29
在线时间
909 小时
发表于 2016-10-27 10:06:18 | 显示全部楼层
LED_G4 = LED1_Disp[Value%1000000%100000%10000%1000%100/10];   
LED_G5 = LED1_Disp[Value%1000000%100000%10000%1000%100%10];   
这个代码 是不是 写得太长了.  
换成下面这个写法是不是看着舒服些.
LED_G4 = LED1_Disp[Value/10%10];   
LED_G5 = LED1_Disp[Value%10];  
回复

使用道具 举报

0

主题

125

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2728
注册时间
2015-10-29
在线时间
428 小时
发表于 2016-10-27 10:46:50 | 显示全部楼层
u8类型最大数也只255吧
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2016-11-3 16:06:55 | 显示全部楼层
一个8位的数去对1000000求余也没意思呀
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-11-23
在线时间
4 小时
发表于 2016-11-23 20:02:32 | 显示全部楼层
这个程序从大体来看没什么太大的错误,但是有以下疑点
第一Value变量类型设置u8,有些小做大255。
第二你这赋值数组的计算方法不对
LED_G1 = LED1_Disp[Value%1000000%100000/10000];   
LED_G2 = LED1_Disp[Value%1000000%100000%10000/1000];   
这个代码写的算法不太对.  
换成下面这个.
LED_G1 = LED1_Disp[Value%100000/10000];   
LED_G2 = LED1_Disp[Value%10000/1000];  
第三个是写数据函数  HT1621里兴许有问题   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表