久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
免费网站在线
|
亚洲精品久久久一区二区三区
|
一区二区国产精品
|
日韩欧美中文字幕在线观看
|
亚洲小视频在线播放
|
欧美日韩在线一区二区
|
久久久久久久久综合
|
亚洲欧美视频一区
|
欧美精品一区二区在线观看
|
亚洲社区在线
|
精品一区二区免费视频
|
亚洲视频在线一区
|
青青草网站在线观看
|
久久综合一区
|
国产精品一区久久久
|
欧美一区二区三区久久精品
|
久久精品亚洲
|
久久久久久国产精品
|
综合自拍
|
精品一区二区不卡
|
色噜噜色综合
|
免费看黄视频网站
|
日韩一区和二区
|
欧美激情欧美激情在线五月
|
狠狠干狠狠操
|
午夜在线视频
|
亚洲一区不卡在线
|
www.亚洲精品
|
成人国产精品色哟哟
|
久久久久久久久久久国产
|
福利在线观看
|
亚洲高清视频一区
|
国产精品一区二区视频
|
国产精品国产三级国产aⅴ浪潮
|
久久亚洲春色中文字幕久久久
|
麻豆久久久久久久
|
aaaaa毛片
|
天堂久久久久久久
|
色精品视频
|
国产农村妇女毛片精品久久麻豆
|
久久国产精品免费一区二区三区
|