变量赋值问题,大哥们帮忙!

[复制链接]
3182|5
 楼主| energy2008 发表于 2010-3-22 10:34 | 显示全部楼层 |阅读模式
定义的全局变量adval不能动态的赋值,在程序最后加复位才能实现A/D动态显示效果,不加复位数码管只能静态显示,调节外部输入模拟量无效
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wr=P3^6;
sbit rd=P3^7;
sbit dula=P2^6;   
sbit wela=P2^7;
uchar a,A1,A2,A2t,A3,adval;
uchar code table[]={   
                        0x3f,0x06,0x5b,0x4f,   
                        0x66,0x6d,0x7d,0x07,   
                        0x7f,0x6f,0x77,0x7c,   
                        0x39,0x5e,0x79,0x71   
                    };
.
.
.
.
.
.
void main()
{
while(1)
{
start();
P1=0xff;  //拉高  
delay(20);
rd=0;
delay(10);
rd=1;
adval=P1;//p1口值(A/D输出的模拟量)赋给adval,adval交给display显示
delay(10);
  

    A1=adval/100;         
    A2t=adval%100;   
    A2=A2t/10;   
    A3=A2t%10;
display(A1,A2,A3);
delay(10);
//复位
}
}
chen3bing 发表于 2010-3-22 12:34 | 显示全部楼层
会不会是延时时间太短。
 楼主| energy2008 发表于 2010-3-22 14:03 | 显示全部楼层
不是,把adval改P0口,P0的值是可以动态变化的,如果屏蔽掉display(adval没有分配空间),P1口外接的发光二极管也可以动态变化的,我觉得是变量adval出的问题!
gaohq 发表于 2010-3-22 18:14 | 显示全部楼层
display函数是怎样子的?
hxlwjn 发表于 2010-3-23 11:56 | 显示全部楼层
把adval变成局部变量就没问题吗?我看不是变量赋值问题。
 楼主| energy2008 发表于 2010-3-23 14:41 | 显示全部楼层
问题解决了!这几天拼命查阅资料发现了问题原因,看来很多初学者和我一样没有意识到这个问题,贴出来和大家分享一下,共同提高。
    全局变量adval前要加volatile修饰符。如果你声明变量使用了volatile修饰符,编译器就不会把这个变量缓存在寄存器里——每次访问都将去存取变量在内存中的实际位置,如果一个变量会被其它引用改变,或在其它并行的任务中会被改变(例如上面的程序),都要显式地说明为"volatile”,否则在编译器优化阶段会作出错误的判断,例如将这个变量读入寄存器以后,在没有对这个变量赋值以前,会一直使用寄存器中的值,而实际上这个变量的值可能已经被一个指针引用改变了,或者是在中断服务程序中被改变了。(怪不得我的P1在读前拉高,数码管会显示255,其实程序读的是寄存器的备份,没有读变化的模拟电压量)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部