📄 lcd1.c
字号:
#include <reg52.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void I2C_Init(void);
void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count);
void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count);
void FeedDog(void);
uchar Scan_Key(void);
void v_Set1302(uchar *pSecDa);
void v_Get1302(void);
extern uchar code wordlattic[];//16*16
extern uchar code wordlattic1[]; //24*24
extern uchar code wordlattic11[]; //48*48
extern uchar code wordlattic111[];//12*12
extern uchar curtime1[7]; //秒 分 时 日 月 星期 年
uchar rbuf[32];
uchar receive[8];
uchar start=0;//接收开始标志
uchar re_num=0,keyTemp=100;
uchar receiveFinish=0;//接收结束,在main调用
uchar code systab[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};//系统初始化参数
uchar code scrtab[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};//设置显示区域参数
uchar code abc[8]={0x01,0x07,0x07,0x07,0x07,0x01,0x01,0x01};
//uchar wd[32];
sbit CS = P1^2;//液晶
sbit A0 = P1^3;
sbit WR1 = P3^6;
sbit RD1 = P3^7;
sbit RES = P1^4;
sbit P10 = P1^0;//与2051相连的两个引脚,用来检测电磁电量的
sbit P11 = P1^1;
sbit Fmq = P3^5;//蜂鸣器
void wr_or(uchar x)
{
uchar idata i;
CS = 0;
A0 = 1;
for(i=0;i<2;i++)
{ ; ; }
WR1 = 0;
for(i=0;i<2;i++)
{ ; ; }
P0 = x;
for(i=0;i<4;i++)
{ ; ; }
WR1 = 1;
for(i= 0;i<2;i++)
{ ; ; }
CS = 1;
}
//写入数据参数
void wr_data (uchar x)
{
uchar idata i;
CS = 0;
A0 = 0;
for(i=0;i<2;i++)
{ ; ; }
WR1 = 0;
for(i=0;i<2;i++)
{ ; ; }
P0 = x;
for(i=0;i<4;i++)
{ ; ; }
WR1 = 1;
for(i=0;i<2;i++)
{ ; ; }
CS = 1;
}
void Ram_Init1(void)//清屏
{
uint idata j;
wr_or(0x4c); /*光标右移*/
wr_or(0x46); /*设置光标地址*/
wr_data(0x00);
wr_data(0x00);
wr_or(0x42);
for(j=0;j<9600;j++)
{wr_data(0x00);}
}
void LCD_Init(void)//初始化寄存器设置
{
uchar idata i,x,y;
wr_or(0x40); /*系统初始化命令*/
for(i=0;i<8;i++) /*写入10个参数*/
{
x = systab[i];
//for(j=0;j<2;j++){;;}
wr_data(x);
}
wr_or(0x44); /*设置显示区域,卷动*/
for(i=0;i<10;i++)
{
y = scrtab[i];
//for(j=0;j<2;j++){;;}
wr_data(y);
}
wr_or(0x5a); //显示画面水平移动
wr_data(0x00);
wr_or(0x5b); //设置显示方式为图形
wr_data(0x0c);
Ram_Init1();
wr_or(0x59); //打开显示
wr_data(0x04);
}
void Displayz(uchar x,uchar y,uchar wordcode)
{
uchar idata i,j;
uint idata high,low;
uchar idata x1,y1;
high=((x-1)*40+y-1)/256;//计算要发送的高低位地址
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
for(j=0;j<2;j++)
{
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<16;i++)
{wr_data(wordlattic[wordcode*32+i*2+j]);}
}
}
void Display(uchar x,uchar y)
{
uchar idata ii,jj;
uint idata high,low;
uchar idata x1,y1;
high=((x-1)*40+y-1)/256;//计算要发送的高低位地址
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
for(jj=0;jj<2;jj++)
{
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+jj);
wr_data(y1);
wr_or(0x42);
for(ii=0;ii<16;ii++)
{wr_data(rbuf[ii*2+jj]);}
}
}
//=============================反面显示汉字函数=====================
//功能:在指定的位置写入反面相应的汉字
//入口:要显示数据的地址和汉字代码
//x为显示的行数。从1开始到30,y为显示的列数,从1到40
//出口:NONE
//=================================================================
void Displayf(uchar x,uchar y,uchar wordcode)
{
uchar idata i,j;
uint idata high,low;
uchar idata x1,y1;
high=((x-1)*40+y-1)/256;//计算要发送的高低位地址
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
for(j=0;j<2;j++)
{
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<16;i++)
{wr_data(~wordlattic[wordcode*32+i*2+j]);}
}
}
//=============================正常显示汉字函数=====================
//功能:在指定的位置写入正常相应的汉字 24*24点阵
//入口:要显示数据的地址和汉字代码
//x为显示的行数。从1开始到30,y为显示的列数,从1到40
//出口:NONE
//=================================================================
void Displayz1(uchar x,uchar y,uchar wordcode)
{
uchar idata i,j;
uint idata high,low;
uchar idata x1,y1;
high=((x-1)*40+y-1)/256;//计算要发送的高低位地址
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
for(j=0;j<3;j++)
{
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<24;i++)
{wr_data(wordlattic1[wordcode*72+i*3+j]);}
}
}
//=============================正常显示汉字函数=====================
//功能:在指定的位置写入正常相应的汉字 48*48点阵
//入口:要显示数据的地址和汉字代码
//x为显示的行数。从1开始到30,y为显示的列数,从1到40
//出口:NONE
//=================================================================
void Displayz11(uchar x,uchar y,uchar wordcode)
{
uchar idata i,j;
uint idata high,low;
uchar idata x1,y1;
high=((x-1)*40+y-1)/256;//计算要发送的高低位地址
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
for(j=0;j<6;j++)
{
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<48;i++)
{wr_data(wordlattic11[wordcode*288+i*6+j]);}
}
}
//=============================正常显示汉字函数=====================
//功能:在指定的位置写入正常相应的汉字 12*16
//入口:要显示数据的地址和汉字代码
//x为显示的行数。从1开始到30,y为显示的列数,从1到40
//出口:NONE
//=================================================================
void Displayz111(uchar x,uchar y,uchar wordcode)
{
uchar idata i,j;
uint idata high,low;
uchar idata x1,y1;
high=((x-1)*40+y-1)/256;//计算要发送的高低位地址
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
for(j=0;j<2;j++)
{
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<12;i++)
{wr_data(wordlattic111[wordcode*24+i*2+j]);}
}
}
//battery
void Display_Battery(uchar x,uchar y,uchar n)
{
//uchar code batteryBlock1[8]={0x00,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e};
//uchar code batteryBlock2[8]={0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c};
//uchar code batteryBlock3[8]={0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9};
uchar i,j;
uint high,low;
uchar x1,y1,temp=y;
//电池头(30,34)
high=((x-1)*40+y-1)/256;
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<8;i++)
{wr_data(abc[i]);}
//电池块1 (30,35)
if(n>0)
{
// x=18;
//y=temp+3;
y+=3;
high=((x-1)*40+y-1)/256;
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
for(i=0;i<7;i++)
{wr_data(0xf9);}
{wr_data(0x01);}
}
//电池块2 (30,36)
if(n>1)
{
// x=18;
y-=1;
high=((x-1)*40+y-1)/256;
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
// {wr_data(0);}
for(i=0;i<7;i++)
{wr_data(0x7c);}
{wr_data(0);}
}
//电池块3 (30,37)
if(n>2)
{
// x=18;
// y=temp+1;
y -= 1;
high=((x-1)*40+y-1)/256;
low=((x-1)*40+y-1)%256;
x1=(uchar)low;
y1=(uchar)high;
wr_or(0x4f);
wr_or(0x46);
wr_data(x1+j);
wr_data(y1);
wr_or(0x42);
// {wr_data(0);}
for(i=0;i<7;i++)
{wr_data(0x3e);}
{wr_data(0);}
}
}
void xian(uint x1,uint y1,uint x2,uint y2)
{
uint idata high,low,j;
uchar idata x,y;
high=((y1-1)*40+x1-1)/256;//计算要发送的高低位地址
low=((y1-1)*40+x1-1)%256;
x=low;
y=high;
if(y1==y2)
{
wr_or(0x4c);//第1横
wr_or(0x46);
wr_data(x);
wr_data(y);
wr_or(0x42);
for(j=0;j<x2-x1;j++)
wr_data(0xff);
}
if(x1==x2)
{
wr_or(0x4f);//第1竖
wr_or(0x46);
wr_data(x);
wr_data(y);
wr_or(0x42);
for(j=0;j<y2-y1;j++)
wr_data(0x01);
}
}
void biankuang(void)
{
xian(1,10,1,34);
xian(39,10,39,34);
xian(2,10,40,10);
xian(2,34,40,34);
xian(1,42,1,230);
xian(39,42,39,230);
xian(2,42,40,42);
xian(2,230,40,230);
xian(2,74,40,74);
}
void Battery(uchar n)
{
xian(35,16,35,28);
xian(38,16,38,28);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -