搜索
bottom↓
回复: 3

DS1302+LCD12864时钟,按键怎么操作啊

[复制链接]

出0入0汤圆

发表于 2012-7-26 22:09:27 | 显示全部楼层 |阅读模式
我弄的DS1302+LCD12864基本显示已经出来了,但是我还想加上按键调节时间的功能,请问哪位高手能指点一二的,在此感激不尽啊~~~~~~
下面是我的程序:
#include<reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

uchar second,minute,hour,week,day,month,year;               
uchar time[]  ={0x12,0x07,0x26,0x08,0x07,0x07,0x04};        //初始时间数组

sbit DS1302_RST = P2^2;
sbit DS1302_IO = P2^3;
sbit DS1302_SCLK = P2^4;

sbit LCD_EN = P2^7;
sbit LCD_RW = P2^6;
sbit LCD_RS = P2^5;

sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
uchar num;

sbit DQ=P1^7;

uchar code dis1[]={" DS1302+LCD12864"};
uchar code dis2[]={"    暑假学习 "};
uchar code year_month_day[] = {"              "};
uchar code hour_minute_second[] = {"              "};

/***************************延时函数*******************************/

void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}

/******************向DS1302送一字节数据*****************************/

void input_byte(uint temp)
{
        char i;
        for(i=8;i>0;i--)
        {
                DS1302_IO = (bit)(temp&0x01);
                DS1302_SCLK=1;
                _nop_();
                DS1302_SCLK=0;
                temp>>= 1;
        }
        return;
}

/***********************:读DS1302一个字节***************************/

uchar output_byte(void )
{
        uchar i;
        uchar ucdat = 0;
        for(i = 8; i > 0; i--)
        {
                DS1302_IO  = 1;
                ucdat >>= 1;
                if(DS1302_IO)ucdat |= 0x80;
                DS1302_SCLK = 1;
                _nop_();
                DS1302_SCLK= 0;
         }
         return(ucdat);
}

/******************向DS1302某地址写一字节数据***********************/

void write_1302(uchar add,uchar dat)
{
        DS1302_RST = 0;
        _nop_();
        DS1302_SCLK = 0;
        _nop_();
        DS1302_RST = 1;
        input_byte(add);
        _nop_();
        input_byte(dat);
        DS1302_SCLK = 1;
        _nop_();
        DS1302_RST = 0;
}

/*****************************读DS1302地址***************************/

uchar read_1302(uchar add)
{
        uchar abc;
        DS1302_RST=0;
        _nop_();
        DS1302_SCLK=0;
        _nop_();
        DS1302_RST=1;
        input_byte(add);
        abc=output_byte();
        DS1302_SCLK=1;
        _nop_();
        DS1302_RST=0;
        return(abc);
}

/***************************初始化DS1302******************************/

void init_ds1302()
{
        write_1302(0x8e,0x00);                //写保护寄存器,在对时钟或RAM写前WP一定要为0
        write_1302(0x8c,time[0]);                //年
        write_1302(0x88,time[1]);                //月
        write_1302(0x86,time[2]);                //日
        write_1302(0x8A,time[6]);                //星期
        write_1302(0x84,time[3]);                //时
        write_1302(0x82,time[4]);                //分
        write_1302(0x80,time[5]);                //秒
        write_1302(0x8e,0x80);                //写保护寄存器
}

/*************************读DS1302时间***********************************/

void read_time()
{
        second=read_1302(0x81);                //秒寄存器
        minute=read_1302(0x83);                //分
        hour=read_1302(0x85);                        //时
        week=read_1302(0x8b);                        //星期
        day=read_1302(0x87);                        //日
        month=read_1302(0x89);                //月
        year=read_1302(0x8d);                        //年
}

/***********************写指令数据到LCD*********************************/

void write_cmd(uchar cmd)
{
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EN = 0;
        P0 = cmd;
        delay(5);
        LCD_EN=1;
        delay(5);
        LCD_EN=0;        
}

/***************************写显示数据到LCD******************************/

void  write_dat(uchar dat)
{       
        LCD_RS = 1;
        LCD_RW = 0;       
        LCD_EN = 0;
        P0 = dat;
        delay(5);
        LCD_EN = 1;
        delay(5);
        LCD_EN = 0;
}

/***************************设定显示位置**********************************/

void lcd_pos(uchar X,uchar Y)
{
        uchar pos;
        if(X == 0)
        {X = 0x80;}
        else if (X == 1)
        {X = 0x90;}
        else if (X == 2)
        {X = 0x88;}
        else if (X == 3)
        {X = 0x98;}
        pos = X+Y;
        write_cmd(pos);
}
void writesting(uchar x,uchar y,uchar *p)
{
        uchar temp;
        temp=*p;
        lcd_pos(x,y);
        while(temp)
        {
                write_dat(temp);       
                temp=*(++p);
        }
}
/*******************************LCD初始化**********************************/

void lcd_init()
{
        write_cmd(0x30);
        delay(5);
        write_cmd(0x0c);
        delay(5);
        write_cmd(0x01);
        delay(5);
}

/*********************************显示函数*********************************/

void display()
{
        lcd_pos(2,2);
        write_dat((year/16)  + 0x30);
        write_dat((year%16)  + 0x30);
        writesting(2,1,"20");       
       
        lcd_pos(2,4);
        write_dat((month/16)  + 0x30);
        write_dat((month%16)  + 0x30);
        writesting(2,3,"-");

        lcd_pos(2,6);
        write_dat((day/16)  + 0x30);
        write_dat((day%16)  + 0x30);
        writesting(2,5,"-");

        lcd_pos(3,0);
        write_dat((hour/16)  + 0x30);
        write_dat((hour%16)  + 0x30);
        writesting(3,1,":");       

        lcd_pos(3,2);
        write_dat((minute/16)  + 0x30);
        write_dat((minute%16)  + 0x30);
        writesting(3,3,":");

        lcd_pos(3,4);
        write_dat((second/16)  + 0x30);
        write_dat((second%16)  + 0x30);
        writesting(3,5,"星");
        writesting(3,6,"期");
   

        switch(week)
        {
                case 1:        writesting(3,7,"一");break;
                case 2:        writesting(3,7,"二");break;
                case 3:        //writesting(3,7,"三");        无法识别这一条语句
                                {write_dat(0xc8);write_dat(0xfd);}           //与上一条语句等价,用来显示“三”
                                        break;
                case 4:        writesting(3,7,"四");break;
                case 5:        writesting(3,7,"五");break;
                case 6:        writesting(3,7,"六");break;
                case 7:        writesting(3,7,"七");break;
        }
        write_dat((week/16)  + 0x30);
        write_dat(week%16+0x30);
}

/*****************************显示位置*********************************/
void LCD_pos()
{
        uchar i;
        lcd_pos(0,0);               //显示字符  
    i=0;
    while(dis1[i]!='\0')              
    {
        write_dat(dis1[i]);        
        i++;
    }

    lcd_pos(1,0);                 //显示字符   
    i=0;
    while(dis2[i]!='\0')         
    {
        write_dat(dis2[i]);        
        i++;
    }
        lcd_pos(2,0);
        i=0;
        while(year_month_day[i] != '\0')
        {
                write_dat(year_month_day[i]);
                i++;
        }

        lcd_pos(3,0);
        i=0;       
        while(hour_minute_second[i] != '\0')
        {
                write_dat(hour_minute_second[i]);
                i++;
        }       
}

/******************按键调时************************************************/
void keyscan()
{
       
       
}

/********************************主函数************************************/

void main()
{
        init_ds1302();
        lcd_init();
        LCD_pos();
   
        while(1)
        {
                keyscan();
                read_time();
                display();
                       
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-7-27 13:26:46 | 显示全部楼层
两个按键,一个改变焦点,一个对焦点处的参数加1

出0入0汤圆

 楼主| 发表于 2012-7-27 15:02:34 | 显示全部楼层
那你可以写一个改变秒的范例给我参考一下吗?????

出0入0汤圆

 楼主| 发表于 2012-7-27 15:02:51 | 显示全部楼层
那你可以写一个改变秒数的范例给我参考一下吗?????
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 16:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表