📄 lcd.c
字号:
//*************************************************************************
//**模 块 名:LCD.c
//**说 明:液晶功能函数
//*************************************************************************
#include <AT89x55.H>
#include <INTRINS.H>
#include "main.h"
//*************************************************************************
//**函 数 名:Write_Com1
//**输 入:
//** cmdcode:命令
//**输 出:无
//**功能描述:向液晶左屏写命令
//*************************************************************************
void Write_Com1(uchar cmdcode)
{
//向液晶送命令
WR_CMD1=cmdcode;
//判断液晶是否忙
while(RD_CMD1>0x7f);
}
//*************************************************************************
//**函 数 名:Write_Com2
//**输 入:
//** cmdcode:命令
//**输 出:无
//**功能描述:
//** 1.向液晶右屏写命令
//*************************************************************************
void Write_Com2(uchar cmdcode)
{
//向液晶送命令
WR_CMD2=cmdcode;
//判断液晶是否忙
while(RD_CMD2>0x7f);
}
//*************************************************************************
//**函 数 名:Write_Data1
//**输 入:
//** Dsipdata:数据
//**输 出:无
//**功能描述:
//** 1.向液晶左屏写数据
//*************************************************************************
void Write_Data1(uchar Dispdata)
{
//向液晶送数据
WR_DAT1=Dispdata;
//判断液晶是否忙
while(RD_CMD1>0x7f);
}
//*************************************************************************
//**函 数 名:Write_Data2
//**输 入:
//** Dsipdata:数据
//**输 出:无
//**功能描述:
//** 1.向液晶右屏写数据
//*************************************************************************
void Write_Data2(uchar Dispdata)
{
//向液晶送数据
WR_DAT2=Dispdata;
//判断液晶是否忙
while(RD_CMD2>0x7f);
}
//*************************************************************************
//**函 数 名:Init_LCD
//**输 入:无
//**输 出:无
//**功能描述:
//** 1.液晶初始化
//*************************************************************************
void Init_LCD()
{
//关左屏
Write_Com1(Disp_Off);
//关右屏
Write_Com2(Disp_Off);
//左屏页地址清0
Write_Com1(Page_Add+0);
//右屏页地址清0
Write_Com2(Page_Add+0);
//左屏起始行清0
Write_Com1(Start_Line+0);
//右屏起始行清0
Write_Com2(Start_Line+0);
//左屏列地址清0
Write_Com1(Col_Add+0);
//右屏列地址清0
Write_Com2(Col_Add+0);
//开左屏
Write_Com1(Disp_On);
//开右屏
Write_Com2(Disp_On);
}
//*************************************************************************
//**函 数 名:Clr_Scr
//**输 入:
//** DispStyle:清屏的类型
//** DispStyle=1 向液晶送0x00
//** DispStyle=2 向液晶送0xFF
//**输 出:无
//**功能描述:
//** 1.液晶清屏
//*************************************************************************
void Clr_Scr(uchar DispStyle)
{
//循环变量
uchar xdata j,k;
//初始化液晶
Init_LCD();
Write_Com1(Page_Add + 0);
Write_Com1(Col_Add + 0);
//循环向液晶送数
for(k = 0;k < 8;k++)
{
Write_Com1(Page_Add + k);
for(j = 0;j < 64;j++ )
{
Write_Data1(DispStyle);
}
}
Write_Com2(Page_Add + 0);
Write_Com2(Col_Add + 0);
//循环向液晶送数
for(k = 0;k < 8;k++)
{
Write_Com2(Page_Add + k);
for(j = 0;j < 64;j++ )
{
Write_Data2(DispStyle);
}
}
}
//*************************************************************************
//**函 数 名:HzDisp1216
//**输 入:
//** pag :汉字显示的行地址
//** col :汉字显示的列地址
//** *hzk :汉字数组的首地址
//** fan :是否反白显示
//**输 出:无
//**功能描述:
//** 1.在指定位置显示12*16点阵的汉字
//*************************************************************************
void HzDisp1216(uchar pag,uchar col, uchar code *hzk,bit fan)
{
//循环变量
uchar xdata j,i;
//临时变量
uchar xdata temp;
//是否跨区
bit flag;
temp = col;
for(j = 0;j < 2;j++)
{
col = temp;
Write_Com1(Page_Add + pag + j);
Write_Com2(Page_Add + pag + j);
if(col<64)
{
flag=0;
Write_Com1(Col_Add + col);
}
else
{
flag=1;
Write_Com2(Col_Add + col - 64);
}
for(i = 0;i < 12;i++)
{
if(flag == 1)
{
if(fan) Write_Data2(~hzk[12 * j + i]);
else
Write_Data2(hzk[12 * j + i]);
}
if(flag == 0)
{
if(fan) Write_Data1(~hzk[12 * j + i]);
else
Write_Data1(hzk[12 * j + i]);
}
col++;
if((col >= 64) && (flag == 0))
{
flag = 1;
Write_Com2(Col_Add + col - 64);
}
}
}
}
//*************************************************************************
//**函 数 名:AscDisp68
//**输 入:
//** pag :汉字显示的行地址
//** col :汉字显示的列地址
//** *hzk :汉字数组的首地址
//** fan :是否反白显示
//**输 出:无
//**功能描述:
//** 1.显示8*16的符号
//*************************************************************************
void Asc_Disp68(uchar pag,uchar col, uchar code *hzk, bit fan)
{
//循环变量
uchar xdata i;
//临时变量
uchar xdata temp;
//是否跨区
bit flag;
temp = col;
col = temp;
//设置字符显示的行地址(左屏)
Write_Com1(Page_Add + pag);
//设置字符显示的行地址(右屏)
Write_Com2(Page_Add + pag);
if(col < 64)
{
//flag=0,表示此字符在左屏显示
flag = 0;
//列地址小于64设置左屏的列地址
Write_Com1(Col_Add + col);
}
else
{
flag = 1;
//列地址小于64设置左屏的列地址
Write_Com2(Col_Add + col - 64);
}
//循环6次向液晶送
for(i = 0;i < 6;i++)
{
if(flag == 1)
{
if(fan)
//fan为1表示反白显示
Write_Data2(~hzk[i]);
else
//fan为0表示正常显示
Write_Data2(hzk[i]);
}
if(flag == 0)
{
//flag为0表示写右屏
if(fan)
//fan为1表示反白显示
Write_Data1(~hzk[i]);
else
//fan为0表示正常显示
Write_Data1(hzk[i]);
}
//列地址加1
col++;
//如果列地址大于64并且现在正在写左屏时
if((col >= 64) && (flag == 0))
{
//置写右屏的标志位
flag = 1;
//向右屏写数据
Write_Com2(Col_Add + col - 64);
}
}
}
//*************************************************************************
//**函 数 名:Dis_Clock
//**输 入:无
//**输 出:无
//**功能描述:
//** 1.在指定的位置显示年月日时分秒
//*************************************************************************
void Dis_Clock()
{
uchar xdata a,b;
//在指定位置显示年月日之间的“/”
Asc_Disp68(7,12,asc_xiexian,0);
Asc_Disp68(7,30,asc_xiexian,0);
//在指定位置显示时分秒之间的“:”
Asc_Disp68(7,66,asc_maohao,0);
Asc_Disp68(7,84,asc_maohao,0);
//显示年
a=Clock_Time[6]>>4;
b=Clock_Time[6]&0x0f;
Asc_Disp68(7,0,(asc_num+6*a),0);
Asc_Disp68(7,6,(asc_num+6*b),0);
//显示月
a=Clock_Time[5]>>4;
b=Clock_Time[5]&0x0f;
Asc_Disp68(7,18,(asc_num+6*a),0);
Asc_Disp68(7,24,(asc_num+6*b),0);
//显示日
a=Clock_Time[4]>>4;
b=Clock_Time[4]&0x0f;
Asc_Disp68(7,36,(asc_num+6*a),0);
Asc_Disp68(7,42,(asc_num+6*b),0);
//显示时
a=Clock_Time[2]>>4;
b=Clock_Time[2]&0x0f;
Asc_Disp68(7,54,(asc_num+6*a),0);
Asc_Disp68(7,60,(asc_num+6*b),0);
//显示分
a=Clock_Time[1]>>4;
b=Clock_Time[1]&0x0f;
Asc_Disp68(7,72,(asc_num+6*a),0);
Asc_Disp68(7,78,(asc_num+6*b),0);
//显示秒
a=Clock_Time[0]>>4;
b=Clock_Time[0]&0x0f;
Asc_Disp68(7,90,(asc_num+6*a),0);
Asc_Disp68(7,96,(asc_num+6*b),0);
}
//*************************************************************************
//**函 数 名:DISP_Information
//**输 入:
//** aa:报警区号
//* bb:报警设备类型
//** cc:信息显示的位置
//** dd:报警月份
//** ee:报警日期
//** ff:报警小时
//** gg:报警分钟
//** hh:报警类型
//**输 出:无
//**功能描述:
//** 1.清液晶显示
//*************************************************************************
void Disp_Qu_Device(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff,uchar gg,uchar hh)
{
uchar xdata a,b;
//显示报警的区号
switch(aa)
{
case 1:HzDisp1216(cc*3,16,hz_yi,0);
HzDisp1216(cc*3,28,hz_qu,0);
break;
case 2:HzDisp1216(cc*3,16,hz_er,0);
HzDisp1216(cc*3,28,hz_qu,0);
break;
case 3:HzDisp1216(cc*3,16,hz_san,0);
HzDisp1216(cc*3,28,hz_qu,0);
break;
case 4:HzDisp1216(cc*3,16,hz_si,0);
HzDisp1216(cc*3,28,hz_qu,0);
break;
default:break;
}
//显示报警的设备类型
switch(bb)
{
case 1:HzDisp1216(cc*3,44,hz_gan,0);
HzDisp1216(cc*3,83,hz_yan1,0);
break;
case 2:HzDisp1216(cc*3,44,hz_gan,0);
HzDisp1216(cc*3,83,hz_wen,0);
break;
case 3:HzDisp1216(cc*3,44,hz_sheng,0);
HzDisp1216(cc*3,83,hz_guang,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -