📄 untitled.c
字号:
/******************************************
*程序功能;采集0-5v电压经AD转换处理,结果送LCD显示 *
* 时钟频率:内部8MHz *
* 设 计:方 勇 *
* 修改日期:2008年08月20日 *
* 编译环境:maplab8.1 *
* 实验环境:自制试验板 *
* 使用端口:RC0~PCRC3,RC4,RC5 *
* 端口连接:RC0~PCRC3->DB4~DB7,RC4->E,RC5->R/S,GND->R/W *
*****************************************/
#include "pic18.h" //包含单片机内部资源预定义
const char TABLE[]={0x30,0x31,0x32,0x33,0x34,
0x35,0X36,0X37,0X38,0X39,0X2E,0x56,0xA0}; //定义常数0-9及“.”的数据表格
int i,j,k,n;//用于调试的全局变量
#define E RC4 //定义液晶显示控制管脚
#define RS RC5
const int Twentyms=1250; //说明一个用于20ms延时的常量
const int Fivems=300;
const int TwoHundredus=10;
const char TopMessage1[]="Fighting!AZa AZa";
const char BotMessage1[]="V=";
void DELAY(); //delay函数申明
void init(); //I/O口初始化函数申明
void display(int x); //显示函数申明
LCDWrite(int LCDData,int RSValue)
{
PORTC=(LCDData>>4)&0x0f;//获取输出的高4位
RS=RSValue;
E=1;E=0; //拨动开关高4位
PORTC=LCDData&0x0f; //获取输出低4位
RS=RSValue;
E=1;E=0; //拨动开关低4位
if((0==(LCDData&0x0f))&&(0==RSValue))
n=TwoHundredus; //设置延时间隔
else
n=Fivems;
for(k=0;k<n;k++); //字符延时
} //LCDWrite函数结束
void LCDINIT()
{
PORTC=0; //从C口所有位都为高电平开始
TRISC=0; //c口为输出
// 根据网页提供的信息初始化液晶显示
j=Twentyms;
for(i=0;i<j;i++); //等待液晶显示通电
PORTC=3; //开始初始化过程
E=1;E=0; //发送复位命令
j=Fivems;
for(i=0;i<j;i++);
E=1;E=0; //重复复位命令
j=TwoHundredus;
for(i=0;i<j;i++);
E=1;E=0; //第三次复位
j=TwoHundredus;
PORTC=2; // 初始化液晶显示4位模式
E=1;E=0;
j=TwoHundredus;
for(i=0;i<j;i++);
LCDWrite(0b00101000,0); //液晶显示是4位I/F,双排的
LCDWrite(0b00000001,0); //清除液晶显示
LCDWrite(0b00000110,0); //在每个字符显示之后移动光标
LCDWrite(0b00001110,0); //接通液晶显示并激活光标
}
//------------------------------------------------
//主程序开始
void main()
{
int m;
int result=0x00; //定义转换结果寄存器
NOP ();
LCDINIT();
for(i=0;TopMessage1[i]!=0;i++) //显示LOGO
LCDWrite(TopMessage1[i],1);
while(1) //死循环
{
result=0x00; //转换结果清0
for(m=5;m>0;m--) //求5次转换结果的平均值
{
init(); //调用初始化函数
while(GODONE); //等待转换完成
result=result+ADRESH; //累计转换结果
}
result=result/5; //求5次结果的平均值
NOP ();
display(result); //调用显示函数
}
}
//-----------------------------------------------
//初始化函数
void init()
{
PORTA=0XFF;
TRISA=0X01; //设置RA0为输入,其他为输出
TRISC=0X00; //设置D口全为输出
ADCON0=0X00; //选择通道0
ADCON1=0X0B;
ADCON2=0X09; //左对齐8个TAD时间 FOSC/8
//ADCON2=0XA1;右对齐
ADON=1; //使能AD转换
DELAY(); //保证采样延时
GODONE=1;
}
//-----------------------------------------------
//显示函数
void display(int x)
{
int bai,shi,ge,temp; //定义4个临时变量
temp=x; //暂存AD转换的结果
bai=temp/51; //求显示的百位
NOP ();
temp=temp%51; //求显示的十位
temp=temp*10;
shi=temp/51;
temp=temp%51;
temp=temp*10;
ge=temp/51;
//LCDINIT();
// for(i=0;TopMessage1[i]!=0;i++)
// LCDWrite(TopMessage1[i],1);
LCDWrite(0b11000000,0); //将光标移动到第二排
LCDWrite(TABLE[12],1);
LCDWrite(TABLE[12],1);
LCDWrite(TABLE[12],1);
for(i=0;BotMessage1[i]!=0;i++)
LCDWrite(BotMessage1[i],1);
LCDWrite(TABLE[bai],1);
LCDWrite(TABLE[10],1);
LCDWrite(TABLE[shi],1);
LCDWrite(TABLE[ge],1);
LCDWrite(TABLE[11],1);
//LCDWrite(0B11111111,1);
NOP ();
}
//----------------------------------------------
//延时程序
void DELAY() //延时程序
{
int i;
for(i=0x100;i--;); //延时
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -