打印

帮忙看下时钟程序

[复制链接]
1955|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
长缨在手|  楼主 | 2011-4-6 22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR   0x84
#define WRITE_DATE 0x86
#define WRITE_MONTH 0x88
#define WRITE_DAY   0x8A
#define WRITE_YEAR   0x8C
#define READ_SECOND   0x81
#define READ_MINUTE 0x83
#define READ_HOUR    0x85
#define READ_DATE   0x87
#define READ_MONTH 0x89
#define READ_DAY    0x8B
#define READ_YEAR   0x8D
#define WRITE_PROTECT 0x8E
#define pos_year   L1+0     
#define pos_month L1+3
#define pos_date   L1+6
#define pos_day    L1+9
#define pos_hour   L2+0
#define pos_minute L2+3
#define pos_sec L2+6

#define DATA P3
sbit RS1602=P1^0;
sbit RW1602=P1^1;
sbit E1602=P1^2;
#define L1 0x80   
#define L2 0xc0   

sbit sclk=P1^3;
sbit clk_io=P1^4;   
sbit clk_rst=P1^5;   


sbit func_key=P3^2;
sbit inc_key=P3^1;
sbit dec_key=P1^0;

void delay(uchar);
void write1602_comd(uchar);
void write1602_data(uchar);
void init1602_lcd();
void keyscan();
void Init_DS1302();   
void update_time();
uchar flag=0;
uchar code table1[]="09-10-30/5";   
uchar code table2[]="12:00:00";   

void init1602_lcd()
{
    int i;
     write1602_comd(0x01);
     write1602_comd(0x0c);
     write1602_comd(0x06);
     write1602_comd(0x3C);
     
     write1602_comd(0x80);   
     
     for(i=0;i<10;i++)   
         {
          write1602_data(table1[i]);
         delay(20);
        }
     write1602_comd(0xc0);
     for(i=0;i<8;i++)
         {
         write1602_data(table2[i]);
         delay(20);
         }
}
void delay(uchar z)
{
uchar i,j;
for(j=z;j>0;j--)   
for(i=125;i>0;i--);
}
void write1602_comd(uchar com)
{
RS1602=0;
DATA=com;
RW1602=0;
delay(5);
E1602=1;
delay(5);
E1602=0;
}
void write1602_data(uchar datatowrite)
{
   RS1602=1;
   DATA=datatowrite;
   RW1602=0;
   delay(5);
   E1602=1;
   delay(5);
   E1602=0;
}

void writeds1602_byte(uchar dat)   
{
uchar i,dat_w;
dat_w=dat;        
for(i=0;i<8;i++)
{
    clk_io=0;            
    if(dat_w&0x01)   
    {clk_io=1;}
    else              
    {clk_io=0;}
    dat_w=dat_w>>1;
    sclk=0;         
    sclk=1;         
}   
sclk=0;           
}

uchar readds1602_byte()
{
uchar i,k;
k=0;
for(i=0;i<8;i++)
{
k=k>>1;
if(clk_io)
{k=k|0x80;}
         
sclk=0;
sclk=1;
}
sclk=0;
return (k);
}

void Write1602(uchar add,uchar dat)
{
clk_rst=0;
sclk=0;
clk_rst=1;                              
writeds1602_byte(add);                  
writeds1602_byte((dat/10<<4)|(dat%10));
sclk=0;
clk_rst=0;
}

uchar Read1302(uchar add)
{
uchar temp,dat1,dat2;
clk_rst=0;
sclk=0;
clk_rst=1;
writeds1602_byte(add);
temp=readds1602_byte();
sclk=0;            
clk_rst=0;              
dat1=temp/16;        
dat2=temp%16;
temp=dat1*10+dat2;
return (temp);  
}

void Init_DS1302(void)   
{     
       Write1602 (WRITE_PROTECT,0X00); delay(1);
     Write1602 (WRITE_SECOND,0x00); delay(1);   
       Write1602 (WRITE_MINUTE,0x00);delay(1);
       Write1602 (WRITE_HOUR,0x0C); delay(1);
    Write1602 (WRITE_DAY,0x01); delay(1);   
       Write1602 (WRITE_DATE,0x12);delay(1);
       Write1602 (WRITE_MONTH,0x05); delay(1);
    Write1602 (WRITE_YEAR,0x09); delay(1);
       Write1602 (WRITE_PROTECT,0x80); delay(1);
}
void read_write_date_time(uchar _1302_addr, _1602_addr)
{
uchar high,low,get_data;
   Write1602 (WRITE_PROTECT,0x00);
    delay(1);
   get_data=Read1302(_1302_addr);
   high=get_data/10;
   low=get_data%10;
   write1602_comd(_1602_addr);
   write1602_data(high+0X40);
   write1602_data(low+0X40);
   Write1602 (WRITE_PROTECT,0x80); delay(1);
}
void write_lcd(uchar cusr_addr,time_data )
{
uchar hour_wei,ge_wei;
   hour_wei=time_data/10;
   ge_wei=time_data%10;
   write1602_comd(cusr_addr);
   write1602_data(hour_wei+0X40);
   write1602_data(ge_wei+0X40);
}
void update_time()
{
   uchar xq;
   read_write_date_time(READ_HOUR,L2);      
   read_write_date_time(READ_MINUTE,L2+3);
   read_write_date_time(READ_SECOND,L2+6);
   read_write_date_time(READ_YEAR,L1);
   read_write_date_time(READ_MONTH,L1+3);
   read_write_date_time(READ_DATE,L1+6);     
   xq=Read1302(READ_DAY);                     
   write1602_comd(L1+9);
   write1602_data(xq+0X40);
   Write1602 (WRITE_PROTECT,0x80);           
}


uchar first=1,num,second,minute,hour,day,date,month,year;
void keyscan()
{
if(first==1)
{
second=Read1302(READ_SECOND);
minute=Read1302(READ_MINUTE);
hour=Read1302(READ_HOUR);
day=Read1302(READ_DAY);
date=Read1302(READ_DATE);
month=Read1302(READ_MONTH);
year=Read1302(READ_YEAR);
   }
   first=0;
if(func_key==0)
{
    delay(5);
    if(func_key==0)
     {
     num++;
     flag=1;
     while(!func_key);
     if(num==1)
     {
      clk_rst=0;
      write1602_comd(pos_sec);
      write1602_comd(0x0f);
     }
         }
    if(num==2)
    {
     write1602_comd(pos_minute);
    }
    if(num==3)
    {
     write1602_comd(pos_hour);
    }
    if(num==4)
    {
     write1602_comd(pos_day);
    }
    if(num==5)
    {
     write1602_comd(pos_date);
    }
    if(num==6)
    {
     write1602_comd(pos_month);
    }
    if(num==7)
    {
     write1602_comd(pos_year);
    }
    if(num==8)      
    {
     num=0;
     write1602_comd(0x0c);   
     flag=0;
     clk_rst=1;
   
     Write1602 (WRITE_PROTECT,0x00);delay(1);
     Write1602(WRITE_SECOND,second);delay(1);   
                Write1602(WRITE_MINUTE,minute); delay(1);
           Write1602(WRITE_HOUR,hour); delay(1);
           Write1602(WRITE_DAY,day); delay(1);
           Write1602(WRITE_DATE,date); delay(1);
           Write1602(WRITE_MONTH,month); delay(1);
           Write1602(WRITE_YEAR,year); delay(1);
     Write1602 (WRITE_PROTECT,0x80); delay(1);
     first=1;      
       }   
   }
   if(num!=0)
   {
    if(inc_key==0)
    {
     delay(1);
     if(inc_key==0)
     {
      while(!inc_key);
      if(num==1)      
      {
       second++;
       if(second==60)
        second=0;
       write_lcd(pos_sec,second);
       write1602_comd(pos_sec);
      
      }
      if(num==2)     
      {
       minute++;
       if(minute==60)
        minute=0;
       write_lcd(pos_minute,minute);
       write1602_comd(pos_minute);
      }
      if(num==3)     
      {
       hour++;
       if(hour==24)
        hour=0;
       write_lcd(pos_hour,hour);
         write1602_comd(pos_hour);
      }
      if(num==4)     
      {
       day++;
       if(day==8)
        day=1;
         write1602_comd(pos_day);
                  write1602_data(day+0X40);
      }
      if(num==5)     
      {
       date++;
       if(date==32)
        date=1;
       write_lcd(pos_date,date);
         write1602_comd(pos_date);
      }
      if(num==6)     
      {
       month++;
       if(month==13)
        month=1;
       write_lcd(pos_month,month);
         write1602_comd(pos_month);
      }
      if(num==7)     
      {
       year++;
       if(year==99)
        hour=0;
       write_lcd(pos_year,year);
         write1602_comd(pos_year);
      }
     }
    }
    if(dec_key==0)
    {
     delay(1);
     if(dec_key==0)
     {
      while(!dec_key);
      if(num==1)      
      {
       second--;
       if(second==-1)
        second=59;
       write_lcd(pos_sec,second);
       write1602_comd(pos_sec);
      
      }
      if(num==2)   
      {
       minute--;
       if(minute==-1)
        minute=59;
       write_lcd(pos_minute,minute);
       write1602_comd(pos_minute);
      }
      if(num==3)     
      {
       hour--;
       if(hour==-1)
        hour=23;
       write_lcd(pos_hour,hour);
         write1602_comd(pos_hour);
      }
      if(num==4)     
      {
       day--;
       if(day==0)
        day=7;
         write1602_comd(pos_day);
                  write1602_data(day+0X40);
      }
      if(num==5)     
      {
       date--;
       if(date==0)
        date=31;
       write_lcd(pos_date,date);
         write1602_comd(pos_date);
      }
      if(num==6)     
      {
       month--;
       if(month==0)
        month=12;
       write_lcd(pos_month,month);
         write1602_comd(pos_month);
      }
      if(num==7)     
      {
       year--;
       if(year==0)
        hour=15;
       write_lcd(pos_year,year);
         write1602_comd(pos_year);
      }
     }
    }   
   }
}
void main()
{
    Init_DS1302();   
    init1602_lcd();
   while(1)
   {
      keyscan();
      delay(10);

    if(flag==0)
     update_time();
   }        
                 
}



这里的flag是什么意思,有什么功能?定义的是什么


write1602_comd(_1602_addr);// 设置第二行地址指针
   write1602_data(high+0X30);
   write1602_data(low+0X30);
这里的加0x30对吗?不是该加0x40吗?

相关帖子

沙发
长缨在手|  楼主 | 2011-4-14 20:48 | 只看该作者
这个程序跳出来怎么是字母啊,而且还走?!郁闷呢!!!!

使用特权

评论回复
板凳
aihe| | 2011-4-14 21:30 | 只看该作者
楼主抄来没注释的程序吧
还不如自己写一个呢

使用特权

评论回复
地板
幻想之翼| | 2011-4-15 10:35 | 只看该作者
0x30 是数字的0的ASCII码

使用特权

评论回复
5
老鱼探戈| | 2011-4-15 10:56 | 只看该作者
func_key 按到第8次的时候flag=0;其他都为1 ,即按键第八次执行update_time();
这样的程序一定是LZ在网上找的,还是看看1602的DATASHEET 吧,自己写还快点,1602很简单的

使用特权

评论回复
6
joyme| | 2011-4-15 10:58 | 只看该作者
程序里是+0x40,肯定显示的是字母啦,+0x40之后0-9会显示为:@,A,B,C...

function键按1,2,3...下分别可以调节秒、分、小时...,flag是function调节标志(flag=1),即在调节过程中不刷新时间,当function键按下8此后会回归到0即非时间调节状态(flag=0),LCD需要刷新时间显示

使用特权

评论回复
7
joyme| | 2011-4-15 10:59 | 只看该作者
呵呵,跟老鱼撞车了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

27

帖子

1

粉丝