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

 首页>> 常规知识 电路图集 学习MCU 单片机文章 查器件PDF 下载中心 单片机教程 学习产品 购买联系 在线留言 RRS
当前位置:首页 > ◆本站实例 > 详细内容
LCD1602+24C04存储3组数据实验
作者:Sidney 来源:微控实验网  发布时间:2008-12-15  阅读次数:4237  字体大小: 【】 【】【

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 (请把#改成@) 交流:479780666 522422171 86-0755-28650237
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号