⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602+at24c04存储3组数据实验.c

📁 花钱购买的C51学习板里的源码
💻 C
字号:
/********************************************************************************
* 程序名称:IC2总线存储,AT24C04+LCD1602应用演练
* 实验对象:WK-S802学习板 
* 程序原名:喇叭自动点胶机(改),笔者自行开发的工业应用!
* 功    能:
   LCD1602显示、AT24C02存储参数、K1/K2/K3按键调节三组参数并存储(防断电)
K4启动实验,注意观察三个LED按顺序变化的亮灭时间.(每个参数可调最大数199),
三组参数决定P20/P21/P22的LED灯显示亮灭时间。

* 重要提示:
    根据屏幕提示000=0.00S(秒)如你把任一参数调整到050,其实是0.5秒;
你可以自行把程序菜单修改一下,如直接显示0.00S那就更好。

********************************************************************************/
#include<reg52.h>
#include<24c02.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]="  Model WK-S801 ";	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 WK-S801“
	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=tt1*10为的是开机检测按键后把实际数据存入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);
		}

		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -