/*
说明:该程序使用的开发环境为: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] != '