我对单片机这个课程产生了怀疑,开这个到底有啥意思?进度实在是太快了,还有。啥都给出来了,还学什么?
仔细想了一下,快要结束了哈,我这个公众号,到底是在干什么啊~……,后面该回归正轨了
//源码来源:SoloShine丶,算法:Ms Mao
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define out P0//引用头文件和定义宏
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2; //定义LCD的引脚
sbit adcs=P1^0; //定义ADC0832的引脚
sbit adclk=P1^1;
sbit adio=P1^2;
uchar adc0,adc1; //定义变量保存转换后的数字量
void delay(uint j) //延时,用于LCD控制
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
void check_busy(void)//查忙
{
uchar dt;
do
{
dt=0xff;
E=0;
RS=0;
RW=1;
E=1;
dt=out;
}while(dt&0x80);
E=0;
}
void w_lcdcom(uchar com) //写LCD命令数据
{
check_busy();
E=0;
RS=0;
RW=0;
out=com;
E=1;
_nop_();
E=0;
delay(1);
}
void w_lcddat(uchar dat)//写LCD一个字符数据
{
check_busy();
E=0;
RS=1;
RW=0;
out=dat;
E=1;
_nop_();
E=0;
delay(1);
}
void initlcd()//初始化LCD
{
w_lcdcom(0x38);
w_lcdcom(0x0c);
w_lcdcom(0x06);
w_lcdcom(0x01);
delay(1);
}
void w_lcdstr(uchar *s)//写LCD字符串
{
while(*s>0)
w_lcddat(*s++);
}
uchar r_adc0832(uchar adch)//选择通道,读ADC0832一个字节数据
{
uchar i;
uchar dat=0;
adio=1; //ADC0832初始化
_nop_();
adcs=0; //片选有效
_nop_();
for(i=0;i
{
adclk=1;
_nop_();
adclk=0;
_nop_();
adio=adch&0x01;
_nop_();
} //通道选择结束
adclk=1; //读数据前的初始化
_nop_();
adclk=0;
_nop_();
adio=1;
_nop_();
for(i=0;i
{
if(adio)dat|=0x01;
adclk=1;
_nop_();
adclk=0;
_nop_();
} //读数据结束
adcs=1; //片选无效
adclk=0;
adio=1;
return (dat);
}
void main()//主程序
{
initlcd();//初始化LCD
w_lcdcom(0x84);//置光标到第1行第4列
w_lcdstr("U1=");//显示字符串“U1=”
w_lcdcom(0xc4);//置光标到第2行第4列
w_lcdstr("U2=");//显示字符串“U2=”
while(1)
{
adc0=r_adc0832(1); //读ADC0832通道CH0的数据
adc1=r_adc0832(3); //读ADC0832通道CH1的数据
w_lcdcom(0x87); //置光标到第1行第7列
w_lcddat(adc0/51|0x30); //显示通道CH0的十位
w_lcddat('.');
w_lcddat((adc0%51)*10/51|0x30); //显示通海CH0的十分位
w_lcddat((((adc0%51)*10%51)*10)/51|0x30); //显示通道CH0的百分位
w_lcddat('V');
w_lcdcom(0xc7); //置光标到第2行第7列
w_lcddat(adc1/51|0x30); //显示通道CH1的十位
w_lcddat('.');
w_lcddat((adc1%51)*10/51|0x30); //显示通海CH1的十分位
w_lcddat((((adc1%51)*10%51)*10)/51|0x30); //显示通道CH1的百分位
w_lcddat('V');
}
}
领取专属 10元无门槛券
私享最新 技术干货