微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机——压力传感器LCD

单片机——压力传感器LCD

时间:11-18 来源:互联网 点击:

主程序
#include
#include
#include
#include

#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x80 //常量定义
#define DATAPORT P0

//ADC0832的引脚
sbit ADCS =P3^5; //ADC0832 chip seclect
sbit ADDI =P3^7; //ADC0832 k in
sbit ADDO =P3^7; //ADC0832 k out
sbit ADCLK =P3^6; //ADC0832 clock signal

sbit LCM_RS=P2^0;
sbit LCM_RW=P2^1;
sbit LCM_EN=P2^2;

uchar ad_data; //采样值存储
sbit Alarm_led_red =P1^5; //超过压力表量程最大值红色led报警定义
sbit Alarm_led_green=P1^6; //低于压力表量程最小值绿色led报警定义
//adc采样值存储单元
char press_data; //标度变换存储单元
unsigned char ad_alarm; //报警值存储单元
unsigned char press_bai=0; //显示值百位
unsigned char press_shi=0; //显示值十位
unsigned char press_ge=0; //显示值个位
unsigned char press_dot=0; //显示值十分位

uchar code str0[]={"Press: . kpa. "};
uchar code str1[]={" Check BY Jack "};

void delay(uint);
void lcd_wait(void);
void delay_LCM(uint); //LCD延时子程序
void initLCM( void); //LCD初始化子程序
void lcd_wait(void); //LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数
void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数
void display(void); //系统显示子函数
uchar Adc0832(unsigned char channel);
void alarm(void);
void data_pro(void);

/**********main funcation************/

void main(void)
{
delay(500); //系统延时500ms启动
//ad_data=0; //采样值存储单元初始化为0
initLCM( );

WriteCommandLCM(0x01,1); //清显示屏
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);

while(1)
{
ad_data =Adc0832(0); //采样值存储单元初始化为0

alarm();

data_pro();

display();

}
}

/*********延时K*1ms,12.000mhz**********/

void delay(uint k)
{
uint i,j;
for(i=0;i{
for(j=0;j<60;j++)
{;}
}
}
/**********写指令到ICM子函数************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0; // 选中指令寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;

}

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //检测忙信号
DATAPORT=WDLCM;
LCM_RS=1; // 选中数据寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}

/***********lcm内部等待函数*************/

void lcd_wait(void)
{
DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;

}

/**********LCM初始化子函数***********/

void initLCM( )
{
DATAPORT=0;
delay(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);

WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1); //关闭显示,检测忙信号
WriteCommandLCM(0x01,1); //清屏,检测忙信号
WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
}

/****显示指定坐标的一个字符子函数****/

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{
Y&=1;
X&=15;
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}

/*******显示指定坐标的一串字符子函数*****/

void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}

/*****************系统显示子函数*****************/

void display(void)
{
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);

DisplayOneChar(7,0,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top