长汀无线电厂交流论坛

 找回密码
 注册
查看: 6097|回复: 20
打印 上一主题 下一主题

CT_3位LCD屏+2051+实时时钟

  [复制链接]
跳转到指定楼层
楼主
发表于 2011-3-14 10:09:32 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gw168sh 于 2011-3-14 12:41 编辑

昨天下午没事,把以前写的8952时钟给修改 了一下
用2051+LCD屏+DS1302 做了个时钟
昨天拍了照,忘记把相片弄出来了,
另外请教个问题
编译后16进制的程序有4K,2051只有2kflash rom,是不是写进去的是2进制呀,2进制会小点?
程序如下:
#include <REG52.H>
sbit   LCD_DATA = P1^2;//=14-2051,14脚
sbit   LCD_CLK = P1^3;//=15
sbit   LCD_CS1 = P1^4;//=16
sbit clock_clk=P3^4;//=8
sbit clock_dat=P3^2;//=6
sbit clock_rst=P3^3;//=7
sbit ks5=P3^0;//=2
sbit ks4=P3^1;//=3
sbit keyshi=P3^5;//zhishi=9
sbit keyfen=P3^7;//=11
void init2();
sbit a0 = ACC ^ 0;//为了编程方便定义的位变量
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
unsigned char code digi[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x58,0x5e,0x79,0x71,0x76,0x37,0x6b,0x6e,0x48};
//0,1,2,3,4,5,6,7,8,9,A,b,c,d,E,F,H,17,18,y,20
unsigned char lcd_data[3],dat, i,set,in,d,e,t,s;   
unsigned int num1;
void delay_ms(unsigned int a)                       
{
        unsigned char i;
        while( --a != 0)
        {               
        for(i = 0; i < 100; i++);         
        }                                   
}
void LCD_init(void)
  {
        LCD_CS1=0;
        LCD_DATA=0;
        LCD_CLK=0;
        LCD_CS1=1;
        delay_ms(100);
        LCD_CLK=1;
}
void LCD_write_char(unsigned char dat)
  {      
        unsigned int i;
        for(i=8;i>0;i--)
          {
            LCD_DATA=0;
                if (dat&0x01)  LCD_DATA=1;
                LCD_CLK=0;
                delay_ms(3);
                LCD_CLK=1;
                delay_ms(3);        
                dat=dat >> 1;
   
          }
}
void LCD_LED_ON(void)
  {
         LCD_CS1=0;
         LCD_write_char(0x05);    // 背光ON
         LCD_CS1=1;
         delay_ms(3);
}
void LCD_OFF(void)
{
   LCD_CS1=0;
         LCD_write_char(0x01);    // 关显示
         LCD_CS1=1;
         delay_ms(3);

}
/**************读出一个字节,时序***************/
unsigned char clock_read(void)   //读出一个字节,时序
{
clock_clk=1; clock_clk=0; a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/****************************************************
ds1302程序
写入一个字节,
****************************************************/
void clock_write(unsigned char dd)   //写入一个字节,DS1302时序
{
ACC=dd;
clock_clk=0;clock_dat=a0; clock_clk=1;
clock_clk=0;clock_dat=a1; clock_clk=1;
clock_clk=0;clock_dat=a2; clock_clk=1;
clock_clk=0;clock_dat=a3; clock_clk=1;
clock_clk=0;clock_dat=a4; clock_clk=1;
clock_clk=0;clock_dat=a5; clock_clk=1;
clock_clk=0;clock_dat=a6; clock_clk=1;
clock_clk=0;clock_dat=a7; clock_clk=1;
}
/******************** 向reg2写入date数据*/
void write_clock(unsigned char reg2, unsigned char date)//向reg2写入date数据
{
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_write(reg2);
clock_write(date);
clock_rst=0;
}
/****从reg1寄存器读数据***/
unsigned char read_clock(unsigned char reg1)//从reg1寄存器读数据
{
unsigned char dd=0;
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_write(reg1);
dd=clock_read();
clock_rst=0;
return(dd);
}
void display_lcd1(unsigned int num)        //显示
{
        lcd_data[0] = digi[num%10];
        lcd_data[1] = digi[(num%100)/10];
        lcd_data[2] = 0x40;
        LCD_CS1=0;
        LCD_write_char(0x08);        //写数据
        for(i=0;i<3;i++) LCD_write_char(lcd_data);
        LCD_CS1=1;
        delay_ms(3);
}
void display_lcd2(unsigned int num)        //显示
{
        lcd_data[0] = 0x40;
        lcd_data[1] = digi[num%10];
        lcd_data[2] = digi[(num%100)/10];
        LCD_CS1=0;
        LCD_write_char(0x08);        //写数据
        for(i=0;i<3;i++) LCD_write_char(lcd_data);
        LCD_CS1=1;
        delay_ms(3);
}
void key()
{
if(ks5==0)
  {
  delay_ms(30);
  if(ks5==0)
   {
   while(ks5==0);
   set++;
   if(set==1) {keyfen=0;keyshi=1;}
   if(set==2) {keyfen=1;keyshi=0;}
   if(set==3)
    {set=0;
     keyfen=1;
    keyshi=1;
    }
   
   }
  }


switch(set)
  {
  case 1:
            d=read_clock(0x83);//读分钟
   e=d;
   d=d>>4;
   e=e&0x0f;
   t=(d*10)+e;
      display_lcd1(t);
   if(ks4==0)
   {
   delay_ms(30);
   if(ks4==0)
    {
   while(ks4==0);
   write_clock(0x8e,0x0);//取消写保护
   write_clock(0x80,0x80);//停止时钟
   d=read_clock(0x83);
   if(d==0x09) {d=0x0f;}//d=9  d=15
   if(d==0x19){d=0x1f;}//d=
   if(d==0x29){d=0x2f;}
   if(d==0x39){d=0x3f;}
   if(d==0x49){d=0x4f;}
   
    d++;
    if(d==0x5a){d=0x00;}
   write_clock(0x82,d);//  写分钟
   write_clock(0x80,0x01);//启动时钟
   write_clock(0x8e,0x80);//写保护
    delay_ms(20);
   //d=0;
  
    }
   }
   //else     
            break;
  case 2:
            d=read_clock(0x85);//读小时
   e=d;
   d=d>>4;
   e=e&0x0f;
   t=(d*10)+e;
   display_lcd2(t);
   if(ks4==0)
   {
   delay_ms(30);
   if(ks4==0)
    {
   while(ks4==0);
   write_clock(0x8e,0x0);//取消写保护
   write_clock(0x80,0x80);//停止时钟
   d=read_clock(0x85);
   if(d==0x09) {d=0x0f;}//d=9  d=15
   if(d==0x19){d=0x1f;}//d=
   d++;
   if(d==0x24){d=0x00;}
   
   write_clock(0x84,d);// 写小时
   write_clock(0x80,0x01);//启动时钟
   write_clock(0x8e,0x80);//写保护
    delay_ms(30);
    }
   }
   //else
            break;
  }
}


/////////////////////////
void show(void)//显示和闪烁函数
{
//unsigned char d,e,t;
//d=read_clock(0x81);//读秒

/**P0 = Tab_Num[ d ];//秒十位
wei2=1;
delay(250);
wei2=0;
P0 = Tab_Num[ e ];//秒各位
wei1=1;
delay(250);
wei1=0;   */
  
      
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
t=(d*10)+e;
    display_lcd1(t);
delay_ms(1000);
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
t=(d*10)+e;
display_lcd2(t);
delay_ms(1000);
// d=read_clock(0x87);//读日
//d=read_clock(0x89);//读月
//    delay_ms(50);
  //d=read_clock(0x8d);//读年
//d=read_clock(0x8b);//读年

}

/*--------------------时钟的初始化---------------------------*/
void Init_1302(void)//如果不满意现在的表,可以初始化调整,写入程序之后,再把初始化屏蔽掉
{
write_clock(0x8e,0x00);//close_protect
delay_ms(30);
write_clock(0x8c,0x08);//year 08年
delay_ms(30);
write_clock(0x88,0x6);//month 06
delay_ms(30);
write_clock(0x86,0x25);//date 25
delay_ms(30);
write_clock(0x84,0x08);//hour  8
delay_ms(30);
write_clock(0x82,0x0a);//minute 40
delay_ms(30);
write_clock(0x80,0x01);//second 41
delay_ms(30);
write_clock(0x8a,0x03);//week_day  3
delay_ms(30);
write_clock(0x90,0xaa);//supply_power
delay_ms(30);
write_clock(0x8e,0x80);//protect
delay_ms(30);
}
void main(void)
{
  set=0;
  ks5=1;
  ks4=1;
        LCD_init();
        LCD_LED_ON();        // 背光ON
    in=0;
   keyshi=1;
  keyfen=1;  
     delay_ms(10);
         
  while(1)
        {   
   LCD_LED_ON();
   //Init_1302();//DS1302寄存器初始化
   key();
   if(set==0)
   {
   show();  
   }
    }  // *** while(1) end ***
}   // *** main() end ***

回复

使用道具 举报

沙发
 楼主| 发表于 2011-3-14 10:16:06 | 显示全部楼层
其实实时时钟挺好的,加个备用电池,超省电
1302的耗电很少,用的时候打开单片机电源就可以了,2051从1302里面读出来现在的时间。
我打算用电脑的USB供电,上班开电脑就显示,一下班电脑关了,就关机,平时就用备用电池给1302供电

点评

电脑上本来就有时间的,你这不是多此一举吗?  发表于 2012-3-12 22:22
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2011-3-14 12:42:33 | 显示全部楼层
本帖最后由 gw168sh 于 2011-3-14 12:43 编辑
mdy-5153 发表于 2011-3-14 11:53
你是说3位LCD屏吧? 我用3位4寸LED也做过时钟,10 用A显示,11用 11, 12用0,就可以显示12个小时了。


是LCD,这段程序里面还引用了你的部分程序,拼凑的。

我是用24小时显示的,所以不用上午下午
小时和 分钟交替显示的
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2011-3-15 08:42:30 | 显示全部楼层
上图看看


回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2011-6-30 16:41:54 | 显示全部楼层
手机屏哪有那么好搞的,首先接口就不好弄
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2011-7-1 07:57:47 | 显示全部楼层
本帖最后由 gw168sh 于 2011-7-1 07:58 编辑
一片漆黑 发表于 2011-6-30 21:07
能麻烦给个电路图吗?我不太懂C语言,看不懂怎么连线。谢谢!

电路图没有画,你看看这段程序就知道了。
sbit   LCD_DATA = P1^2;//=14-2051的14脚接LCD的DATA脚
sbit   LCD_CLK = P1^3;//=15脚,下面的都一样
sbit   LCD_CS1 = P1^4;//=16
sbit clock_clk=P3^4;//=8
sbit clock_dat=P3^2;//=6
sbit clock_rst=P3^3;//=7
sbit ks5=P3^0;//=2
sbit ks4=P3^1;//=3
sbit keyshi=P3^5;//zhishi=9
sbit keyfen=P3^7;//=11 脚接按键
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|长汀无线电厂交流论坛  

GMT+8, 2024-5-19 09:26 , Processed in 0.701341 second(s), 21 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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