1602液晶显示的电压表程序

2018-01-14 20:24:00编辑:什么鱼 关键字: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  液晶显示  电压表

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

上一篇:STC12C5406AD 1602液晶显示+LM35DZ 温度计
下一篇:NTC热敏电阻高精度温度计程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机:矩阵键盘和LCD1602

)bsp_segb();; } KEYPORT = 0xF7; if (KEYPORT != 0xF7) { keyvalue = KEYPORT; while(keyvalue == KEYPORT)bsp_segb();; } } return keyvalue; //根据keyvalue的值即可以确定按下的键}二、LCD16021、LCD原理LCD(Liquid Crystal Display):液晶显示器的缩写,一种被动式的显示器,即液晶本身并不发光,而是经液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。  液晶显示器具有功耗低、抗干扰能力强等优点,广泛用在仪器仪表
发表于 2018-07-14 21:15:58

AVRmeg16单片机实现按键控制LCD1602的数据显示

/**********************************   *action: meg16 LCD1602控制程序**********************************/#include<iom16v.h>#include<macros.h>#define uchar unsigned char#define uint unsigned int #define RS_CLR PORTD &= ~(1 << 4)#define RS_SET PORTD |=  (1 << 4) #define
发表于 2018-07-14 20:56:36

单片机:矩阵键盘和LCD1602

();; } KEYPORT = 0xF7; if (KEYPORT != 0xF7) { keyvalue = KEYPORT; while(keyvalue == KEYPORT)bsp_segb();; } } return keyvalue; //根据keyvalue的值即可以确定按下的键}二、LCD16021、LCD原理LCD(Liquid Crystal Display):液晶显示器的缩写,一种被动式的显示器,即液晶本身并不发光,而是经液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。  液晶显示器具有功耗低、抗干扰能力强等优点,广泛用在仪器仪表和控制系统中。2、LCD分类
发表于 2018-07-14 20:55:14

MSP430G2553 1602显示字符

代码:# include "msp430G2553.h"# define uchar unsigned char # define uint unsigned int # define LCD1602_RS_H  P2OUT|=BIT0# define LCD1602_RS_L  P2OUT&=~BIT0# define LCD1602_RW_H  P2OUT|=BIT1# define LCD1602_RW_L  P2OUT&=~BIT1# define LCD1602_EN_H  P2OUT|=BIT2# define LCD1602
发表于 2018-07-14 20:40:26

1602液晶显示屏显示字符

本次实验的效果为实现特定字符在1602液晶显示屏上流动显示所用开发板为普中科技开发板,电路图如下:代码如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned int  sbit rs = P2^6;sbit rw = P2^5;sbit lcden = P2^7;  unsigned char table1[16] = " Pechin Science ";unsigned char table2[27] = "Welcome to the world of
发表于 2018-07-14 20:39:12

DS1302时钟与LCD1602液晶显示

,此过程I/O数据不会变化,而在低电平的过程中I/O数据进行改变;而到后8个时钟会读数据,对于SCLK的控制与前8个时钟相反。对于写数据的过程与读的过程相似只是后面读写的SCLK时钟控制信号不同。DS1302的时钟寄存器如下:    第6位用来选择时钟或RAM,第0位用来做读写的选择,对于第1、2、3为从000到111依次对应秒、分、时、日、月、周、年和控制字地址。LCD1602液晶    LCD1602它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。用它来显示需要的字母、数字和符号等会比数码管和LED点阵都要方便。LCD1602的引脚图如下:    引脚
发表于 2018-06-25 21:56:15
DS1302时钟与LCD1602液晶显示

小广播

何立民专栏

单片机及嵌入式宝典

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

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