DS1302+AT24C02+按键数码管显示程序

发布者:RadiantDreams最新更新时间:2018-06-25 来源: eefocus关键字:DS1302  AT24C02  按键  数码管显示 手机看文章 扫描二维码
随时随地手机看文章
  1. #include  

  2. #include  

  3. #define uint unsigned int  

  4. #define uchar unsigned char  

  5. bit write=0;  

  6. sbit led0=P1^5;  

  7. sbit led1=P1^6;  

  8. sbit led2=P1^7;  

  9.   

  10. sbit sda=P1^1;  

  11. sbit scl=P1^0;  

  12.   

  13. sbit SCLK=P3^5;     

  14. sbit DATA=P3^6;     

  15. sbit RST=P3^7;  

  16.   

  17. sbit sg=P2^7;  

  18. sbit ss=P2^6;  

  19. sbit sb=P2^5;  

  20. sbit sq=P2^4;  

  21. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   

  22. uchar second,minute=0;  

  23. uchar sec;  

  24. sbit beep=P3^4;         // 0  

  25. uint state=0;           // 0:时钟状态 1:设置秒 2:设置分 3:初始设置状态  

  26. sbit key1=P2^1;         // 进入设定模式以及 确认设置    先设置秒 后设置分  

  27. sbit key3=P2^0;         //          ++  

  28. sbit key4=P2^2;         //          --  

  29. uchar count=0;   

  30. void display();  

  31. void delay()  

  32. {;;}  

  33. void delayms(uint ms)  

  34. {  

  35.     uint i,j;  

  36.     for(i=ms;i>0;i--);  

  37.         for(j=110;j>0;j--);  

  38. }  

  39. /******************/  

  40. void start()  

  41. {  

  42.     sda=1;  

  43.     delay();  

  44.     scl=1;  

  45.     _nop_();  

  46.     _nop_();  

  47.     _nop_();  

  48.     _nop_();  

  49.     _nop_();  

  50.     sda=0;  

  51.     _nop_();  

  52.     _nop_();  

  53.     _nop_();  

  54.     _nop_();  

  55.     _nop_();  

  56.       

  57. }  

  58. void stop()  

  59. {  

  60.     sda=0;  

  61.     _nop_();  

  62.     scl=1;  

  63.     _nop_();  

  64.     _nop_();  

  65.     _nop_();  

  66.     _nop_();  

  67.     _nop_();  

  68.     sda=1;  

  69.     _nop_();  

  70.     _nop_();  

  71.     _nop_();  

  72.     _nop_();  

  73. }  

  74. void respons()   

  75. {     

  76.       

  77.     uchar i;  

  78.     scl=1;  

  79.     delay();  

  80.     while((sda==1)&&(i<100))i++;  

  81.     scl=0;  

  82.     delay();  

  83. }  

  84. void initAT()  

  85. {  

  86.     sda=1;  

  87.     delay();  

  88.     scl=1;  

  89.     delay();  

  90. }  

  91. void write_byte(uchar date)  

  92. {  

  93.     uchar i,temp;  

  94.     temp=date;  

  95.     for(i=0;i<8;i++)  

  96.     {  

  97.         temp=temp<<1;  

  98.         scl=0;  

  99.         delay();  

  100.         sda=CY;  

  101.         delay();  

  102.         scl=1;  

  103.         delay();  

  104.     }  

  105.     scl=0;  

  106.     delay();  

  107.     sda=1;  

  108.     delay();  

  109. }  

  110. uchar read_byte()  

  111. {  

  112.     uchar i,k;  

  113.     scl=0;  

  114.     delay();  

  115.     sda=1;  

  116.     delay();  

  117.     for(i=0;i<8;i++)  

  118.     {  

  119.         scl=1;  

  120.         delay();  

  121.         k=(k<<1)|sda;  

  122.         scl=0;  

  123.         delay();  

  124.     }  

  125.     return k;  

  126. }  

  127. void write_add(uchar address,uchar date)  

  128. {  

  129.     start();  

  130.     write_byte(0xa0);          //1010 000 0 0为读 1为写  

  131.     respons();  

  132.     write_byte(address);  

  133.     respons();  

  134.     write_byte(date);  

  135.     respons();  

  136.     stop();   

  137. }  

  138. uchar read_add(uchar address)  

  139. {  

  140.     uchar date;  

  141.     start();  

  142.     write_byte(0xa0);  

  143.     respons();  

  144.     write_byte(address);  

  145.     respons();  

  146.     start();  

  147.     write_byte(0xa1);           //1010 000 1  

  148.     respons();  

  149.     date=read_byte();  

  150.     stop();  

  151.     return date;  

  152. }  

  153. /*************************************************/  

  154. void write1302(uchar dat)  

  155. {  

  156.   uchar i;   

  157.   SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备  

  158.   delay();       //稍微等待,使硬件做好准备  

  159.   for(i=0;i<8;i++)      //连续写8个二进制位数据  

  160.     {  

  161.          DATA=dat&0x01;    //取出dat的第0位数据写入1302  低位在前,高位在后  

  162.          delay();       //稍微等待,使硬件做好准备  

  163.          SCLK=1;           //上升沿写入数据  

  164.          delay();      //稍微等待,使硬件做好准备  

  165.          SCLK=0;           //重新拉低SCLK,形成脉冲  

  166.          dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位  

  167.       }  

  168. }   

  169. void writeset1302(uchar Cmd,uchar dat)  

  170.  {      

  171.         RST=0;           //禁止数据传递  

  172.         SCLK=0;          //确保写数居前SCLK被拉低  

  173.         RST=1;           //启动数据传输  

  174.         delay();     //稍微等待,使硬件做好准备  

  175.         write1302(Cmd);  //写入命令字  

  176.         write1302(dat);  //写数据  

  177.         SCLK=1;          //将时钟电平置于高电平状态  

  178.         RST=0;           //禁止数据传递  

  179.  }    

  180.  uchar Read1302()  

  181.  {  

  182.     uchar i,dat;  

  183.     delayms(2);       //稍微等待,使硬件做好准备  

  184.     for(i=0;i<8;i++)   //连续读8个二进制位数据  

  185.      {   dat>>=1;  

  186.          if(DATA==1)    //如果读出的数据是1  

  187.          dat|=0x80;    //将1取出,写在dat的最高位  

  188.          SCLK=1;       //将SCLK置于高电平,为下降沿读出  

  189.          _nop_();  //稍微等待  

  190.          SCLK=0;       //拉低SCLK,形成脉冲下降沿  

  191.          _nop_();  

  192.       }    

  193.   return dat;        //将读出的数据返回  

  194. }   

  195. uchar ReadSet1302(uchar Cmd)  

  196.  {  

  197.     uchar dat;  

  198.     RST=0;                 //拉低RST  

  199.     SCLK=0;                //确保写数居前SCLK被拉低  

  200.     RST=1;                 //启动数据传输  

  201.     write1302(Cmd);       //写入命令字  

  202.     dat=Read1302();       //读出数据  

  203.     SCLK=1;              //将时钟电平置于已知状态  

  204.     RST=0;               //禁止数据传递  

  205.     return dat;          //将读出的数据返回  

  206. }  

  207. void confirm()  

  208. {  

  209.     uchar ReadValue;  

  210.     ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据  

  211.     second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化              //0x70=01110000 &同为同 异为0 保留111位  0x0f=1111 保留后四位  

  212.     ReadValue = ReadSet1302(0x83);  //从分寄存器读  

  213.     minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化  

  214. }  

  215. /********************************************************************************************************************/  

  216. void init_DS1302()  

  217. {     

  218.     uchar flag;  

  219.     flag= ReadSet1302(0x81);  

  220.     if(flag&0x80)     

  221.     {      //判断时钟芯片是否关闭  

  222.         writeset1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令  

  223.         writeset1302(0x80,((second/10)<<4|(second%10)));   //根据写秒寄存器命令字,写入秒的初始值  

  224.         writeset1302(0x82,((minute/10)<<4|(minute%10)));   //根据写分寄存器命令字,写入分的初始值  

  225.         writeset1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值  

  226.         writeset1302(0x86,((18/10)<<4|(18%10))); //根据写日寄存器命令字,写入日的初始值  

  227.         writeset1302(0x88,((6/10)<<4|(6%10))); //根据写月寄存器命令字,写入月的初始值  

  228.         writeset1302(0x8c,((9/10)<<4|(9%10)));   //根据写年寄存器命令字,写入年的初始值  

  229.         writeset1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式  

  230.         writeset1302(0x8E,0x80);              //根据写状态寄存器命令字,写入保护指令  

  231.     }  

  232. }  

  233. void bee()  

  234. {  

  235.     beep=0;  

  236.     delayms(100);  

  237.     beep=1;  

  238. }  

  239. void display()       //先秒后分  

  240. {   

  241.     if(state==0||state==3)  

  242.         {  

  243.             uchar ge0,ge1,shi1,shi0;  

  244.             ge0=second%10;  

  245.             shi0=second/10;  

  246.             ge1=minute%10;  

  247.             shi1=minute/10;  

  248.   

  249.             sq=0;  

  250.             P0=table[ge0];  

  251.             delayms(5);  

  252.             sq=1;  

  253.             P0=0xff;  

  254.               

  255.             sb=0;  

  256.             P0=table[shi0];  

  257.             delayms(5);  

  258.             sb=1;  

  259.             P0=0xff;  

  260.               

  261.             ss=0;  

  262.             P0=table[ge1];  

  263.             delayms(5);  

  264.             ss=1;  

  265.             P0=0xff;  

  266.               

  267.             sg=0;  

  268.             P0=table[shi1];  

  269.             delayms(5);  

  270.             sg=1;  

  271.             P0=0xff;  

  272.         }  

  273.     else  

  274.     {  

  275.             uchar ge,shi;  

  276.             ge=count%10;  

  277.             shi=count/10;  

  278.             sq=0;  

  279.             P0=table[ge];  

  280.             delayms(5);  

  281.             sq=1;  

  282.             P0=0xff;  

  283.             sb=0;  

  284.             P0=table[shi];  

  285.             delayms(5);  

  286.             sb=1;  

  287.             P0=0xff;  

  288.     }  

  289. }  

  290. void steins()             // 将设置后的数据存入时钟模块内  

  291. {  

  292.     writeset1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令  

  293.     writeset1302(0x80,((second/10)<<4|(second%10)));   //根据写秒寄存器命令字,写入秒的初始值  

  294.     writeset1302(0x82,((minute/10)<<4|(minute%10)));   //根据写分寄存器命令字,写入分的初始值  

  295.     writeset1302(0x8E,0x80);              //根据写状态寄存器命令字,写入保护指令  

  296. }  

  297. void keyscan()  

  298. {  

  299.     if(key1==0)   // 进入设定模式0 1 2 &确认设置  PS:先设置秒 后设置分  

  300.     {  

  301.         delayms(10);  

  302.         if(key1==0)  

  303.         {   while(!key1)display();  

  304.             display();  

  305.             bee();  

  306.             if(state==0)  

  307.                 {  

  308.                     led0=0;  

  309.                     led1=1;  

  310.                     led2=1;  

  311.                     state=3;  

  312.                 }  

  313.             else  

  314.                 {  

  315.                     if(state==3)  

  316.                     {  

  317.                         led0=1;  

  318.                         led1=0;  

  319.                         led2=1;  

  320.                         state=1;  

  321.                         count=second;  

  322.                     }     

  323.                     else  

  324.                     {     

  325.                         if(state==1)   //s  

  326.                         {     

  327.                             led0=1;  

  328.                             led1=1;  

  329.                             led2=0;  

  330.                             state=2;  

  331.                             second=count;  

  332.                             count=minute;  

  333.                         }  

  334.                         else  

  335.                         {  

  336.                             if(state==2)   //m  

  337.                             {     

  338.                             led2=0;  

  339.                             led1=0;  

  340.                             led0=0;  

  341.                             state=0;  

  342.                             minute=count;  

  343.                             count=0;  

  344.                             steins();  

  345.                             }  

  346.                         }  

  347.                     }  

  348.                 }  

  349.               

  350.         }  

  351.     }  

  352.     if(key3==0)    //++  

  353.     {  

  354.         delayms(10);  

  355.         if(key3==0)  

  356.         {     

  357.               

  358.             while(!key3)display();;  

  359.             display();  

  360.             bee();  

  361.             if(state==1||state==2)  

  362.                 {  

  363.                 if(count==60)  

  364.                     count=0;  

  365.                 else  

  366.                     count++;  

  367.                 }  

  368.         }  

  369.     }  

  370.     if(key4==0)    //--  

  371.     {     

  372.         delayms(10);  

  373.         if(key4==0)  

  374.         {     

  375.               

  376.             while(!key4)display();  

  377.             display();  

  378.             bee();  

  379.             if(state==1||state==2)  

  380.                 {  

  381.                 if(count==0)  

  382.                     count=60;  

  383.                 else  

  384.                     count--;  

  385.                 }  

  386.         }  

  387.     }  

  388. }  

  389.   

  390. void main()  

  391. {  

  392.     beep=1;  

  393.     led0=0;  

  394.     led1=0;  

  395.     led2=0;  

  396.     state=0;                  //引脚初始化  

  397.     initAT();                 //AT24c02初始化  

  398.     sec=read_add(2);  

  399.     second=sec%60;  

  400.     minute=sec/60;  

  401.     delayms(1);  

  402.     init_DS1302();            //DS1302初始化  

  403.     delayms(1);  

  404.     steins();                 //获取时钟数据  

  405.     while(1)  

  406.     {  

  407.         display();  

  408.         confirm();  

  409.         sec=minute*60+second;  

  410.         write_add(2,sec);  

  411.         keyscan();  

  412.     }  

  413. }  


关键字:DS1302  AT24C02  按键  数码管显示 引用地址:DS1302+AT24C02+按键数码管显示程序

上一篇:51单片机DS1302时钟芯片简单程序
下一篇:DS1302时钟与LCD1602液晶显示

推荐阅读最新更新时间:2024-03-16 16:06

Tiny4412之按键驱动
  一:按键驱动   按键驱动跟之前的LED,蜂鸣器的方法类似;通过底板,核心板我们可以看到按键的电路图:    通过电路图我们可以看出,当按键按下去为低电平,松开为高电平;所以我们要检测XEINT26的状态,通过芯片手册找到GPX3_2的说明; 有芯片手册可知:GPX3CON为0为检测,GPAC3DAT为1是高电平下面贴出代码:按键KEY1,KEY2,KEY3分别控制输出字符串,KEY4控制退出: #define GPX3CON (*(volatile unsigned long *)0x11000c60) #define GPX3DAT (*(volatile unsigned long *)0x11000c6
[单片机]
Tiny4412之<font color='red'>按键</font>驱动
基于一种可以用按键进行调节LCD背光亮度的解决方案
0 引 言 在手持式设备中,液晶显示屏的使用越来越广泛。由于LCD自身是不能发光的,它需要一个强劲的光源来给它提供背光,以便清晰地显示信息。这样的光源是非常耗电的,通常液晶显示屏的功耗常常占到系统总功耗的60%以上。以群创的7寸屏为例,通常背光灯的功耗为2.5W,而LCD的功耗只有0.825W。由此可见,背光光源的功耗在整个电源中的比重是相当高的。如果系统在不用显示屏时,也全功率的运行,系统的电池能量将很快被耗光。所以,调节LCD的背光源,降低系统在不用显示屏时的能耗是十分必要的工作。 另外,由于手持式设备工作环境的变化,也需要根据外界光线强度的变化,对背光的亮度做出相应的调节,以适合人眼观看的舒适度。 基于上述2种原因,
[单片机]
基于一种可以用<font color='red'>按键</font>进行调节LCD背光亮度的解决方案
一个相当详细的MINI2440按键驱动详解
/*mini2440_buttons_my.c*/ /*后面加了_my*/ /*按键驱动程序*/ /*mini2440所用到的按键资源*/ /**************************************************/ /* 按键 对应的IO寄存器 对应的中断引脚*/ /* K1 GPG0 EINT8 */ /* K2 GPG3 EINT11 */ /* K3 GPG5 EINT13 */ /* K4 GPG6 EINT14 */ /* K5 GPG7
[单片机]
stm32按键轮循点灯
一、实验描述及工程文件清单 1.实验描述: 按键-引脚连接:KEY1-PC5 KEY2-PC2 KEY3-PC3 LED-引脚连接:LED1-PB5 LED2-PD6 LED3-PD 用扫描的方式查询是否有按键按下:key1按下时,LED1状态取反;key2按下时,LED2状态取反;KEY3按下时,LED3状态取反。 3.库文件、用户文件: 4.USER文件: main.c、led.c、key.c、stm32f10x_it.c 二、这是我的流程图 三、代码编写 1.main.C /********************************************
[单片机]
stm32<font color='red'>按键</font>轮循点灯
AVR 单片机数码管显示时钟程序
//数码管数据P0口,数码管控制P2口 #include avr/io.h #include avr/delay.h #include avr/pgmsPACe.h #include avr/signal.h #include avr/interrupt.h #define code PROGMEM #define uchar unsigned char #define uint unsigned int code const uchar LED_7 = {0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//common of + code c
[单片机]
STM32F030C6外部中断的配置(按键触发)
配置分以下的步骤: 1、定义外部中断模式和分组的结构体; 2、打开外部中断复位时钟; 3、设置IO口与中断线的映射关系; 4、初始化线上的中断,设置触发的条件; 5、配置中断分组,并使能中断; 6、清除中断标志位; 7、编写中断服务函数;
[单片机]
STM32F030C6外部中断的配置(<font color='red'>按键</font>触发)
基于STM32和DS1302设计的时钟程序
#ifndef __DS1302_H #define __DS1302_H #include "stm32f10x.h" extern u8 d ; //依次为年,周,月,日,时,分,秒 extern u8 disp ;//依次为年 【1】;周 【3】;月 【5】 //***********************日 【7】;时 【9】;分 【11】;秒 【13】 void ds1302d_convert(void); //如果用低disp ;必须在read_time();后调用此函数; void ds1302set_time(void); //对时函数 void ds1302read_time(void); //
[单片机]
PSoC的电容式非接触感应按键设计
摘 要:非接触式操作界面正逐渐取代普通按键,成为常用的人机交互工具。使用PSOC片上系统芯片CY8C2714,结合电容式感应原理,可设计一种基于PSoC微处理器芯片的电式感应按键,实现按键的非接触式可靠设计。PSoC片上系统芯片是具有高速内核、快闪内存和SRAM数据内存的高性能芯片,具有独立的程序存储器和数据存储器总线,设计者可自配置模拟模块和数字模块。 关键词:电容式 PSoC非接触式 感应按键   电容式感应技术正在迅速成为面板操作和多媒体交互的全新应用技术,其耐用性和降低BOM成本方面的优势,使这种技术在非接触式操作界面上得到广泛的应用。本文采用PSOC片上系统芯片,实现了非接触式、稳定可靠的电容式感应按键的设计。
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved