📄 lcd.c
字号:
*
*
******************************************************************************************/
/******************************************************************************************
*函数名: init_24c02
*参数: 无
*返回值: 无
*描述: IIC初始化,在MAIN中首先调用
*编写: 李满庭
*版本信息: V1.0 2004年7月8日
******************************************************************************************/
void init_24c02()
{
scl_IC=0;
stop();
}
/******************************************************************************************
*函数名: start
*参数: 无
*返回值: 无
*描述: 启动读写时序
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
void start()
{
sda_IC=1;
delay1();
scl_IC=1;
delay1();
sda_IC=0;
delay1();
}
/******************************************************************************************
*函数名: stop
*参数: 无
*返回值: 无
*描述: 停止操作
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
void stop()
{
sda_IC=0;
delay1();
scl_IC=1;
delay1();
sda_IC=1;
delay1();
}
/******************************************************************************************
*函数名: ack
*参数: 无
*返回值: 无
*描述: 应答子程序
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************
void ack()
{
sda_IC=0;
clock();
sda_IC=0;
}
/******************************************************************************************
*函数名: rd_24c02
*参数: 无
*返回值: rd_data
*描述: 接收八位的数据
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
uchar rd_24c02(void)
{
uchar i;
uchar rd_data=0;
for(i=0;i<8;i++)
{
rd_data*=2;
if(clock())
{
rd_data++;
}
}
return(rd_data);
}
/******************************************************************************************
*函数名: send_address
*参数: adr
*返回值: 0 or 1
*描述: 发送八位的字节地址,在此前做一个伪写操作
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
bit send_address(uchar adr)
{
start();
if(send(0XA0))
{
return(send(adr));
}
else
return(0);
}
/******************************************************************************************
*函数名: send
*参数: a
*返回值: 0 or 1
*描述: 八位移位输出
*编写: 李满庭
*版本信息: V1.0 2004年7月8日
******************************************************************************************/
bit send(uchar a)
{
uchar i;
send_data=a;
scl_IC=0;
delay1();
for(i=0;i<8;i++)
{
// sda_IC=(bit)(send_data&0x80);
sda_IC=(bit)(send_data&0x80);
send_data=send_data<<1;
clock();
}
sda_IC=1;
return(~clock());
}
/******************************************************************************************
*函数名: clock
*参数: 无
*返回值: sample
*描述: 时钟,同时返回sda的状态,当要检测2402的应答信号时,只要在调用本函数前先把sda拉高,就可以知道器件有没有回送应答信号
*编写: 李满庭
*版本信息: V1.0 2004年7月8日
******************************************************************************************/
bit clock()
{
bit sample;
scl_IC=1;
delay1();
sample=sda_IC;
scl_IC=0;
delay1();
return(sample);
}
/******************************************************************************************
*函数名: read_byte
*参数: adr_first,num
*返回值: 无
*描述: 读2402函数,采用"随机地址读取"方式,先发一个伪写指导令,指出字节地址
*编写: 李满庭
*版本信息: V1.0 2004年7月8日
******************************************************************************************/
bit read_byte(uchar adr_first,uchar num)
{
uchar i;
for(i=0;i<num;i++)
{
if(send_address(adr_first+i))
{
start();
if(send(0xA1))
{
Pswnum[i]=rd_24c02();
stop();
}
else
{
return(0);
}
}
else
{
stop();
return(0);
}
}
return(1);
}
/******************************************************************************************
*函数名: write_byte
*参数: adr_first,num
*返回值: 无
*描述: 写2402函数,采用字节写入方式
*编写: 李满庭
*版本信息: V1.0 2004年7月9日
******************************************************************************************
bit write_byte(uchar adr_first,uchar num)
{
uchar i;
for(i=0;i<num;i++)
{
if(send_address(adr_first+i)&&send(Pswnum[i]))
{
stop();
delay(100);
}
else
{
return(0);
}
}
return(1);
}
/******************************************************************************************
*函数名: Working
*参数: 无
*返回值: 无
*描述: 工作画面子程序,当用户在开机画面输入正确密码后可进入此画面
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
void Working()
{
// uchar i;
WriteWork(3,8,ZKbdt,3,72,8,0);
WriteWork(205,4,ZKmggls,2,32,5,0);
WriteWork(205,14,ZKguohao,1,16,2,4);
WriteWork(205,15,ZKzhuhai,2,32,2,0);
WriteWork(205,20,ZKkjsy,2,32,8,0);
WriteWork(222,6,ZKcarise_int,1,16,30,0);
// WriteWork(100,7,ZKnum+num*16,1,16,1,0);
}
/******************************************************************************************
*函数名: TurnOnWork
*参数: 无
*返回值: 无
*描述: 开机画面子程序,在此画面用户输入正确密码方可进入工作画面
*编写: 李满庭
*版本信息: V1.0 2004年6月20日
******************************************************************************************/
void TurnOnWork()
{
uchar i,j,k,l;
uchar b;
// ||y是y轴坐标,x是x轴的坐标,*ZiKu首地址,x_size字体宽度,size占字节的个数,num显示个数,空格个数 ||
WriteWork(100,1,ZKqsrmm,2,32,6,0); //显示"请输入密码:"
b=12;
do
{
WriteWork(117,b,ZKheng,1,1,1,0); //显示"_____________"
b++;
}
while(b<18);
//3*4个方框
for(l=0;l<4;l++) //3*4个方框
{ for(k=0;k<3;k++)
{for(j=0;j<2;j++)
{ //显示两行
for(i=0;i<5;i++) //显示一行5个段
WriteWork((30+j*22)+l*45,(20+i)+k*6,ZKheng,1,1,1,0);
};
for(i=0;i<23;i++)
{ //显示左竖
WriteWork((30+i)+l*45,19+k*6,ZKdian_r,1,1,1,0);
};
for(i=0;i<23;i++)
{
WriteWork((30+i)+l*45,25+k*6,ZKdian_l,1,1,1,0); //显示右竖
};
for(i=0;i<23;i++)
{ //显示左竖
WriteWork((30+i)+l*45,19,ZKdian_rr,1,1,1,0);
};
};
};
//1~9的数字,并把这些数字放到每一个小方框里面
for(i=0;i<3;i++)
{
WriteWork(32+i*45,22,ZKnum+i*48,1,16,3,5);
};
//数字0,把此数字放到第四行中间的方框里面
WriteWork(32+3*45,28,ZKnum+144,1,16,1,0);
//确定取消,把确定放到第四行左力方框里面
for(i=0;i<2;i++)
{
WriteWork(33+3*45,20+i*12,ZKOK+i*64,2,32,2,1);
};
}
/******************************************************************************************
*函数名: SetCursor
*参数: Y,X
*返回值: 无
*描述: 设定光标,定出显示位置子程序
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
void SetCursor(uchar Y,uchar X)
{
//
char dpl_l,dph_h;
dpl_l=(Y*40+X)&0xff; /*利用XY座标计算出光标地址的高低八位*/
dph_h=(Y*40+X)/256;
delay(0x9);
LcdCommand=0x46; /* 设定光标位置命令 */
LcdDataWrite=dpl_l; /* 从**位置开始 */
LcdDataWrite=dph_h;
delay(0x9);
LcdCommand=0x42; /* 允许MPU连续地把显示数据写入显示区内命令 */
}
/******************************************************************************************
*函数名: Clear_display
*参数: 无
*返回值: 无
*描述: 清LCD所有显示缓冲区子程序
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
void Clear_display()
{
uchar i,j;
for(i=0;i<40;i++)
{ SetCursor(0,i);
for(j=0;j<240;j++)
LcdDataWrite=0x0;
};
}
/******************************************************************************************
*函数名: Writework
*参数: y,x,Ziku,x_size,size,num,space
*返回值: 无
*描述: 写数据到LCD子程序,y是y轴坐标,x是x轴的坐标,*ZiKu首地址,x_size字体宽度,size占字节的个数,num显示个数
*编写: 李满庭
*版本信息: V1.0 2004年7月7日
******************************************************************************************/
void WriteWork(uchar y,uchar x,uchar * ZiKu,uchar x_size,uint size,uchar num,uchar space_num)
{
uint i;
uchar j,k;
uchar *pt;
uchar space=0;
pt=ZiKu;
for(k=0;k<num;k++)
{
ZiKu=pt+k*size;
for(j=0;j<x_size;j++)
{
SetCursor(y,x+j+x_size*k+space); // 设定光标,允许显示
for(i=j;i<size;)
{ LcdDataWrite=ZiKu[i];
i+=x_size;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -