LCD 一直显示同一个数字

[复制链接]
1482|13
手机看帖
扫描二维码
随时随地手机跟帖
morrisk|  楼主 | 2021-6-9 18:47 | 显示全部楼层 |阅读模式
PIC16f1787单片机 RE0端口ADC采样,用LCD显示变化的电压值。
结果LCD 一直显示同一个数字(W.112), 不知为何?

使用特权

评论回复
llljh| | 2021-6-9 18:51 | 显示全部楼层
仿真一下。看是采样问题,还是显示问题。

使用特权

评论回复
renyaq| | 2021-6-9 18:54 | 显示全部楼层
还有什么现象?能再详细描述下吗?

使用特权

评论回复
morrisk|  楼主 | 2021-6-9 18:57 | 显示全部楼层
万用表量过RE0端口有电压输入且有变化,该程序LCD能够显示汉字(LCD显示正常)

使用特权

评论回复
zhenykun| | 2021-6-9 19:00 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
morrisk|  楼主 | 2021-6-9 19:02 | 显示全部楼层
unsigned int table[];   //用来存放数字值
void main()
{
unsigned int value;
init();                         //端口初始化
ADC_init;                    //ADC初始化
lcd_init();                   //LCD初始化
while(1)
{
   value=ADC_Convert();           //转换值存入value
   ADC_display(value);
}
    }

void init()                                   //其他端口的配置
{   
    TRISB=0B00111001;              //RB4,RB5,RB3为按键输入
    ANSELB=0X00;
    LATB=0X00;
    TRISC=0X00;
    LATC=0X00;  
    TRISD=0X00;
    ANSELD=0X00;
    LATD = 0x00;
    TRISCbits.TRISC5=0;
    LATCbits.LATC5=0;
    TRISEbits.TRISE2=0;
    LATEbits.LATE2=1;
    TRISEbits.TRISE1=0;
    LATEbits.LATE1=0;
   
}
void ADC_init()                   //ADC初始化
{  
    TRISEbits.TRISE0=1;     //RE0模拟通道
    ANSELEbits.ANSE0=1;
    WPUEbits.WPUE0=0;
    ODCONEbits.ODCONE0=0;
    PORTEbits.RE0=0;
    LATEbits.LATE0=0;
    ADCON1=0XF0;               //ADFM=1, 结果右对齐,Frc时钟
    ADCON2=0X0f;               //反相输入通道
    ADCON0=0b00000001;    //ADRMD=0,12位AD,ADON=1,允许AD转换
    delayms(10);
}

unsigned int ADC_Convert()
{   unsigned int adval;
    float advalf;
    ADCON0bits.CHS0=1;         //通道RE0(即AN5), CHS=00101
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS2=1;
    ADCON0bits.CHS3=0;
    ADCON0bits.CHS4=0;
    ADCON0bits.DONE=1;
   while(ADCON0bits.DONE);
   adval=(unsigned int)ADRESH;
   adval=(adval<<8)+ADRESL;
   advalf=adval/4096.0*4.3;    (12位AD, 供电万用表量过大概是4.3V)
   adval=advalf*1000;
   return adval;   
}

void ADC_display(unsigned int x)
{
table[0]=x/1000+0x30;                //第一位 (整数)
table[1]=x/100%10+0x30;          //第二位
table[2]=x/10%10+0x30;           //第三位
table[3]=x%10+0x30;               //第四位
    send_i(0x80);
    writelcd(TAB1A);             //显示一行汉字,以验证LCD
    send_i(0x90);                //显示整数部分
    send_d(table[0]);
    send_d(0X2E);                //小数点
    delay(2);
    send_i(0x91);               //显示小数点后面三位
    send_d(table[1]);
    send_d(table[2]);
    send_d(table[3]);
}

使用特权

评论回复
lium| | 2021-6-9 19:09 | 显示全部楼层
ADC没有初始化成功吧。你确定是ADC_init;而不是ADC_init();

使用特权

评论回复
chenho| | 2021-6-9 19:09 | 显示全部楼层
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
renyaq| | 2021-6-9 19:11 | 显示全部楼层
ADC_init有问题,应该是ADC_init()

使用特权

评论回复
heweibig| | 2021-6-9 19:14 | 显示全部楼层
而且显示之后要延时一段时间吧

使用特权

评论回复
tian111| | 2021-6-9 19:20 | 显示全部楼层
犀利。

使用特权

评论回复
wyjie| | 2021-6-9 19:21 | 显示全部楼层

汇编:MOVX A  ,@DPTR           MOVX  A  ,@Ri
C语言: xdata定义

使用特权

评论回复
liliang9554| | 2021-6-9 19:23 | 显示全部楼层
这样编译都能通过?

使用特权

评论回复
lidi911| | 2021-6-10 08:01 | 显示全部楼层
仿真一下,看有变化没。

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝