历史上的今天
今天是:2025年04月18日(星期五)
2020年04月18日 | PIC18F4520的ADC与LCD1602显示程序
2020-04-18 来源:eefocus
/*
说明:该程序使用的开发环境为: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] != '




