×
单片机 > 单片机程序设计 > 详情

1602液晶显示的电压表程序

发布时间:2020-06-18 发布时间:
|

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  液晶显示  电压表 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义