|
发表于 2010-8-18 22:15:42
|
显示全部楼层
回复【14楼】wyb4993
#include<pic.h>
#include<pic1687x.h>
#define uchar unsigned char
#define uint unsigned int
//__CONFIG(0x3B31);
const uchar table[]={"电流:"};
const uchar table2[]={"电压:"};
uchar table1[]={"0123456789"};
void delay(uint x);
void init();
void init1();
void lcd_init();
void clear_p();
void chk_busy();
void send_i(unsigned char x);
void send_d(unsigned char x);
void qushu(int counts,const unsigned char *ps);
bit busy;
#define rs RE2
#define rw RE1
#define e RE0
#define psb RA2
#define rst RA1
void disp();
uint get_ad();
void main()
{
uint temp;
uchar a1,a2,a3,a4;
while(1)
{
init();
temp=get_ad();
a1=temp/1000;
a2=temp%1000/100;
a3=temp%100/10;
a4=temp%10;
disp(a1,a2,a3,a4);
delay(500);
}
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init()
{
TRISA=0x01;
TRISD=0;
TRISE=0;
PORTA=0x00;
PORTE=0x00;
PORTD=0X00;
ADCON0=0x41;
ADCON1=0x8e;
delay(10);
}
/*
void init1()
{
TRISA=0X00;
TRISD=0X00;
TRISE=0X00;
ADCON1=0X06;
}
*/
uint get_ad()
{
uint adval;
float advalf;
ADGO=1;
while(ADGO);
adval=ADRESH;//00000000 00000011
adval=adval<<8|ADRESL;//00000011 11111111
advalf=adval/1023.0*5.0;//==2.3843
adval=advalf*1000;
return (adval);
}
void lcd_init()
{
rst=0; //复位LCD
delay(10); //保证复位所需要的时间
rst=1; //恢复LCD正常工作
delay(10);
psb=1; //设置LCD为8位并口通信
send_i(0x30); //基本指令操作
// send_i(0x01); //清除显示
send_i(0x06); //指定在写入或读取时,光标的移动方向
send_i(0x0c); //开显示,关光标,不闪烁
}
void qushu(int counts,const unsigned char *ps)
{
int i; //定义循环变量
for(i=1;i>0;i--) //循环counts次
{
send_d(*ps); //查表取数并调用显示一个字节数据函数送显示
delay(20); //延长一定时间,确保能看到数据一个个的显示出来
ps++; //取下一个数据
}
}
/*void clear_p()
{
//send_i(0x01); //清除所有显示
send_i(0x34); //扩展指令操作
send_i(0x30); //基本指令操作
}*/
void send_d(unsigned char x)
{
chk_busy(); //检测LCD是否工作繁忙
rs=1; //设置该字节数据是显示数据
rw=0; //设置该次操作为写
PORTD=x; //送数据口PORTD
e=1; //使能
delay(10);
e=0; //禁止
}
void send_i(unsigned char x)
{
chk_busy(); //检测LCD是否工作繁忙
rs=0; //设置该字节数据为控制命令
rw=0; //设置此次操作为写
PORTD=x; //送数据口PORTD
e=1; //使能
delay(10);
e=0; //禁止
}
void chk_busy()
{
busy=1; //先置位繁忙标志位
TRISD=0XFF; //更改通信为输入
rs=0; //设置该字节数据为命令代码
rw=1; //设置此次操作为读
while(busy)
{
delay(10);
e=1; //使能
delay(10);
if(!RD7) busy=0; //检测LCD是否工作繁忙
delay(10);
e=0; //禁止
}
e=0; //禁止
TRISD=0X00; //恢复通信为输出
}
void disp(a1,a2,a3,a4)
{
init();
lcd_init();
// clear_p();
send_i(0x80);
qushu(0X05,table);
send_i(0x30);
send_i(0x90);
send_i(0x90);
qushu(0X05,table2);
send_d(table1[a1]);
delay(20);
send_d('.');
delay(20);
send_d(table1[a2]);
delay(20);
send_d(table1[a3]);
delay(20);
send_d(table1[a4]);
delay(20);
这个程序在液晶上能显示出来,但是不能测量到电压,哪位高手指点一下啊…… |
|