打印

LCD 一直显示同一个数字

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

使用特权

评论回复
沙发
zhanghqi| | 2022-6-12 17:39 | 只看该作者
仿真一下。看是采样问题,还是显示问题。

使用特权

评论回复
板凳
supernan| | 2022-6-12 17:41 | 只看该作者
还有什么现象?能再详细描述下吗?

使用特权

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

使用特权

评论回复
5
xxrs| | 2022-6-16 20:24 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
6
morrisk|  楼主 | 2022-6-16 20:26 | 只看该作者
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
午夜粪车| | 2022-6-16 20:28 | 只看该作者
ADC没有初始化成功吧。你确定是ADC_init;而不是ADC_init();

使用特权

评论回复
8
yszong| | 2022-6-16 20:29 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
9
zwll| | 2022-6-16 20:31 | 只看该作者
ADC_init有问题,应该是ADC_init()

使用特权

评论回复
10
supernan| | 2022-6-16 20:33 | 只看该作者
而且显示之后要延时一段时间吧

使用特权

评论回复
11
heweibig| | 2022-6-16 20:36 | 只看该作者
犀利。

使用特权

评论回复
12
yszong| | 2022-6-16 20:42 | 只看该作者

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

使用特权

评论回复
13
xxrs| | 2022-6-16 20:47 | 只看该作者

这样编译都能通过?

使用特权

评论回复
14
huangchui| | 2022-6-16 20:50 | 只看该作者
仿真一下,看有变化没。

使用特权

评论回复
15
morrisk|  楼主 | 2022-6-16 20:52 | 只看该作者

唉,还是没有什么结果,算了,多谢大家啦

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝