4.源程序:
/********************************************************************************
* 程序名称:IC2总线存储,AT24C04+LCD1602应用演练
* 程序原名:自动点胶机
把配套光盘中的头文件里面的24C02.h 拷入C:\Keil\C51\INC
* 功 能:
LCD1602显示、AT24C02存储参数、K1/K2/K3按键调节三组参数并存储(防断电)
K4启动实验,注意观察三个LED按顺序变化的亮灭时间.(每个参数可调最大数255),
三组参数决定P20/P21/P22的LED灯显示亮灭时间。
* 提 示:
根据屏幕提示000=0.00S(秒)如你把任一参数调整到0.50,其实就是0.5秒;
********************************************************************************/
#include
#include<24c02.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]=" Model XY850/900"; uchar code table2[]=" www.mcusy.cn ";
uchar code table3[]="SETUP: 000=0.00s"; uchar code table4[]=".00 > .00 > .00 ";
uchar code table5[]=" Working ... ";
sbit rs=P2^5;
sbit lcdRW=P2^6;
sbit lcden=P2^7;
sbit k1=P3^2; //功能键
sbit k2=P3^3; //加1
sbit k3=P3^4; //减1
sbit k4=P3^5; //启动...
sbit D0=P2^0; //LED0
sbit D1=P2^1; //LED1
sbit D2=P2^2; //LED2
uint time1,st,time2,count,count1,count2;//三个设定参数,必须用uint定义
uchar num,tt1,tt2,stt,k0num,k1num;//设定变量
//-------------1MS延时子函数(防抖和时基公用)
void delay_t(uint z)
{
uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
//-------------LCD设置参数
void write_com(uchar com) //写命令函数
{
rs=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;
}
void write_date(uchar date) //写数据函数
{
rs=1;P0=date;delay(1);lcden=1;delay(1);lcden=0;
}
//-------------初始化函数
void init()
{
uchar num; //显示字符的个数
write_com(0x38); //显示模式为16*2、5*7
write_com(0x0c); //显示并关闭光标闪烁
write_com(0x06); //光标加一
write_com(0x01); //清屏
write_com(0x80); //数据指针指向第一行/
for(num=0;num<16;num++)
{
write_date(table1[num]);//显示" Mmodel XY-850 “
delay(130); //每个字出来的时间间隔
}
write_com(0x80+0x40); //数据指针指向第二行/
for(num=0;num<16;num++)
{
write_date(table2[num]);//显示”www.mcusy.cn“
delay(150); //每个字出来的时间间隔
}
delay(1000);
write_com(0x01); //数据指针指向第一行/
write_com(0x80); //数据指针指向第一行/
for(num=0;num<16;num++)
{
write_date(table5[num]);//显示”Working ...“
delay(1);
}
}
//-------------三个数据地址/数据
void write_time_s(uchar add,uchar date)
{
uchar bai,shi,ge;
bai=date/100;
shi=date%100/10; //分离三个数据
ge=date%10;
write_com(0x80+0x40+add-1);//确定地址
write_date(0x30+bai); //百位从0开始显示
write_date(0x30+shi); //十位从0开始显示
write_date(0x30+ge); //个位从0开始显示
}
//-------------键盘调试(使用K1/K2/K3按键调三个数据)
void keyscan()
{
if(k1==0) //如果设置键被按下
{
delay(10);
if(k1==0)//重测设置键
{
delay(10);
while(!k1);//松手检测
k1num++;
if(k1num==1)
{
//-----以下为保持设置菜单显示
write_com(0x80); //数据指针指向第一行/
for(num=0;num<16;num++)
{
write_date(table3[num]);//SETUP: 000=0.00s
delay(1);
}
write_com(0x80+0x40);//数据指针指向第二行/
for(num=0;num<16;num++)
{
write_date(table4[num]);//.00 > .00 > .00
delay(1);
}
//-----以下为保持设置好的数据显示
write_time_s(1,tt1);
write_com(0x80+0x40+2);
write_time_s(7,stt);
write_com(0x80+0x40+8);
write_time_s(13,tt2);
write_com(0x80+0x40+14);
write_com(0x80+0x40+2);//指向第二行第1位
write_com(0x0f);//光标闪烁
}
if(k1num==2)
{
write_com(0x80+0x40+8);//指向第二行第7位
}
if(k1num==3)
{
write_com(0x80+0x40+14);//指向第二行第13位
}
if(k1num==4)
{
k1num=0;
write_com(0x0c);//显示并关闭光标闪烁
}
}
}
if(k1num!=0)//若k1num的值确实不为0,被按下,处理设定
{
if(k2==0)//如果加1键被按下
{
delay(10);
if(k2==0)
delay(10);
if(k2!=0)
{
if(k1num==1)//T1
{
tt1++;
write_add(0xA0,tt1);//第一个数据存入24C02的0xA0
if(tt1==200)
tt1=0;
time1=tt1*10;//10等于分秒为单位
write_time_s(1,tt1);
write_com(0x80+0x40+2);
}
if(k1num==2)//ST
{
stt++;
write_add(0xA2,stt);//第二个数据存入24C02的0xA2
if(stt==200)
stt=0;
st=stt*10;
write_time_s(7,stt);
write_com(0x80+0x40+8);
}
if(k1num==3)//T2
{
tt2++;
write_add(0xA4,tt2);//第三个数据存入24C02的0xA4
if(tt2==200)
tt2=0;
time2=tt2*10;
write_time_s(13,tt2);
write_com(0x80+0x40+14);
}
}
}
if(k3==0)//如果减1键被按下
{
delay(10);
if(k3==0)
delay(10);
if(k3!=0)
{
if(k1num==1)//T1
{
if(tt1==0)
tt1=200;
tt1--;
write_add(0xA0,tt1);//第一个数据存入24C02的0xA0
time1=tt1*10;
write_time_s(1,tt1);
write_com(0x80+0x40+2);
}
if(k1num==2)//ST
{
if(stt==0)
stt=200;
stt--;
write_add(0xA2,stt);//第二个数据存入24C02的0xA2
st=stt*10;
write_time_s(7,stt);
write_com(0x80+0x40+8);
}
if(k1num==3)//T2
{
if(tt2==0)
tt2=200;
tt2--;
write_add(0xA4,tt2);//第三个数据存入24C02的0xA4
time2=tt2*10;
write_time_s(13,tt2);
write_com(0x80+0x40+14);
}
}
}
}
}
//----------主函数---------------------------------------------------------
void main()
{
lcdRW=0;tt1=0;stt=0;tt2=0;
init();delay(10);init_I2C();delay(10);//初始化及I2C初始化
tt1=read_add(0xA0);stt=read_add(0xA2);tt2=read_add(0xA4);//读取三个存储的数据
while(1)
{
keyscan();
if(k4==0) //启动键是否按下?
{
k1num=0;
delay(10);
if(k4==0) //重测
delay(10);
while(!k4); //松开启动按键?
//-------------------------------处理动作和调用存储延时--------------------------------
D0=0;//LED0点亮
//以下为前延时,开机检测按键后把实际数据存入time1
time1=tt1*10;delay_t(time1);
D0=1;//LED0熄灭
delay(10);
D1=0;//LED1点亮
//以下为喷胶时间,加入st=stt*10实际数据存入st
st=stt*10;delay_t(st);
D1=1;//LED1熄灭
delay(10);
D2=0;//LED2点亮
//以下为后延时,加入time2=tt2*10实际数据存入time2
time2=tt2*10;delay_t(time2);
D2=1;//LED2熄灭
delay(10);
write_com(0x80+0x40); //数据指针指向第二行/
for(num=0;num<16;num++)
{
write_date(table5[num]);//“Working ...”
delay(1);
}
}
}
}