📄 lcdtst.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <math.h>
#include <float.h>
#include <hzk.h> //存放汉字字模,自定义 纵向取模,字节倒续,下同。
#include <ASIIC.h> //存放ASIIC字模库 无需改动
#include <picture.h> //存放图像字模库 自定义图像,图片格式 前两个数值为图片的宽度和高度
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
//ds12887相关
#define ds_second XBYTE[0xa000] //12887秒寄存器
#define ds_secondal XBYTE[0xa001]//12887秒报警值寄存器
#define ds_minute XBYTE[0xa002] //12887分钟寄存器
#define ds_minuteal XBYTE[0xa003]//12887分钟报警寄存器
#define ds_hour XBYTE[0xa004] //12887小时寄存器
#define ds_houral XBYTE[0xa005] //12887时报警寄存器
#define ds_dayweek XBYTE[0xa006] //12887星期寄存器
#define ds_daymonth XBYTE[0xa007]//12887日期寄存器
#define ds_month XBYTE[0xa008] //12887月寄存器
#define ds_year XBYTE[0xa009] //12887年寄存器
#define ds_areg XBYTE[0xa00a] //12887 a寄存器
#define ds_breg XBYTE[0xa00b] //12887 b寄存器
#define ds_creg XBYTE[0xa00c] //12887 c寄存器
#define ds_dreg XBYTE[0xa00d] //12887 d寄存器
//液晶相关
#define lcddir1 XBYTE[0xC002] //定义液晶1指令寄存器地址
#define lcddir2 XBYTE[0xC004] //定义液晶2指令寄存器地址
#define lcddir12 XBYTE[0x7F5B] //液晶1、2指令寄存器地址
#define lcddr1 XBYTE[0xC003] //定义液晶1数据寄存器地址
#define lcddr2 XBYTE[0xC005] //定义液晶2数据寄存器地址
#define lcddr12 XBYTE[0x7F5F] //定义液晶12数据寄存器地址
//7279相关
sbit dat=P1^2; //7279数据线
sbit clk=P1^1; //7279时钟线
sbit cs=P1^0; //7279选通线
uchar bdata temp;
sbit temp_0=temp^0;
sbit temp_7=temp^7;
//时间调整全局变量
/*uchar data s_sec;
uchar data s_min;
uchar data s_hou;
uchar data s_dat;
uchar data s_mon;
uchar data s_yea;
uchar data s_day;*/
//时间调整时用到的临时变量
uchar data temp1;
uchar data temp2;
uchar data temp3;
//电压寄存器
uchar data voltage1;
uchar data voltage2;
uchar data voltage3;
//标志位
uchar bdata flag;
sbit flag_0 = flag^0; /*0:报警开关已关闭;1:报警开关已打开*/
sbit flag_1 = flag^1; /*0:波特率为9600;1:4800*/
sbit flag_2 = flag^2; //备份flag_1
sbit flag_3 = flag^3; /*下位机发送标志 1: 允许发送 0:禁止发送*/
sbit flag_4 = flag^4; /* 1:main函数写液晶 0:空闲*/
sbit flag_5 = flag^5; /* 1:7135有新数据*/
sbit flag_6 = flag^6; /*1: 收到上位机的报警确认信号。0:未收到报警确认信号*/
uchar data tem_alm; //报警温度
uchar data t_temalm;
uchar data tem; // 温度寄存器
//uchar data bote;
uchar data state_s;//串口状态
/*state_s=0x00:等待状态,接收控制符
state_s=0x01:调时状态,接收hour
state_s=0x11:调时状态,接收minute
state_s=0x21:调时状态,接收second
state_s=0x02:调日期状态,接收year
state_s=0x12:调日期状态,接收month
state_s=0x22:调日期状态,接收date
*/
/* 和上位机的接口命令:
11H:上位机发送此指令,说明要对下位机进行时间调整。接下来的三个
字节为时分秒数据。
22H:上位机发送此指令,说明要对下位机进行日期调整。接下来的三个
字节为年月日数据。
33H:上位机发送此指令,说明要对下位机进行星期调整。接下来的一个
字节为星期数据。
44H:上位机发送此指令,说明要对下位机进行报警温度调整。接下来的
一个字节为报警温度数据。
55H:上位机发送此指令,以使下位机开始传送温度数据。
66H;上位机发送此指令,以使下位机停止传送温度数据。
77H: 上位机发送此指令,以确认接受到报警信号。
FFH: 下位机发送此指令,向上位机温度报警。
*/
uchar data state;
/*state=0:主画面,显示时间和温度及一些标志
state=1: 一级菜单,1反色。
state=2: 一级菜单,2反色。
state=3: 一级菜单,3反色。
state=4: 一级菜单,4反色。
state=5: 时间日期星期调整菜单,1反色
state=6: 时间日期星期调整菜单,2反色
state=7: 时间日期星期调整菜单,3反色
state=0x08:设置报警温度,第1位反色
state=0x18:设置报警温度,第2位反色
state=9: 设置波特率
state=0x0a:设置日期,第1位反色
state=0x1a:设置日期,第2位反色
state=0x2a:设置日期,第3位反色
state=0x3a:设置日期,第4位反色
state=0x4a:设置日期,第5位反色
state=0x5a:设置日期,第6位反色
state=0x0b:设置时间,第1位反色
state=0x1b:设置时间,第2位反色
state=0x2b:设置时间,第3位反色
state=0x3b:设置时间,第4位反色
state=0x4b:设置时间,第5位反色
state=0x5b:设置时间,第6位反色
*/
//键值
#define OK 0x0a
#define UP 0x0e
#define DOWN 0x0f
#define LEFT 0x0b
#define RIGHT 0x0c
#define CANCEL 0x0d
#define ZERO 0x00
#define ONE 0x01
#define TWO 0x02
#define THREE 0x03
#define FOUR 0x04
#define FIVE 0x05
#define SIX 0x06
#define SEVEN 0x07
#define EIGHT 0x08
#define NINE 0x09
//-------------------------------------------------------------------------
uchar code number[16]="0123456789abcdef";//查表用
uchar data date[]="00-00-00"; //定义日期格式
uchar data time[]="00:00:00"; //定义时间格式
//-------------------------------------------------------------------------
//+++++++++++++++++++++++++++++++
//7279专用函数
void send_data(uchar data_out)
//****************************
//向7279发送一个字节的数据
//被发送数据放于全局变量data_out中
//****************************
{
uchar bit_count;
uchar data i;
temp=data_out;
cs=0;
for(i=0;i<=25;i++)
nop;
for(bit_count=0;bit_count<8;bit_count++)
{
dat=temp_7;
nop;
nop;
clk=1;
for(i=0;i<=6;i++)
nop;
clk=0;
for(i=0;i<=6;i++)
nop;
temp<<=1;
}
dat=0;
return;
}
uchar receive_data(void)
//********************************
//从7279读入一个字节的数据
//读入的数据存放于全局变量data_in中
//读入的这个数据是原始的扫描码,并非键码
//********************************
{
uchar data i;
uchar data bit_count;
dat=1;
for(i=0;i<25;i++)
nop;
for(bit_count=0;bit_count<8;bit_count++)
{
temp<<=1;
clk=1;
for(i=0;i<7;i++)
nop;
temp_0=dat;
clk=0;
for(i=0;i<6;i++)
nop;
}
cs=1;
return(temp);
}
//-------------------------------------
//获取键值
uchar getkey()
{uchar temp;
send_data(0x15);
temp=receive_data();
/*if(temp>=0x00&&temp<=0x03)
temp=temp;
else if(temp>=0x08&&temp<=0x0b)
temp=temp-0x04;
else if(temp>=0x10&&temp<=0x13)
temp=temp-0x08;
else if(temp>=0x18&&temp<=0x1b)
temp=temp-0x0c;*/
switch(temp)
{case 0x00: temp = 7;
break;
case 0x01: temp = 4;
break;
case 0x02: temp = 5;
break;
case 0x03: temp = 6;
break;
case 0x08: temp = 1;
break;
case 0x09: temp = 2;
break;
case 0x0a: temp = 3;
break;
case 0x0b: temp = 0x0a;
break;
case 0x10: temp = 0x0b;break;
case 0x11: temp = 0x0c;break;
case 0x12: temp = 0x0d;break;
case 0x13: temp = 0x0e;break;
case 0x18: temp = 0x0f;break;
case 0x19: temp = 0;
break;
case 0x1a: temp = 9;
break;
case 0x1b: temp = 8;
break;
}
return(temp);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//液晶专用函数
//---------------------
//等待液晶空闲状态
void waitlcd1free(void)
{while(lcddir1&0x80);
return;
}
void waitlcd2free(void)
{while(lcddir2&0x80);
return;
}
//----------------------
//写lcd1数据寄存器
void lcd1datw(uchar dat)
{waitlcd1free();
lcddr1=dat;
return;
}
//写lcd2数据寄存器
void lcd2datw(uchar dat)
{waitlcd2free();
lcddr2=dat;
return;
}
//---------------------
//写lcd1指令寄存器
void lcd1cmdw(uchar cmd)
{waitlcd1free();
lcddir1=cmd;
return;
}
//--------------------
//写lcd2命令寄存器
void lcd2cmdw(uchar cmd)
{waitlcd2free();
lcddir2=cmd;
return;
}
//--------------------
//向lcd第page页,第column列写一个字节
//page 0-7 column 0-127
void lcdwr(uchar page,uchar column,uchar byte)
{if(column<64)
{lcd1cmdw(0xb8|page);
lcd1cmdw(0x40|column);
lcd1datw(byte);
}
else
{lcd2cmdw(0xb8|page);
lcd2cmdw(0x40|column);
lcd2datw(byte);
}
return;
}
//----------------------
//设置起始行 line:0-63
void setstartline(uchar line)
{lcd1cmdw(0xc0|line);
lcd2cmdw(0xc0|line);
return;
}
//读出指定页。指定列的数据
//page 0-7,column:0-127
uchar lcdrd(uchar page,uchar column)
{uchar temp;
if(column<64)
{lcd1cmdw(0xb8|page);
lcd1cmdw(0x40|column);
waitlcd1free();
temp=lcddr1;
waitlcd1free();
temp=lcddr1;
return(temp);}
else
{lcd2cmdw(0xb8|page);
lcd2cmdw(0x40|column);
waitlcd2free();
temp=lcddr2;
waitlcd2free();
temp=lcddr2;
return(temp);}
}
//----------------------
//清屏
void lcdcls()
{uchar page,column;
for(page=0;page<=7;page++)
{for(column=0;column<=127;column++)
lcdwr(page,column,0x00);
}
return;
}
//-----------------------
//开关屏 0:关 1:开
void setonoff(uchar state)
{lcd1cmdw(0x3e|state);
lcd2cmdw(0x3e|state);
return;
}
//---------------------
void initlcd()
{setonoff(1);
lcdcls();
setstartline(0x00);
return;
}
//--------------------------------------------------------------
//显示8*8点阵
//旋转90度:字模被竖着切分
//page:页(0-7), column: 列(0-127)
//address : 字模区首地址
void Show88(unsigned char page,unsigned char column,unsigned char *address)
{uchar i;
for(i=0;i<8;i++)
{if(column==127) return;
lcdwr(page,column,*address);
column++;
address++;
}
return;
}
//反色显示
void Show88f(unsigned char page,unsigned char column,unsigned char *address)
{uchar i;
uchar tem;
for(i=0;i<8;i++)
{if(column==127) return;
tem = *address;
tem = tem^0xff;
lcdwr(page,column,tem);
column++;
address++;
}
return;
}
//----------------------------------------------------
//显示一个8×16asiic码
//character是asiic码
void showchar(unsigned char page,unsigned char column,unsigned char character)
{
Show88(page,column,ASCII816[character-0x20]);
Show88(page+1,column,ASCII816[character-0x20]+8);
}
void showcharf(unsigned char page,unsigned char column,unsigned char character)
{
Show88f(page,column,ASCII816[character-0x20]);
Show88f(page+1,column,ASCII816[character-0x20]+8);
}
//----------------------------
//显示一个16×16汉字
void showhz(unsigned char page,unsigned char column,unsigned char hzcode)
{Show88(page,column,HZTable[hzcode]);
Show88(page,column+8,HZTable[hzcode]+8);
Show88(page+1,column,HZTable[hzcode]+16);
Show88(page+1,column+8,HZTable[hzcode]+24);
}
void showhzf(unsigned char page,unsigned char column,unsigned char hzcode)
{Show88f(page,column,HZTable[hzcode]);
Show88f(page,column+8,HZTable[hzcode]+8);
Show88f(page+1,column,HZTable[hzcode]+16);
Show88f(page+1,column+8,HZTable[hzcode]+24);
}
//--------------------------------------------------------------------
//显示一行asiic字符串
//page:起始页号 column起始行号 str长度不超过16
showstr(uchar page,uchar column,uchar *str)
{while(*str)
{showchar(page,column,*str++);
column+=8;}
return;
}
/*-------------------------------------------------------------------------------
函数: void point(unsigned char x,unsigned char y,unsigned char t)
功能: 在(x,y)处打点 t方式:0:亮 1:灭 2:与原来相反
x:0-127 y:0-63
---------------------------------------------------------------------------------*/
void point(uchar x,uchar y,uchar t)
{uchar data page,column,temp;
page=y/8;
column=x;
temp=lcdrd(page,column);
switch(t)
{case 0: temp|=(0x01<<(y%8));break;
case 1: temp&=!(0x01<<(y%8));break;
case 2: temp^=(0x01<<(y%8));break;
default:break;
}
lcdwr(page,column,temp);
return;
}
//画圆 x 0-127 y 0-64 r 半径, t:方式 0 点亮, 1 灭, 2 与原来相反
void circle(uchar x,uchar y,uchar r,uchar t)
{uchar i,j,m,n;
for(i=0;i<=127;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -