51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > ◆本站实例 > 详细内容
LCD1602+24C04存储3组数据实验
作者:Sidney 来源:微控实验网  发布时间:2008/12/15  阅读次数:6652  字体大小: 【】 【】【

1.实验任务:

AT24C04存储三个可调数据用于3个独立的延时参数,LCD1602显示,3个LED显示三个状态
2.实验目的:
学习利用IIC总线来实现AT2404的多组数据存储方法
3.原理图:
  
  
作者:月夜     来源:本站原创(www.mcusy.cn)
  
4.源程序:
/********************************************************************************
* 程序名称:IC2总线存储,AT24C04+LCD1602应用演练
* 硬件说明:MCU采用AT89S51/52,STC89C52
* 实验对象:XY850单片机学习板
* 作           者:月夜听风     2009.6.8
* 来           源:www.mcusy.cn  ,转载须保持完整
* 程序原名:自动点胶机
      把配套光盘中的头文件里面的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秒;
//作者:月夜     来源:本站原创(www.mcusy.cn)
********************************************************************************/
#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开始显示
}
作者:月夜     来源:本站原创(www.mcusy.cn)
//-------------键盘调试(使用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);//显示并关闭光标闪烁
                                       }
  
                       }
  
       }
作者:月夜     来源:本站原创(www.mcusy.cn)
               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);
                                               }
                                       }
                               }                            
               }
}
//作者:月夜     来源:本站原创(www.mcusy.cn)
//----------主函数---------------------------------------------------------
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);
               }
  
               }
       }
}
//本文出处作者:月夜     来源:本站原创(www.mcusy.cn)
  
来源:微控实验网
上一篇:没有了! 下一篇:Keil uVision4 软件的使用入门
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号