/********************************************************************
* 文件名 : 硬件串行12864B v2.0显示.c
* 描述 : 该程序实现了12864以串行的方式进行通信。
***********************************************************************/
#include <STC89C5xRC.H>
#include <stdio.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
uint s=0;
bit V1flag,V2flag,V3flag,A1flag,A2flag,A3flag;
uchar num,Vup=170,Vdw=160,Aup=65,Adw=55;
float Vnum_float,Anum_float,V1=162.1,V2=164.5,V3=153.2,A1=50.5,A2=51.2,A3=64.2;
//uchar str[6];//保证3位整数,一个小数点,一位小数,一位字符串结束标志。共6个单元。如:132.5
sbit CS1=P2^7; //片选信号
sbit SID1=P2^6; //数据信号
sbit SCLK1=P2^5; //时钟信号
sbit CS2=P0^7; //片选信号
sbit SID2=P0^6; //数据信号
sbit SCLK2=P0^5; //时钟信号
sbit CS3=P3^7; //片选信号
sbit SID3=P3^6; //数据信号
sbit SCLK3=P3^5; //时钟信号
/***********************************************************************
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置
**********************************************************************/
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : TimeInit()
* 功能 : 定时200ms,实现没隔200ms更新一次显示数据。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void TimeInit()
{
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;;
EA=1;
ET0=1;
TR0=1;
}
void Time0Int() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;;
s++;
if(s==20)
{
s=0;
num = rand()%10;
Vnum_float=num*0.1;
Anum_float=num*0.01;
if(V1>Vup)
V1flag=1;
if(V1<Vdw)
V1flag=0;
if(V1flag==1)
V1=V1-Vnum_float;
else
V1=V1+Vnum_float;
if(V2>Vup)
V2flag=1;
if(V2<Vdw)
V2flag=0;
if(V2flag==1)
V2=V2-Vnum_float;
else
V2=V2+Vnum_float;
if(V3>Vup)
V3flag=1;
if(V3<Vdw)
V3flag=0;
if(V3flag==1)
V3=V3-Vnum_float;
else
V3=V3+Vnum_float;
if(A1>Aup)
A1flag=1;
if(A1<Adw)
A1flag=0;
if(A1flag==1)
A1=A1-Anum_float;
else
A1=A1+Anum_float;
if(A2>Aup)
A2flag=1;
if(A2<Adw)
A2flag=0;
if(A2flag==1)
A2=A2-Anum_float;
else
A2=A2+Anum_float;
if(A3>Aup)
A3flag=1;
if(A3<Adw)
A3flag=0;
if(A3flag==1)
A3=A3-Anum_float;
else
A3=A3+Anum_float;
}
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte1(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID1 = 1;
}
else
{
SID1 = 0;
}
SCLK1 = 0;
SCLK1 = 1;
}
}
void sendbyte2(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID2 = 1;
}
else
{
SID2 = 0;
}
SCLK2 = 0;
SCLK2 = 1;
}
}
void sendbyte3(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID3 = 1;
}
else
{
SID3 = 0;
}
SCLK3 = 0;
SCLK3 = 1;
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode,uchar y)
{
// CS1 = 1; 引脚直接接VCC
switch(y)
{
case 1:sendbyte1(0xf8); sendbyte1(cmdcode & 0xf0); sendbyte1((cmdcode << 4) & 0xf0); delay(2);break;
case 2:sendbyte2(0xf8); sendbyte2(cmdcode & 0xf0); sendbyte2((cmdcode << 4) & 0xf0); delay(2);break;
case 3:sendbyte3(0xf8); sendbyte3(cmdcode & 0xf0); sendbyte3((cmdcode << 4) & 0xf0); delay(2);break;
default:
break;
}
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata,uchar y)
{
// CS1 = 1; 引脚直接接VCC
switch(y)
{
case 1: sendbyte1(0xfa); sendbyte1(Dispdata & 0xf0); sendbyte1((Dispdata << 4) & 0xf0);delay(2);break;
case 2: sendbyte2(0xfa); sendbyte2(Dispdata & 0xf0); sendbyte2((Dispdata << 4) & 0xf0);delay(2);break;
case 3: sendbyte3(0xfa); sendbyte3(Dispdata & 0xf0); sendbyte3((Dispdata << 4) & 0xf0);delay(2);break;
default:
break;
}
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{
delay(2000);
write_com(0x30,1);
write_com(0x30,2);
write_com(0x30,3);
delay(50);
write_com(0x0c,1);
write_com(0x0c,2);
write_com(0x0c,3);
delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s,uchar y)
{
while(*s > 0)
{
write_data(*s,y);
s++;
delay(50);
}
}
/********************************************************************
* 名称 : numdisp()
* 功能 : 将浮点数转换成的字符串数组进行显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void numdispV(float V,uchar y)
{
uchar i;
uchar str[6];
sprintf(str, " %0.1f" , V);
for(i=0;i<6;i++)
{
write_data(str[i],y);
delay(50);
}
}
void numdispA(float A,uchar y)
{
uchar i;
uchar str[7];
sprintf(str, " %0.2f" , A);
for(i=0;i<7;i++)
{
write_data(str[i],y);
delay(50);
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
//注意,如果有“数”这个字,会出现乱码。
//注意,如果有“数”这个字,会出现乱码。
//注意,如果有“数”这个字,会出现乱码。
//注意,如果有“数”这个字,会出现乱码。
***********************************************************************/
void FLOOR3()
{
write_com(0x03,3);
delay(50);
write_com(0x80,3);
hzkdis("电动汽车与电网互",3);
write_com(0x90,3);
hzkdis("动停车场:Floor3",3);
write_com(0x88,3);
hzkdis("充电车辆: 3 辆",3);
}
void FLOOR2()
{
write_com(0x03,2);
delay(50);
write_com(0x80,2);
hzkdis("电动汽车与电网互",2);
write_com(0x90,2);
hzkdis("动停车场:Floor2",2);
write_com(0x88,2);
hzkdis("充电车辆: 5 辆",2);
}
void FLOOR1()
{
write_com(0x03,1);
delay(50);
write_com(0x80,1);
hzkdis("电动汽车与电网互",1);
write_com(0x90,1);
hzkdis("动停车场:Floor1",1);
write_com(0x88,1);
hzkdis("充电车辆: 8 辆",1);
}
void display3()
{
write_com(0x98,3);
numdispV(V3,3);
write_com(0x9b,3);
hzkdis("V",3);
write_com(0x9c,3);
numdispA(A3,3);
write_com(0x9f,3);
hzkdis("A",3);
}
void display2()
{
write_com(0x98,2);
numdispV(V2,2);
write_com(0x9b,2);
hzkdis("V",2);
write_com(0x9c,2);
numdispA(A2,2);
write_com(0x9f,2);
hzkdis("A",2);
}
void display1()
{
write_com(0x98,1);
numdispV(V1,1);
write_c
评论0