?? 51
字號:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC0801 XBYTE[0x7FFF] //adc0801地址
sbit RS = P1^5; //LCD命令/數(shù)據(jù)端
sbit RW = P1^6; //LCD讀/寫端
sbit LCDE = P1^7; //LCD使能端
sbit INTR = P1^0; //adc0801 中斷
uchar flag; //Busy標志
uchar dis_buf[5]; //顯示緩沖區(qū)
uchar code dis1[] = {"flow:"}; //第一行顯示表頭
uchar code dis2[] = {"m3/h"}; //第二行顯示表頭
uchar code dis[] = {"0123456789."}; //顯示代碼
//=============================================================================
// 函數(shù)聲明
//=============================================================================
void busy(void); //LCD忙標志判斷函數(shù)
void dat_wrt(uchar dat); //寫數(shù)據(jù)子函數(shù)
void cmd_wrt(uchar cmd); //寫命令子函數(shù)
void init_1602(void); //1602初始化函數(shù)
void lcd_start(uchar start); //設(shè)定顯示位置函數(shù)
void dat_adj(uchar dat1); //顯示數(shù)據(jù)調(diào)整函數(shù)
void disp(uint dat,uchar k); //顯示子函數(shù)
void print(uchar *str); //字符串顯示函數(shù)
uchar AD_dat(void); //AD轉(zhuǎn)換函數(shù)
uchar dat_change(uchar flowad); //流量轉(zhuǎn)換函數(shù)
void delay1ms(uchar x); //延時約1ms程序
/***********主程序***************/
void main (void)
{
uchar ad;
init_1602(); //初始化液晶
lcd_start(0x00); //確定顯示起始位置第一行
print(dis1); //顯示文字flow:
lcd_start(0x44); //確定顯示起始位置第二行中間
print(dis2); //顯示文字m3/h
while(1)
{
ad=AD_dat(); //測流量
ad=dat_change(ad); //流量轉(zhuǎn)換
disp(ad,0x41); //第二行顯示流量
delay1ms(2000); //延時2s重新采集流量
}
}
/********************流量轉(zhuǎn)換函數(shù)*********************/
//0~255 0~5V 4~20mA 0.4~14m3/h
uchar dat_change(uchar flowad) //流量轉(zhuǎn)換函數(shù)
{
float flow1;
uchar flow;
flow1=(float)(flowad)*(14-0.4)/255+0.4; //流量轉(zhuǎn)換
flow1=flow1*10; //保留1位小數(shù)
flow=(uchar)(flow1); //數(shù)據(jù)類型轉(zhuǎn)換
return(flow); //返回流量數(shù)據(jù)
}
/********************AD轉(zhuǎn)換函數(shù)*********************/
uchar AD_dat(void) //AD轉(zhuǎn)換函數(shù)
{
uchar flowad;
ADC0801=0; //啟動AD轉(zhuǎn)換
while (INTR); //等待轉(zhuǎn)換結(jié)束
flowad=ADC0801; //讀取轉(zhuǎn)換值
return(flowad);
}
void delay1ms(uchar x) //延時約1ms程序
{
uchar Time,Time1;
for(Time=0;Time<x;Time++)
for(Time1=0;Time1<120;Time1++);
}
/************************LCD忙標志判斷函數(shù)*******************/
void busy(void)
{
flag=0x80; //賦初值 高位為1 禁止
while (flag&0x80) //讀寫操作使能位禁止時等待 繼續(xù)檢測
{
P0=0xff;
RS=0; //指向地址計數(shù)器
RW=1; //讀
LCDE=1; //信號下降沿有效
flag=P0; //讀狀態(tài)位 高位為狀態(tài)
LCDE=0;
}
}
/************************寫數(shù)據(jù)子函數(shù)************************/
void dat_wrt(uchar dat)
{
busy(); //檢測 讀寫操作使能嗎
LCDE=0;
RS=1; //指向數(shù)據(jù)寄存器
RW=0; //寫
P0=dat; //寫數(shù)據(jù)
LCDE=1; //高電平有效
LCDE=0;
}
/*************************寫命令子函數(shù)************************/
void cmd_wrt(uchar cmd)
{
LCDE=0;
busy(); //檢測 讀寫操作使能嗎
P0=cmd; //命令
RS=0; //指向命令計數(shù)器
RW=0; //寫
LCDE=1; //高電平有效
LCDE=0;
}
/************************1602初始化函數(shù)***********************/
void init_1602(void)
{
cmd_wrt(0x01); //清屏
cmd_wrt(0x0c); //開顯示,不顯示光標,不閃爍
cmd_wrt(0x06); //完成一個字符碼傳送后,光標左移,顯示不發(fā)生移位
cmd_wrt(0x38); //16×2顯示,5×7點陣,8位數(shù)據(jù)接口
}
/***********************設(shè)定顯示位置函數(shù)**********************/
void lcd_start(uchar start)
{
cmd_wrt(start|0x80);
}
/***********************顯示數(shù)據(jù)調(diào)整函數(shù)**********************/
void dat_adj(uchar dat1)
{
dis_buf[0]=(dat1%1000)/100; //十位
dis_buf[1]=(dat1%100)/10; //個位
dis_buf[2]=10; //小數(shù)點
dis_buf[3]=dat1%10; //小數(shù)點后個位
}
/**************************顯示子函數(shù)*************************/
void disp(uint dat,uchar k)
{
uchar j;
dat_adj(dat);
lcd_start(k); //確定顯示起始位置
for(j=0;j<4;j++) //寫顯示數(shù)據(jù)
dat_wrt(dis[dis_buf[j]]);
}
/************************字符串顯示函數(shù)***********************/
void print(uchar *str)
{
while(*str!='\0') //直到字符串結(jié)束
{
dat_wrt(*str); //
str++; //指向下一個字符
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -