PIC18F4520的ADC与LCD1602显示程序

2019-04-15 12:12发布

/*
说明:该程序使用的开发环境为:microchip公司的MPLAB X IDE v1.41、mplabc18-v3.40
      在该环境下编译成功、在proteus7.5中进行仿真成功。
      ADC使用的是通道1,液晶模块的RS、R/W、E、D0~D7与PIC18F4520的C0、C1、C2、RD0~RD7
      相连接。仿真时,RE3需要拉高电平,否则AD转换无法进行。
*/
#include
/*
说明:宏定义液晶模块的RS、R/W、E三个引脚的操作
*/
#define  DATA_OPERATE()    do{ TRISCbits.TRISC0=0; PORTCbits.RC0=1;}while(0)
#define  CMD_OPERATE()     do{ TRISCbits.TRISC0=0; PORTCbits.RC0=0;}while(0)
#define  READ()    do{ TRISD=0xff;TRISCbits.TRISC1=0; PORTCbits.RC1=1;}while(0)
#define  WRITE()   do{ TRISD=0x00;TRISCbits.TRISC1=0; PORTCbits.RC1=0;}while(0)
#define  DISABLE()        do{ TRISCbits.TRISC2=0; PORTCbits.RC2=0;}while(0)
#define  ENABLE()         do{ TRISCbits.TRISC2=0; PORTCbits.RC2=1;}while(0)
/*
液晶所需要显示的数据,由于在液晶模块的字库中包含所要显示的数据,所在可以直接如下所定义;否则,需要自己做欲显示数据的字模,那么显示函数还需要稍做修改,当然这里不需要。
*/
unsigned char  word[] = {"the_ADC_result:"};
unsigned char  ad_data[] = {"0123456789.v"};
/*
函数:延时函数
说明:这里对参数值稍作了调整,修改成20
*/
void delay(unsigned  dly)
{
    unsigned char temp;
    for(;dly>0;dly--)
        for(temp=20;temp>0;temp--);
      
}
/*************************************************************
功能:片上AD转换器初始化设置函数
参数:无
说明:设置使用通道0进行AD转换,转换后的数据采用右对齐的格式
      ADCON1与ADCON2的设置的意义可参看芯片说明书
*/
void init_ad()
{
    ADCON1=0X0C;
    ADCON2=0X94;
    ADCON0bits.ADON=1;
    ADCON0bits.CHS=1;
}
/*************************************************************
功能:获取AD转换结果函数
参数:返回16位转换结果数据--只有低10位是有效的转换数据
*/
unsigned int get_result()
{
    unsigned int dat=0;
    ADCON0bits.GO_DONE=1;
    while(ADCON0bits.GO_DONE);
    PIR1bits.ADIF=0;
    dat=ADRESH;
    dat=dat<<8;
    dat =dat+ADRESL;
    return dat;
}
/*************************************************************
功能:判断模块是否忙碌函数
参数:无
*/
unsigned char is_busy()
{
    unsigned char ret=0;
    CMD_OPERATE();
    READ();
    ENABLE();
    delay(1);
    ret=0x80&PORTD;
    DISABLE();
    return ret;
}
/*************************************************************
功能:向模块写命令函数
参数:8位命令数据,其代表的意义可参看模块说明书
*/
void lcd_write_cmd(unsigned char cmd)
{
    while(is_busy());
    CMD_OPERATE();
    WRITE();
    DISABLE();
    delay(1);
    PORTD=cmd;
    delay(1);
    ENABLE();
    delay(1);
    DISABLE();
}
/*************************************************************
功能:向模块写数据函数
参数:8位数据,其代表的意义可参看模块说明书
*/
void lcd_write_data(unsigned char dat)
{
    while(is_busy());
    DATA_OPERATE();
    WRITE();
    DISABLE();
    delay(1);
    PORTD=dat;
    delay(1);
    ENABLE();
    delay(1);
    DISABLE();
}
/*************************************************************
功能:设置模块显示位置函数
参数:8位数据,其代表的意义可参看模块说明书
*/
void lcd_pos(unsigned char pos)
{
    lcd_write_cmd(pos|0x80);
}
/*************************************************************
功能:模块初始化函数
参数:无
*/
void init_lcd()
{
    lcd_write_cmd(0x38);
    delay(1);
    lcd_write_cmd(0x0c);
    delay(1);
    lcd_write_cmd(0x06);
    delay(1);
    lcd_write_cmd(0x01);
    delay(1);
}
/*************************************************************
功能:主函数
参数:
*/
int main(int argc,char **argv)
{
    unsigned char i;
    unsigned int adc_result=0;
    init_ad();
    init_lcd();
    delay(10);
    lcd_pos(0x01);
    i = 0;
    while(word[i] != '