📄 lcd与ad转换.c
字号:
/*flashman编写,QQ28479691*/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
sfr ADCR=0xc5; //控制寄存器
sfr ADDR=0xc6; //结果寄存器
sfr P1M0=0x91;
sfr P1M1=0x92;
char code DisV[]={"V:"};//灵敏度
char code DisP[]={"P:"};//精确度
sbit RS=P1^7;
sbit RW=P1^6;
sbit E=P1^5;
void LcdIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void delay();
void DisText(uchar addr,uchar *text);
void ShowNum(uchar addr,uint num); //在addr处显示数字num
void ShowByte(uchar addr,uchar num);
char AdcVal(uchar n); //取出单次ADC的值
char AdcValPro(uchar n); //进行软件滤波后的ADC的值
char data BCD[6]; //十位二进制的显示码分别是千百十个位的显示
char data Adc[2]; //存放Adc转换后的值
void main(void)
{
SP=0X5F;
LcdIni();
DisText(0x80,DisV);
DisText(0xc0,DisP);
while(1)
{
ShowByte(0x82,AdcValPro(0));
ShowByte(0xC2,AdcVal(1));
}
}
//-----------------------------------------
//ADC相关程序
char AdcVal(uchar n)
{//软件滤波
uchar i,k;
uint tmp=0,val;
for(i=0;i<20;i++)
{
k=AdcValPro(n);
tmp=(tmp+k)/2;
}
val=(uchar)(tmp);
k=val>Adc[n] ? (val-Adc[n]):(Adc[n]-val);
Adc[n]=k>0 ? val:Adc[n];
return Adc[n];
}
char AdcValPro(uchar n)
{//返回第N个ADC的值从0到7
uchar val;
P1M0=0x03;
P1M1=0x03;
ADCR=0x88+n;
while((ADCR & 0x10) ==0);
val=ADDR;
ADCR=0x00;
return val;
}
//-----------------------------------------
//LCD相关程序
void ShowNum(uchar addr,uint num) //在addr处显示数字num
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uchar i;
for(i=5;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]=' '; //NUM转换成数组存放,但还没有加上小数点
BCD[5]='\0';
DisText(addr,BCD);
}
void ShowByte(uchar addr,uchar num)
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uchar i;
for(i=3;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]=' '; //NUM转换成数组存放,但还没有加上小数点
BCD[3]='\0';
DisText(addr,BCD);
}
void DisText(uchar addr,uchar *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}
void LcdIni()
{
WrOp(0x38);
WrOp(0x28);
WrOp(0x06);
WrOp(0x0E); //光标加1
}
void WrOp(uchar dat)
{
ChkBusy();
RS=0;
RW=0;
E=0;
P3=(dat>>4);
E=1;
delay();
E=0;
P3=dat;
E=1;
delay();
E=0;
}
void WrDat(uchar dat)
{
ChkBusy();
RS=1;
RW=0;
E=0;
P3=(dat>>4);
E=1;
delay();
E=0;
P3=dat;
E=1;
delay();
E=0;
}
void ChkBusy()
{
uchar dat;
do
{
P3|=0x0f; //
RS=0;
RW=1;
E=1;
dat=P3; //读出P3数据
E=0;
E=1;
_nop_();
E=0;
}while(dat & 0x08);
}
void delay(void)
{
uchar j;
for(j=0;j<3;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -