📄 digital-v-lcd-ok-11-17.c
字号:
//Editor: zhangmin
//Version: V1.0
//Description: LCD1602显示数字电压表,精度:0.01V
//Date:2008.11.17
//CPU:10%
/**********************************************************
头文件定义
**********************************************************/
#include<at89x51.h>
#include<intrins.h>
/**********************************************************
自变量定义
**********************************************************/
#define uchar unsigned char
#define uint unsigned int
//#define INTERVAL 20 //定义采样周期
sbit RS=P3^4; //LCD数据/指令选择端
sbit RW=P3^3; //LCD读写选择端
sbit E=P3^2; //LCD使能信号,从低到高有效
sbit busyFlag=P2^7; //LCD读忙标志位
sbit dataIn=P1^1; //TLC2543控制字输入端
sbit dataOut=P1^0; //TLC2543数据输出
sbit CS=P1^2; //TLC2543片选端
sbit CLK=P1^3; //TLC2543时钟信号输入端
//bit ADFlag; //是否进行采样标志
/**********************************************************
函数名称: delay
函数描述: 延时ms (11.0592MHz)
入口参数: uint i
**********************************************************/
void delay(uint i)
{
uchar a;
while(i--)
{
for(a=0;a<250;a++)
{
_nop_();_nop_();_nop_();_nop_();
}
}
}
/**********************************************************
函数名称: delayAD
函数描述: AD转换时间延时us (11.0592MHz)
入口参数: uint i
**********************************************************/
void delayAD(uint i)
{
while(--i);
}
/**********************************************************
函数名称: adConvert
函数描述: TLC2543驱动程序
入口参数: 转换地址
返回值: 转换结果 uint ad
**********************************************************/
uint adConvert(uchar port)
{
uint ad=0;
uchar i;
CS=0;
CLK=0;
port<<=4;
for(i=0;i<12;i++)
{
if(dataOut)
ad|=0x01;
dataIn=(bit)(port&0x80);
CLK=1; //时钟上升沿,读入一个字符
delayAD(3); //采样时间
CLK=0; //下降沿,输出一个字符
delayAD(3); //转换时间
port<<=1; //移出下一个字符
ad<<=1; //移出下一位空间
}
CS=1;
ad>>=1;
return (ad);
}
/**********************************************************
函数名称: dataConvert
函数描述: AD转换数据处理,精度0.01
入口参数: uint adRusult
**********************************************************/
/*uint dataConvert(uint adResult)
{
uint data;
uchar hundredBit,tenBit,oneBit;
data=adResult*1.0/4096*500; //设置精度为0.01,AD参考电压为5V
oneBit=data%10; //个位数
tenBit=(data/10)%10; //十位数
hundredBit=(data/100)%10; // 百位数
}
//以下是LCD1602驱动程序
/**********************************************************
函数名称: testBusy
函数描述: LCD检测是否忙碌函数
入口参数: 无
**********************************************************/
uchar testBusy(void)
{
bit flag;
P2=0xff;
RS=0; //选择指令端
RW=1; //选择读取
E=1; //使能端由低到高有效
if (busyFlag==1) flag=1;
else flag=0;
E=0;
return flag;
}
/**********************************************************
函数名称: writeCommand
函数描述: LCD写入指令函数
入口参数: 指令参数command
**********************************************************/
void writeCommand(uchar command)
{ while(testBusy());
RS=0; //选择指令端
RW=0; //选择写入
E=1; //下降沿读入
P2=command;
E=0;
}
/**********************************************************
函数名称: writeData
函数描述: LCD写入数据函数
入口参数: 指令参数writedata
**********************************************************/
void writeData(uchar writedata)
{
while(testBusy());
RS=1; //选择数据端
RW=0; //选择写入
E=1;
P2=writedata;
E=0;
}
/**********************************************************
函数名称: initialLcd1602()
函数描述: LCD写入指令函数
入口参数: 无
**********************************************************/
void initialLcd1602(void)
{
/*delay(100);
writeCommand(0x38);
delay(10);
writeCommand(0x38);
delay(10);
writeCommand(0x38);
delay(10); */ //初次使用
writeCommand(0x38); //设置显示格式为:8位,双行显示,5X7点阵
writeCommand(0x80);
writeCommand(0x01);
writeCommand(0x0c);//设置显示状态:显示器开,有光标,关闪烁 writeCommand(0x0f)
//writeCommand(0x0c);writeCommand(0x0e)
writeCommand(0x06);
}
/**********************************************************
函数名称: display_xy
函数描述: LCD确定光标位置函数
入口参数: 列坐标x,行坐标y
**********************************************************/
void display_xy(uchar x,uchar y)
{
if(y==1) //若第二行则光标地址加0x80
x+=0x40;
x+=0x80;
writeCommand(x);
}
/**********************************************************
函数名称: display_char
函数描述: 显示字符函数
入口参数: 列坐标x,行坐标y,输入数据
**********************************************************/
void display_char(uchar x,uchar y,uchar inputData)
{
display_xy(x,y); //确定光标位置
writeData(inputData); //输入字符数据
}
/**********************************************************
函数名称: display_string
函数描述: 显示字符串函数
入口参数: 列坐标x,行坐标y,输入数据串
**********************************************************/
void display_string(uchar x,uchar y,uchar *stringData)
{
uchar columnCoordinate=x; //定义列坐标
uchar rowCoordinate=y; //定义行坐标
while(*stringData!='\0') //循环条件:字符串没有结束
{
display_char(columnCoordinate,rowCoordinate,*stringData);
columnCoordinate++;
stringData++;
/* if(*stringData==0x60) //设置是否回车显示
rowCoordinate++;
if(rowCoordinate==2)
rowCoordinate=0; */
if(columnCoordinate==16)
{
columnCoordinate=0;
rowCoordinate++;
if(rowCoordinate==2) //当前页面显示完,准备下一页显示
{
delay(400); //翻页速度
writeCommand(0x01); //显示完一页后清屏,下一页内容更新
rowCoordinate=0; //重新在第一行显示
}
}
//writeCommand(0x01);
}
//一次显示结束
//delay(400);//停留时间,全部内容重新显示
}
//以上是TLC1602的驱动程序
/**********************************************************
函数名称:initialSerial
函数描述:串行口初始化
入口参数: 无
**********************************************************/
/*void initialSerial()
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
}
/**********************************************************
函数名称:serialSend
函数描述:串行口发送函数
入口参数: AD转换结果
**********************************************************/
/*void serialSend(uchar send[])
{
uchar i;
while(1) //设置发送的数组元素个数
{
SBUF=send[i];
while(!TI);
TI=0;
i++;
if(i==5)
break;
}
}
/**********************************************************
函数名称:T0interrupt
函数描述:T0定时函数,控制采样时刻
入口参数: 无
**********************************************************/
/*void T0interrupt() interrupt 1 using 1
{
uchar nCounter;
TH0=0x3C;
TL0=0XB0;
if(nCounter==INTERVAL)
{
nCounter=0;
ADFlag=1;
}
nCounter++;
}
/**********************************************************
函数名称: main
函数描述:主函数
入口参数: 无
**********************************************************/
void main(void)
{
uint adData,adResult;
uchar hundredBit,tenBit,oneBit;
uchar dataString[6]; //转换结果数据
uchar inputdata[]="The Voltage is:";//待显示的内容
delay(100); //等待LCD进入工作状态
initialLcd1602();
//initialSerial();
//循环显示内容
while(1)
{
display_string(0,0,inputdata); //起始显示位置
adResult=adConvert(0);
adData=adResult*1.0/4096*500; //设置精度为0.01,AD参考电压为5V
oneBit=adData%10; //个位数
tenBit=(adData/10)%10; //十位数
hundredBit=(adData/100)%10; // 百位数
dataString[0]=hundredBit+0x30;
dataString[1]=0x2E;//设置小数点
dataString[2]=tenBit+0x30;
dataString[3]=oneBit+0x30;
dataString[4]=0x56; //设置'V'
//以上为对AD转换数据的处理
display_string(6,1,dataString);
delay(100); //*****避免CPU时刻扫描LCD
// serialSend(dataString);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -