datasheet

1602液晶显示的电压表程序

2018-01-14 20:24:00来源: eefocus 关键字:1602  液晶显示  电压表

STC12C5406AD 晶振频率为12MHz 指令周期:本程序取:1.0us/6倍。

本程序已调试完成:

功能说明:STC12C5406AD+74HC164+1602液晶显示电压表
测量电压:采用10位AD测量,测量结果非常准确。
#include "stc12c5410ad.h"//头文件
#include "intrins.h"
#define uchar unsigned char//宏定义

#define uint unsigned int//宏定义


sbit RS=P3^4;//定义I/O的硬件接口
sbit E=P3^7;

sbit A_B=P3^2;
sbit CP=P3^3;

sbit Simulation=P1^7;//模拟电压输入

uint temp;


uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//1602:0-9 数字
uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号
uchar DispBuf[6]; //6字节的显示缓冲区
char char_char_1[]={" www.mdizi.com "};//定义字符串

void delay(uint z)//1ms延时

uchar x,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}

void delay1()//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。
{
_nop_();
_nop_();
_nop_();
}


void write_Directive(uchar a)//写指令

uchar i,temp;
for(i=0;i<8;i++)
{
temp=a;
temp&=0x80;
if(temp==0x80)
A_B=1; 
else 
A_B=0;
a=a<<1;
delay1();
CP=0;
delay1();
CP=1;
delay1();
CP=0;
}

RS=0;
delay(3);
E=0;
delay(3);
E=1;
delay(3);
E=0;
delay(3);
}

void write_Data(uchar a)//写数据

uchar i,temp;
for(i=0;i<8;i++)
{
temp=a;
temp&=0x80;
if(temp==0x80)
A_B=1; 
else 
A_B=0;
a=a<<1;
delay1();
CP=0;
delay1();
CP=1;
delay1();
}

RS=1;
delay(3);
E=0;
delay(3);
E=1;
delay(3);
E=0;
delay(3);

}

void init()//初始化
{
uchar i;
CP=1;
A_B=1;
delay(15);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
write_Directive(0x01);
write_Directive(0x02);///初始化后数据地址为0x80;即第一行,第一个位置
write_Directive(0x0c);
write_Directive(0x80+0x40);//第二行第一位地址
for(i=0;i<16;i++)
{
write_Data(char_char_1[i]);//显示字符串" www.mdizi.com "
}

}

void Temperature_symbol()//温度符号
{
uchar i;
for(i=0;i<8;i++)
{
write_Directive(0x40+i);//写入温度符号
write_Data(DispTab_2[i]);
}
}

void write_Data_String()//显示时间函数

uchar i;
unsigned int mm;
DispBuf[0]=temp/10000;//显示百位
mm=temp%10000;

DispBuf[1]=mm/1000;//显示十位
mm=mm%1000;

DispBuf[2]=mm/100;//显示个位
mm=mm%100;

DispBuf[3]=mm/10;//显示小数点:0.001
DispBuf[4]=mm%10;//显示小数点:0.0001


i=DispBuf[0];
DispBuf[0]=DispTab_1[i];//查表,取字符
i=DispBuf[1];
DispBuf[1]=DispTab_1[i];
i=DispBuf[2];
DispBuf[2]=DispTab_1[i];
i=DispBuf[3];
DispBuf[3]=DispTab_1[i];
i=DispBuf[4];
DispBuf[4]=DispTab_1[i];

write_Directive(0x80+0x04);//第一行,第五个位置地址

write_Data(DispBuf[0]);//第一行,第五个位置

write_Data('.');//第一行,第六个位置

write_Data(DispBuf[1]);//第一行,第七个位置 
write_Data(DispBuf[2]);//第一行,第八个位置

write_Data(DispBuf[3]);//第一行,第九个位置

write_Data(DispBuf[4]);//第一行,第十个位置

write_Data('V');

}

void I_O_init()
{
P1M1=0x80;
P1M0=0x80; 
}


void ADC_Conversion()//ADC开始转
{
ADC_CONTR=0x87;
delay(1);
ADC_CONTR=0x8f;
delay(1);
//while((ADC_CONTR==0x8f));
ADC_CONTR=0x87;
delay(1);
}

void ADC_Calculated()//ADC计算
{

float temp1;
float temp2;
uint teMP3;

temp=ADC_DATA;//高8位
temp1=temp;
temp=temp1/256*5*10000;//高8位计算

temp3=ADC_LOW2;//低2位
temp2=temp3;
temp3=temp2/256*5*10000;//低2位计算

temp=temp+temp3;//高8位的计算值+低2位的计算值=实际值


}

void main()
{
init();
I_O_init();//I/O口初始化
Temperature_symbol();//写入温度符号
while(1)
{
ADC_Conversion();//ADC开始转
ADC_Calculated();//ADC计算
write_Data_String();//显示温度
delay(1000);
}
}



关键字:1602  液晶显示  电压表

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2018011437351.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STC12C5406AD 1602液晶显示+LM35DZ 温度计
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
1602
液晶显示
电压表

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved