标题:
lcd1602不能实时显示探测结果,求大神赐教
[打印本页]
作者:
周子瑜
时间:
2018-5-19 17:33
标题:
lcd1602不能实时显示探测结果,求大神赐教
不能实时显示探测结果,求大神赐教;
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
uchar AD_DATA[1]; //保存IN0通道转换后的数据
uchar addata0;
uchar addata1;
/********************adc0809端口定义*******************/
#define adc0809_data P2// ADC0809模块的D0-D7分别接P2.0-P2.7
sbit STR=P0^0; //单片机P0.0接模块STR引脚, 启动转换信号
sbit EOC=P0^1; //单片机P0.1接模块EOC, 转换结束信号,高电平有效
sbit OE=P0^2; //单片机P0.2接模块OE,输出允许信号,高电平有效
sbit CLK=P0^3; //单片机P0.3接CLK ,ADC0809时钟,输入50-800KHZ的频率
sbit ADD_A=P0^4;
sbit ADD_B=P0^5; //定义地址线
sbit ADD_C=P0^6;
/******************************************************/
/*******************lcd1602端口定义********************/
#define LCM_Data P1 //LCD1602数据接口
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LCM_RW = P3^3; //读写控制输入端,LCD1602的第五脚
sbit LCM_RS = P3^4; //寄存器选择输入端,LCD1602的第四脚
sbit LCM_E = P3^2; //使能信号输入端,LCD1602的第6脚
/******************************************************/
/*******************存储模块端口定义*******************/
sbit P1_0 = P3^5;//busy忙标志管脚
sbit P1_5 = P3^6 ;//测试板信号指示(指示发送数据)
/******************************************************/
/*******************函数声明***************************/
void WriteDataLCM (uchar WDLCM);//LCD模块写数据
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令
uchar ReadStatusLCM(void);//读LCD模块的忙标
void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
void LCMInit(void);//LCD初始
void delayms(uint ms);//1MS基准延时程序
void delay(uchar i); //延时函数2
void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
void judge_xianshi(void);//显示处理程序
void init();//系统初始化设置
void AD();//读取AD数据
void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/);
void SD();
uchar flag1;
/******************************************************/
/*******************系统初始化*************************/
void init()
{
EA=1; //开总中断
TMOD=0x02; //设定定时器 T0工作方式
TH0=216; //利用T0中断产生CLK信号
TL0=216;
TR0=1; //启动定时器T0
ET0=1;
STR=0;
OE=0;
}
/******************************************************/
/******************adc0809*****************************/
void AD()
{
STR=1;//ADDR这样如果不是通道0,可以在这边加一条其他地址的程序
delay(10);
ADD_A=0;
ADD_B=0;
ADD_C=0;
delay(10);
STR=0;
delay(10);
STR=1; //启动AD转换
delay(10);
STR=0;
while(0==EOC);//等待转换结束
OE=1;
AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
OE=0;
delay(10);
}
/******************************************************/
/********************lcd1602***************************/
void judge_xianshi()
{
addata0=255/AD_DATA[0]/1*10;//把数据扩大10,为下面求取小数位后1位做准备
DisplayListChar(0,0,0, "R="); //在液晶的第二行第0位开始显示"R="
DisplayOneChar(0,2, addata0/100000+0x30); //显示AD数据的万位
DisplayOneChar(0,3, addata0/10000%10+0x30);//显示AD数据的千位
DisplayOneChar(0,4, addata0/1000%10+0x30);//显示AD数据的百位
DisplayOneChar(0,5, addata0/100%10+0x30);//显示AD数据的十位
DisplayOneChar(0,6, addata0/10%10+0x30);//显示AD数据的十位
DisplayListChar(0,7,0, ".");
DisplayOneChar(0,8, addata0%10+0x30);
DisplayListChar(0,9,0, "v");
DisplayListChar(0,10,0, "/");
DisplayListChar(0,11,0, "a");
addata1=AD_DATA[0]*5/51/1*10;//把数据扩大10,为下面求取小数位后1位做准备
DisplayListChar(1,0,0, "P="); //在液晶的第二行第8位开始显示"P="
DisplayOneChar(1,2, addata1/100000+0x30); //显示AD数据的万位
DisplayOneChar(1,3, addata1/10000%10+0x30);//显示AD数据的千位
DisplayOneChar(1,4, addata1/1000%10+0x30);//显示AD数据的百位
DisplayOneChar(1,5, addata1/100%10+0x30);//显示AD数据的十位
DisplayOneChar(1,6, addata1/10%10+0x30);//显示AD数据的各位
DisplayListChar(1,7,0, ".");
DisplayOneChar(1,8, addata1%10+0x30);
DisplayListChar(1,10,0, "w");
}
/***********************中断***************************/
void t0(void) interrupt 1 using 0
{
CLK=~CLK;
}
/******************************************************/
void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData)
{
unsigned char ListLength;
ListLength = 0;
X&=0x1;
Y&=0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]!='\0') //若到达字串尾则退出
{
if (Y <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
Y++;
delayms(ms);//延时显示字符串
}
else
break;//跳出循环体
}
}
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delayms(5);
WriteCommandLCM(0x38,0);
delayms(5);
WriteCommandLCM(0x38,0);
delayms(5);
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
delayms(100);
}
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
uchar ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
void DisplayOneChar( uchar X, uchar Y, uchar ASCII)
{
X&=0x1;
Y&=0xF; //限制Y不能大于15,X不能大于1
if(X)Y|=0x40; //当要显示第二行时地址码+0x40;
Y|=0x80; // 算出指令码
WriteCommandLCM(Y, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(ASCII);
}
/******************************************************/
/********************延迟函数**************************/
void delayms(uint Ms)
{
uint i,TempCyc;
for(i=0;i<Ms;i++)
{
TempCyc =70;
while(TempCyc--);
}
}
void delay(uchar i)
{
uchar j;
while(i--)
{
for(j=125;j>0;j--);
}
}
/******************************************************/
/*******************存储模块***************************/
uchar date_temp[50]={0};//获取系统状态
code uchar top[]={" 单位:西安工业大学"};//获取系统状态,22
code uchar item[]={"电阻(Ω) 功率(W) 工作状态"};//获取系统状态,31
uchar D_date[]={"10000.0 10000.0 正常"};//定义数据格式,28
void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/);
unsigned char a;
unsigned char addata0;
unsigned char addata1;
unsigned char r;
unsigned char p;
void CUNCHU (void)
{
SCON = 0x50; //0101,0000 串口方式1,允许接收,无奇偶校验位
TMOD = 0x20; //0010,0000 时器1,定时方式2 自动重装装计数器
PCON = 0x80; //SMOD=1
TL1 = 0xfd;
TH1 = 0xfd;
TR1 = 1;
P1_0 = 1;
delay(2000);
//写标题
while(P1_0);
memcpy(date_temp,top,22);
Send_UART(22,date_temp);
//写条目
while(P1_0);
memcpy(date_temp,item,31);
Send_UART(31,date_temp);
while(1)
{
r=addata0;
p=addata1;
D_date[1] =r/100000%10+'0';
D_date[2] =r/10000%10+'0';
D_date[3] =r/1000%10+'0';
D_date[4] =r/100%10+'0';
D_date[5] =r/10%10+'0';
D_date[6] ='.';
D_date[7] =r%10+'0';
D_date[12]=p/100000%10+'0';
D_date[13]=p/10000%10+'0';
D_date[14]=p/1000%10+'0';
D_date[15]=p/100%10+'0';
D_date[16]=p/10%10+'0';
D_date[17]='.';
D_date[18]=p%10+'0';
delay(50);
memcpy(date_temp,D_date,28);
Send_UART(28,date_temp);
delay(50);
}
}
void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/)
{
unsigned int i=0;
while(i<num)
{
TI = 0; //清零串口发送完成中断请求标志
SBUF = Date_OUT[i]; //date[i]
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
i++;
}
//WINDOWS里的是 13 + 10(ASCII码值)作为换行
//-----------------------------------------------发送换行符0x0D
SBUF = 0x0d;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
//-----------------------------------------------发送换行符0x0a
SBUF = 0x0a;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
}
/******************************************************/
/*********************主函数***************************/
main()
{
while(1)
{
init();//系统初始化设置
LCMInit();
AD();
judge_xianshi();
CUNCHU();
//if(()()) //报警
delayms(100);
}
}
/******************************************************/
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1