打印

LCD 一直显示同一个数字

[复制链接]
418|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
morrisk|  楼主 | 2020-2-15 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC16f1787单片机 RE0端口ADC采样,用LCD显示变化的电压值。
结果LCD 一直显示同一个数字(W.112), 不知为何?

使用特权

评论回复
沙发
Cjy_JDxy| | 2020-2-15 14:12 | 只看该作者
仿真一下。看是采样问题,还是显示问题。

使用特权

评论回复
板凳
tian111| | 2020-2-15 14:13 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
地板
morrisk|  楼主 | 2020-2-15 14:18 | 只看该作者
万用表量过RE0端口有电压输入且有变化,该程序LCD能够显示汉字(LCD显示正常)

使用特权

评论回复
5
huwr| | 2020-2-15 14:20 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
6
morrisk|  楼主 | 2020-2-15 14:25 | 只看该作者

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]);
}

使用特权

评论回复
7
llia| | 2020-2-15 14:28 | 只看该作者
ADC没有初始化成功吧。你确定是ADC_init;而不是ADC_init();

使用特权

评论回复
8
Cjy_JDxy| | 2020-2-15 14:30 | 只看该作者
ADC_init有问题,应该是ADC_init()
而且显示之后要延时一段时间吧

使用特权

评论回复
9
tian111| | 2020-2-15 14:32 | 只看该作者
llia 发表于 2020-2-15 14:28
ADC没有初始化成功吧。你确定是ADC_init;而不是ADC_init();

犀利。

使用特权

评论回复
10
chenho| | 2020-2-15 14:35 | 只看该作者
这样编译都能通过?

使用特权

评论回复
11
songqian17| | 2020-2-15 14:38 | 只看该作者
能过

使用特权

评论回复
12
morrisk|  楼主 | 2020-2-15 14:41 | 只看该作者

嗯,那我按大家的说法挨个排查一下,谢谢哈

使用特权

评论回复
13
幸福小强| | 2020-2-15 20:57 | 只看该作者
显示程序没弄好,或者读取ADC没读对,时序看看。

使用特权

评论回复
14
ynwa| | 2020-2-17 14:20 | 只看该作者
先把ADC和LCD两个功能分开调试,各自调通了再整合。

使用特权

评论回复
15
CoolSilicon| | 2020-2-18 09:26 | 只看该作者
首先,你要确定ADC是否正确采样了
其次, 确定你的LCD显示部分是否正常显示.
再整合一起的看看吧

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝