这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » net1234599 MCU DIY 进程贴

共31条 3/4 1 2 3 4 跳转至
工程师
2011-12-13 14:48:57     打赏
21楼

15.外部中断的使用
/********************************************************************
* 描述    :  外部中断,是单片机最基本也是最重要的功能。
    外部中断0端口P3.2按键,数码管加一。
    外部中断1端口P3.3按键,数码管减一。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY1 = P3^2; //s3
sbit KEY2 = P3^3; //s4

uchar Count = 0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
 uint i,j;
 for(i=0; i<del; i++)
 for(j=0; j<1827; j++)   
 ;
}

/********************************************************************
* 名称 : Outside_Init()
* 功能 : 外部中断0,1 的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Init(void)
{
 EX0 = 1;  //开外部中断0
 IT0 = 1;  //负边沿触发

 EX1 = 1;  //开外部中断1
 IT1 = 1;  //负边沿触发

 EA = 1;   //开总中断
}

/********************************************************************
* 名称 : Outside_Int1()
* 功能 : 外部中断0 的中断处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int1(void) interrupt 0 using 1
{
 Delay(2);
 if(KEY1 == 0)
 {
  Count++;
 }
 Delay(30); 
}
/********************************************************************
* 名称 : Outside_Int2()
* 功能 : 外部中断1 的中断处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int2(void) interrupt 2 using 1
{
 Delay(2);
 if(KEY2 == 0)
 {
  Count--;
 }
 Delay(30);
}
/********************************************************************
* 名称 : Main()
* 功能 : 外部中断试验主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 Outside_Init();
 while(1)
 {
  P0 = table[Count % 10];
  Delay(2);
 }
}

视频地址:http://player.youku.com/player.php/sid/XMzMyMDQwNDg4/v.swf


工程师
2011-12-13 14:54:33     打赏
22楼

16.定时器和外部中断
/********************************************************************
* 描述    :  外部中断和定时器一样,是单片机最基本也是最重要的两个功能.
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit KEY = P3^2; //s3
uchar Count = 0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
 uint i,j;
 for(i=0; i<del; i++)
 for(j=0; j<1827; j++)   
 ;
}

/********************************************************************
* 名称 : Outside_Init()
* 功能 : 外部中断0 的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Init(void)
{
 IT0 = 1;  //负边沿触发
 EX0 = 1;  //外部中断0允许
}

/********************************************************************
* 名称 : Outside_Int()
* 功能 : 外部中断0 的中断处理

* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int(void) interrupt 0
{
 Delay(3);    //延时30ms,去掉这行会出现按一下中断几次的情况
 if(KEY == 0)   //对按键进行抗干扰处理
 {
  P0 = 0xff;
 }
 Delay(100); 
}

/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ晶振,50ms
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init()
{
 TMOD = 0x01;   //定时器0选用方式1
 TH0  = 0x4c;   //初值的计算
 TL0  = 0x00; 
 TR0 = 1;    //启动定时器
 ET0 = 1;    //打开定时器中断允许位
}
          
/********************************************************************
* 名称 : Time0_Int()
* 功能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Int() interrupt 1
{
 TH0 = 0x4c;
 TL0 = 0x00;
 Count++;   //长度加1
}

/********************************************************************
* 名称 : Main()
* 功能 : 外部中断试验主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uint i = 0;
 Time0_Init();
 Outside_Init();
 EA = 1;                //打开总中断
 while(1)
 {
  P0 = table[i % 10];   //取 i 的个位
  if(Count == 20)      //当Count为 20 时,i 自加一次,20 * 50MS = 1S
  {
   Count = 0;
   i++;  
  }  
 }
}

视频地址:http://player.youku.com/player.php/sid/XMzMyMDQxNzY0/v.swf


工程师
2011-12-13 15:19:45     打赏
23楼

17.液晶1602显示
/********************************************************************
* 描述    :  该程序实现了对液晶1602的控制。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

//这三个引脚参考资料
sbit E=P2^6;  //1602使能引脚
sbit RW=P2^5;  //1602读写引脚 
sbit RS=P2^4;  //1602数据/命令选择引脚

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
 uint i,j;
 for(i=0; i<del; i++)
 for(j=0; j<1827; j++)   
 ;
}


/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay()
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}
/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
bit Busy(void)
{
 bit busy_flag = 0;
 RS = 0;
 RW = 1;
 E = 1;
 delay();
 busy_flag = (bit)(P0 & 0x80);
 E = 0;
 return busy_flag;
}
/********************************************************************
* 名称 : wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void wcmd(uchar del)
{
 while(Busy());
 RS = 0;
 RW = 0;
 E = 0;
 delay();
 P0 = del;
 delay();
 E = 1;
 delay();
 E = 0;
}

/********************************************************************
* 名称 : wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/

void wdata(uchar del)
{
 while(Busy());
 RS = 1;
 RW = 0;
 E = 0;
 delay();
 P0 = del;
    delay();
 E = 1;
 delay();
 E = 0;
}

/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
 wcmd(0x38);
 wcmd(0x0c);
 wcmd(0x06);
 wcmd(0x01);
}

/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
   L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
 uchar a;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 wcmd(a);
 wdata(sign);
}

/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
 uchar a,b=0;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 while(1)
 {
  wcmd(a++);
  b++;
  if((*p == '\0')||(b==16)) break;
  wdata(*p);
  p++;
 }
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
    while(1)
 {
    L1602_init();
    L1602_string(1,1,"www.eepw.com.cn");
    L1602_string(2,5,"MCU DIY!");
    Delay(1000);
    L1602_init();
       L1602_string(1,2,"ID:net1234599");
    L1602_string(2,1,"Welcom to world!");
    Delay(1000);
 } 
}


助工
2011-12-13 15:32:17     打赏
24楼

不错啊,写的挺全的!


工程师
2011-12-13 15:32:28     打赏
25楼

18.蜂鸣器发声
/********************************************************************
* 功能 : 通过P1.2口电平的交替变化,来控制蜂鸣器
/***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int  
sbit BELL = P1^0;     //设置P1.2口,为控制蜂鸣器发声的引脚          

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del。这是通过软件延时,有一定误差。
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
 uint i,j;
 for(i=0; i<del; i++)
 for(j=0; j<1827; j++)      
 ;
}

/********************************************************************
* 名称 : Main()
* 功能 : 实现制蜂鸣器
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 while(1)
 {
  BELL = 0;
  Delay(1);    //延时10毫秒
  BELL = 1;
  Delay(1);    //延时10毫秒
 }
}

视频地址:http://player.youku.com/player.php/sid/XMzMyMDM4OTI4/v.swf


工程师
2011-12-13 15:39:56     打赏
26楼

19.蜂鸣器间断发声
/********************************************************************
* 功能 : 通过P1.2口电平的交替变化,来控制蜂鸣器
/***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int  
sbit BELL = P1^0;     //设置P1.2口,为控制蜂鸣器发声的引脚          

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : Main()
* 功能 : 实现灯的闪烁
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uint i;
 while(1)
 {
  for(i = 0; i < 1000; i++)
  {
   BELL = 0;
   Delay(1);    //延时10毫秒
   BELL = 1;
   Delay(1);    //延时10毫秒 
  }
  Delay(1000);
 }
}

视频地址:http://player.youku.com/player.php/sid/XMzMyMDM5MDU2/v.swf


工程师
2011-12-13 15:52:34     打赏
27楼

——回复可见内容——20.蜂鸣器唱歌
/********************************************************************
* 描述    :  该程序实现控制蜂鸣器演奏音乐。    
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar Count;

sbit Speak =P1^0;      //蜂鸣器器控制脚  
/*以下数组是音符编码*/
unsigned char code SONG[] ={      //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
                                  //路边的野花不要采
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,

};

/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ晶振,10ms
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init()
{
 TMOD = 0x01;
 IE   = 0x82;
 TH0  = 0xDC;
 TL0  = 0x00;  
}

/********************************************************************
* 名称 : Time0_Int()
* 功能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Int() interrupt 1
{
 TH0 = 0xDC;
 TL0 = 0x00;
 Count++;   //长度加1
}

/********************************************************************
* 名称 : Delay_xMs()
* 功能 : 延时子程序,经过软件调试,测得延时程序大概为55us.
* 输入 : x
* 输出 : 无
***********************************************************************/
void Delay_xMs(uint x)
{
    uint i,j;
    for(i=0; i<x; i++)
    {
        for(j=0; j<3; j++);
    }
}

/********************************************************************
* 名称 : Play_Song()
* 功能 : 播放蜂鸣器控制程序
* 输入 : i (选择播放哪首歌曲,0为“祝你平安”,1为“路边的野花你不要采”
* 输出 : 无
***********************************************************************/
void Play_Song(uchar i)
{
 uchar Temp1,Temp2;
 uint Addr;
 Count = 0;      //中断计数器清0
 Addr = i * 217;
 while(1)
 {
  Temp1 = SONG[Addr++];
     if (Temp1 == 0xFF)          //休止符
     {
      TR0 = 0;
      Delay_xMs(100);
     }
     else if (Temp1 == 0x00)   //歌曲结束符
     {
      return;
     }
     else
     {
      Temp2 = SONG[Addr++];
      TR0 = 1;
     while(1)
     {
       Speak = ~Speak;
       Delay_xMs(Temp1);
       if(Temp2 == Count)
       {
        Count = 0;
        break;
       }
      }
     }
 }
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
 Time0_Init();   //定时器0中断初始化
 while(1)
 {
  Play_Song(0);  //Play_Song(0)为祝你平安   
  Delay_xMs(20000);
  Play_Song(1);  //Play_Song(1)为路边的野花你不要采
 }
}
  


工程师
2011-12-14 12:34:26     打赏
28楼

21.温度采集DS18B20
/********************************************************************
* 描述    :  该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE

sbit DQ = P1^3;            //DS18B20数据口

unsigned char TMPH,TMPL;

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay_1()
{
 int i,j;
 for(i=0; i<=10; i++)
 for(j=0; j<=2; j++)
;
}

/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint N)
{
 int i;
 for(i=0; i<N; i++)
 ;
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar Reset(void)
{
 uchar deceive_ready;
 DQ = 0;
 delay(29);
 DQ = 1;
 delay(3);
 deceive_ready = DQ;
 delay(25);
 return(deceive_ready);
}

/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
 uchar i;
 DQ = 0;
 DQ = 1;
 for(i=0; i<3; i++);
 return(DQ);
}

/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}

/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
 uchar i,m,receive_data;
 m = 1;
 receive_data = 0;
 for(i=0; i<8; i++)
 {
  if(read_bit())
  {
   receive_data = receive_data + (m << i);
  }
  delay(6);
 }
 return(receive_data);
}

/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
 uchar i,temp;
 for(i=0; i<8; i++)
 {
  temp = val >> i;
  temp = temp & 0x01;
  write_bit(temp);
  delay(5);
 }
}


/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
 float tt;
 uint temp;
 P2 = 0x00;
 while(1)
 {
  Reset();
  write_byte(jump_ROM);
  write_byte(start);
  Reset();
  write_byte(jump_ROM);
  write_byte(read_EEROM);
  TMPL = read_byte();
  TMPH = read_byte();
  temp = TMPL / 16 + TMPH * 16;
  P0 = table[temp/10%10];
  P2 = 6;
  Delay_1ms(5);
  P0 = table[temp%10];
  P2 = 7;
  Delay_1ms(5);
 }
}


工程师
2011-12-14 12:52:25     打赏
29楼

22.时钟DS1302(数码管显示)
/********************************************************************
* 描述    :  该文件实现用DS1302来实现日历和时钟功能,数码管上显示出来。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

sbit T_CLK = P3^6; /*实时时钟时钟线引脚 */
sbit T_IO = P3^4; /*实时时钟数据线引脚 */
sbit T_RST = P3^5; /*实时时钟复位线引脚 */

/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
 int i,j;
 for(i=0; i<=10; i++)
 for(j=0; j<=2; j++)
;
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 :  v_RTInputByte()
* 功能 :  往DS1302写入1Byte数据
* 输入 :  ucDa 写入的数据
* 输出 :  无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
 uchar i;
 ACC = ucDa;
 T_RST = 1;
 for(i=8; i>0; i--)
 {
  T_IO = ACC0;
  T_CLK = 1;
  T_CLK = 0;
  ACC = ACC >> 1;
 }
}

/********************************************************************
* 名称  :   uc_RTOutputByte()
* 功能  :   从DS1302读取1Byte数据
* 输入  : 无
* 返回值:   ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
 uchar i;
 T_RST = 1;
 for(i=8; i>0; i--)
 {
  ACC = ACC >>1;
  T_IO=1;
  ACC7 = T_IO;
  T_CLK = 1;
  T_CLK = 0;
 }
 return(ACC);
}

/********************************************************************
* 名称   :   v_W1302(uchar ucAddr, uchar ucDa)
* 功能   :   往DS1302写入数据
* 输入   :   ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值 :   无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(ucAddr);   // 写地址
 _nop_();
 _nop_();
 v_RTInputByte(ucDa);     // 写1Byte数据
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  uc_R1302(uchar ucAddr)
* 功能   :  读取DS1302某地址的数据
* 输入   :  ucAddr: DS1302地址
* 返回值 :  ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
 uchar ucDa;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(ucAddr);    //写地址,命令
 _nop_();
 _nop_();
 ucDa = uc_RTOutputByte(); //读1Byte数据
 T_CLK = 1;
 T_RST = 0;
 return(ucDa);
}

/********************************************************************
* 名称   :  v_BurstW1302T
* 功能   :  往DS1302写入时钟数据(多字节方式)
* 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
*          8Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B  1B
* 返回值 :  无
***********************************************************************/
void v_BurstW1302T(uchar *pSecDa)
{
 uchar i;
 v_W1302(0x8e, 0x00);          //控制命令,WP=0,写操作
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbe);          //0xbe:时钟多字节写命令
 for(i=8; i>0; i--)            //8Byte = 7Byte 时钟数据 + 1Byte 控制
 {
  v_RTInputByte(*pSecDa);   //写1Byte数据
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstR1302T(uchar *pSecDa)
* 功能   :  读取DS1302时钟数据
* 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
*             7Byte (BCD码) 1B 1B 1B 1B 1B 1B   1B
* 返回值 :  ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbf);               //0xbf:时钟多字节读命令
 for(i=8; i>0; i--)
 {
  *pSecDa = uc_RTOutputByte();   //读1Byte数据
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstW1302R(uchar *pReDa)
* 功能   :  往DS1302寄存器数写入数据(多字节方式)
* 输入   :  pReDa: 寄存器数据地址
* 返回值 :  无
***********************************************************************/
void v_BurstW1302R(uchar *pReDa)
{
 uchar i;
 v_W1302(0x8e,0x00);         //控制命令,WP=0,写操作
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xfe);       //0xbe:时钟多字节写命令
 for(i=31; i>0; i--)        //31Byte 寄存器数据
 {
  v_RTInputByte(*pReDa); //写1Byte数据
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstR1302R(uchar *pReDa)
* 功能   :  读取DS1302寄存器数据
* 输入   :  pReDa: 寄存器数据地址
* 返回值 :  无
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xff);            //0xbf:时钟多字节读命令
 for(i=31; i>0; i--)             //31Byte 寄存器数据
 {
  *pReDa = uc_RTOutputByte(); //读1Byte数据
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称  :  v_Set1302(uchar *pSecDa)
* 功能  :  设置初始时间
* 输入  :  pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
*            7Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
 uchar i;
 uchar ucAddr = 0x80;
 v_W1302(0x8e, 0x00);            //控制命令,WP=0,写操作
 for(i=7; i>0; i--)
 {
  v_W1302(ucAddr, *pSecDa);   // 秒 分 时 日 月 星期 年
  pSecDa++;
  ucAddr += 2;
 }
 v_W1302(0x8e, 0x80);            //控制命令,WP=1,写保护
}

/********************************************************************
* 名称   : v_Get1302(uchar ucCurtime[])
* 功能   : 读取DS1302当前时间
* 输入   : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
*                                         7Byte (BCD码) 1B 1B 1B 1B 1B  1B  1B
* 返回值 : 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
 uchar i;
 uchar ucAddr = 0x81;
 for(i=0; i<7; i++)
 {
  ucCurtime[i] = uc_R1302(ucAddr);    //格式为: 秒 分 时 日 月 星期 年
  ucAddr += 2;
 }
}

/********************************************************************
* 名称 : dectobcd(uchar dec)
* 功能 : DEC码转换为BCD码
* 输入 : dec码
* 输出 : bcd码
***********************************************************************/
uchar dectobcd(uchar dec)
{
 uchar bcd;
 bcd = 0;
 while(dec >= 10)
 {             
  dec -= 10;                        
  bcd++;
 }
 bcd <<= 4;
 bcd |= dec;
 return bcd;
}

/********************************************************************
* 名称 : bcdtodec(uchar bcd)
* 功能 : BCD码转换为DEC码
* 输入 : bcd码
* 输出 : dec码
***********************************************************************/
uchar bcdtodec(uchar bcd)
{
 uchar data1;
 data1 = bcd & 0x0f;     //取BCD低4位
 bcd = bcd & 0x70;       //剔除BCD的最高位和低4位。
 data1 += bcd >> 1;
 data1 += bcd >> 3;      //用位移代替乘法运算
 return data1;
}

/********************************************************************
* 名称 : Write_DS1302Init()
* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Write_DS1302Init(void)
{
 v_W1302(0x8e,0);
 v_W1302(0x80,0x59); //写入秒
 v_W1302(0x8e,0);
 v_W1302(0x82,0x59); //写入分
 v_W1302(0x8e,0);
 v_W1302(0x84,0x11); //写入小时
 v_W1302(0x8e,0);
 v_W1302(0x86,0x14); //写入日
 v_W1302(0x8e,0);
 v_W1302(0x88,0x12); //写入月
 v_W1302(0x8e,0);
 v_W1302(0x8a,0x02); //写入星期
 v_W1302(0x8e,0);
 v_W1302(0x8c,0x11); //写入年 
}

/********************************************************************
* 名称 : Run_DS1302(void)
* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Run_DS1302(void)
{
 uchar sec, min, hour, day, month, year;
 while(1)
 {
  v_W1302(0x8f, 0);
  sec = bcdtodec(uc_R1302(0x81));    //读出DS1302中的秒
  v_W1302(0x8f, 0);
  min = bcdtodec(uc_R1302(0x83));    //读出DS1302中的分
  v_W1302(0x8f, 0);
  hour = bcdtodec(uc_R1302(0x85));   //读出DS1302中的小时
  v_W1302(0x8f, 0);
  day = bcdtodec(uc_R1302(0x87));    //读出DS1302中的日
  v_W1302(0x8f, 0);
  month = bcdtodec(uc_R1302(0x89));  //读出DS1302中的月
  v_W1302(0x8f, 0);
  year = bcdtodec(uc_R1302(0x8d));   //读出DS1302中的年

  P0 = table[hour / 10 % 10];
  P2 = 0;
  Delay_1ms(2);
  P0 = table[hour % 10];
  P2 = 1;
  Delay_1ms(2);
  P0 = 0x80;
  P2 = 2;
  Delay_1ms(2);
  P0 = table[min / 10 % 10];
  P2 = 3;
  Delay_1ms(2);
  P0 = table[min % 10];
  P2 = 4;
  Delay_1ms(2);
  P0 = 0x80;
  P2 = 5;
  Delay_1ms(2);
  P0 = table[sec / 10 % 10];
  P2 = 6;
  Delay_1ms(2);
  P0 = table[sec % 10];
  P2 = 7;
  Delay_1ms(2);
 }
}

/********************************************************************
* 名称 : Main(void)
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 Write_DS1302Init();
 Run_DS1302();
}


工程师
2011-12-14 13:01:05     打赏
30楼

23.时钟DS1302(LCD显示)
/********************************************************************
* 描述    :  该文件实现用DS1302来实现日历和时钟功能,液晶1602上显示出来。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

sbit T_CLK = P3^6; /*实时时钟时钟线引脚 */
sbit T_IO = P3^4; /*实时时钟数据线引脚 */
sbit T_RST = P3^5; /*实时时钟复位线引脚 */

//这三个引脚参考资料
sbit E=P2^6;  //1602使能引脚
sbit RW=P2^5;  //1602读写引脚 
sbit RS=P2^4;  //1602数据/命令选择引脚

/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay()
{
 int i,j;
 for(i=0; i<=10; i++)
 for(j=0; j<=2; j++)
;
}


/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/

void enable(uchar del)
{
 P0 = del;
 RS = 0;
 RW = 0;
 E = 0;
 delay();
 E = 1;
 delay();
}

/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/

void write(uchar del)
{
 P0 = del;
 RS = 1;
 RW = 0;
 E = 0;
 delay();
 E = 1;
 delay();
}

/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
 enable(0x01);
 enable(0x38);
 enable(0x0c);
 enable(0x06);
 enable(0xd0);
}

/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
   L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
 uchar a;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 enable(a);
 write(sign);
}

/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
 uchar a;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 enable(a);
 while(1)
 {
  if(*p == '\0') break;
  write(*p);
  p++;
 }
}

/********************************************************************
* 名称 :  v_RTInputByte()
* 功能 :  往DS1302写入1Byte数据
* 输入 :  ucDa 写入的数据
* 输出 :  无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
 uchar i;
 ACC = ucDa;
 T_RST = 1;
 for(i=8; i>0; i--)
 {
  T_IO = ACC0;
  T_CLK = 1;
  T_CLK = 0;
  ACC = ACC >> 1;
 }
}

/********************************************************************
* 名称  :   uc_RTOutputByte()
* 功能  :   从DS1302读取1Byte数据
* 输入  : 无
* 返回值:   ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
 uchar i;
 T_RST = 1;
 for(i=8; i>0; i--)
 {
  ACC = ACC >>1;
  T_IO=1;
  ACC7 = T_IO;
  T_CLK = 1;
  T_CLK = 0;
 }
 return(ACC);
}

/********************************************************************
* 名称   :   v_W1302(uchar ucAddr, uchar ucDa)
* 功能   :   往DS1302写入数据
* 输入   :   ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值 :   无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(ucAddr);   // 写地址
 _nop_();
 _nop_();
 v_RTInputByte(ucDa);     // 写1Byte数据
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  uc_R1302(uchar ucAddr)
* 功能   :  读取DS1302某地址的数据
* 输入   :  ucAddr: DS1302地址
* 返回值 :  ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
 uchar ucDa;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(ucAddr);    //写地址,命令
 _nop_();
 _nop_();
 ucDa = uc_RTOutputByte(); //读1Byte数据
 T_CLK = 1;
 T_RST = 0;
 return(ucDa);
}

/********************************************************************
* 名称   :  v_BurstW1302T
* 功能   :  往DS1302写入时钟数据(多字节方式)
* 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
*          8Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B  1B
* 返回值 :  无
***********************************************************************/
void v_BurstW1302T(uchar *pSecDa)
{
 uchar i;
 v_W1302(0x8e, 0x00);          //控制命令,WP=0,写操作
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbe);          //0xbe:时钟多字节写命令
 for(i=8; i>0; i--)            //8Byte = 7Byte 时钟数据 + 1Byte 控制
 {
  v_RTInputByte(*pSecDa);   //写1Byte数据
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstR1302T(uchar *pSecDa)
* 功能   :  读取DS1302时钟数据
* 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
*             7Byte (BCD码) 1B 1B 1B 1B 1B 1B   1B
* 返回值 :  ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbf);               //0xbf:时钟多字节读命令
 for(i=8; i>0; i--)
 {
  *pSecDa = uc_RTOutputByte();   //读1Byte数据
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstW1302R(uchar *pReDa)
* 功能   :  往DS1302寄存器数写入数据(多字节方式)
* 输入   :  pReDa: 寄存器数据地址
* 返回值 :  无
***********************************************************************/
void v_BurstW1302R(uchar *pReDa)
{
 uchar i;
 v_W1302(0x8e,0x00);         //控制命令,WP=0,写操作
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xfe);       //0xbe:时钟多字节写命令
 for(i=31; i>0; i--)        //31Byte 寄存器数据
 {
  v_RTInputByte(*pReDa); //写1Byte数据
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstR1302R(uchar *pReDa)
* 功能   :  读取DS1302寄存器数据
* 输入   :  pReDa: 寄存器数据地址
* 返回值 :  无
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xff);            //0xbf:时钟多字节读命令
 for(i=31; i>0; i--)             //31Byte 寄存器数据
 {
  *pReDa = uc_RTOutputByte(); //读1Byte数据
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称  :  v_Set1302(uchar *pSecDa)
* 功能  :  设置初始时间
* 输入  :  pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
*            7Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
 uchar i;
 uchar ucAddr = 0x80;
 v_W1302(0x8e, 0x00);            //控制命令,WP=0,写操作
 for(i=7; i>0; i--)
 {
  v_W1302(ucAddr, *pSecDa);   // 秒 分 时 日 月 星期 年
  pSecDa++;
  ucAddr += 2;
 }
 v_W1302(0x8e, 0x80);            //控制命令,WP=1,写保护
}

/********************************************************************
* 名称   : v_Get1302(uchar ucCurtime[])
* 功能   : 读取DS1302当前时间
* 输入   : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
*                                         7Byte (BCD码) 1B 1B 1B 1B 1B  1B  1B
* 返回值 : 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
 uchar i;
 uchar ucAddr = 0x81;
 for(i=0; i<7; i++)
 {
  ucCurtime[i] = uc_R1302(ucAddr);    //格式为: 秒 分 时 日 月 星期 年
  ucAddr += 2;
 }
}

/********************************************************************
* 名称 : dectobcd(uchar dec)
* 功能 : DEC码转换为BCD码
* 输入 : dec码
* 输出 : bcd码
***********************************************************************/
uchar dectobcd(uchar dec)
{
 uchar bcd;
 bcd = 0;
 while(dec >= 10)
 {             
  dec -= 10;                        
  bcd++;
 }
 bcd <<= 4;
 bcd |= dec;
 return bcd;
}

/********************************************************************
* 名称 : bcdtodec(uchar bcd)
* 功能 : BCD码转换为DEC码
* 输入 : bcd码
* 输出 : dec码
***********************************************************************/
uchar bcdtodec(uchar bcd)
{
 uchar data1;
 data1 = bcd & 0x0f;     //取BCD低4位
 bcd = bcd & 0x70;       //剔除BCD的最高位和低4位。
 data1 += bcd >> 1;
 data1 += bcd >> 3;      //用位移代替乘法运算
 return data1;
}

/********************************************************************
* 名称 : Write_DS1302Init()
* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Write_DS1302Init(void)
{
 v_W1302(0x8e,0);
 v_W1302(0x80,0x00); //写入秒
 v_W1302(0x8e,0);
 v_W1302(0x82,0x59); //写入分
 v_W1302(0x8e,0);
 v_W1302(0x84,0x12); //写入小时
 v_W1302(0x8e,0);
 v_W1302(0x86,0x14); //写入日
 v_W1302(0x8e,0);
 v_W1302(0x88,0x12); //写入月
 v_W1302(0x8e,0);
 v_W1302(0x8a,0x03); //写入星期
 v_W1302(0x8e,0);
 v_W1302(0x8c,0x11); //写入年 
}

/********************************************************************
* 名称 : Run_DS1302(void)
* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Run_DS1302(void)
{
 uchar sec, min, hour, day, month, year;
 while(1)
 {
  v_W1302(0x8f, 0);
  sec = bcdtodec(uc_R1302(0x81));    //读出DS1302中的秒
  v_W1302(0x8f, 0);
  min = bcdtodec(uc_R1302(0x83));    //读出DS1302中的分
  v_W1302(0x8f, 0);
  hour = bcdtodec(uc_R1302(0x85));   //读出DS1302中的小时
  v_W1302(0x8f, 0);
  day = bcdtodec(uc_R1302(0x87));    //读出DS1302中的日
  v_W1302(0x8f, 0);
  month = bcdtodec(uc_R1302(0x89));  //读出DS1302中的月
  v_W1302(0x8f, 0);
  year = bcdtodec(uc_R1302(0x8d));   //读出DS1302中的年

  L1602_char(2, 6, hour / 10 % 10 + 48);
  L1602_char(2, 7, hour % 10 + 48);
  L1602_char(2, 8, '-');
  L1602_char(2, 9, min / 10 % 10 + 48);
  L1602_char(2, 10, min % 10 + 48);
  L1602_char(2, 11, '-');
  L1602_char(2, 12, sec / 10 % 10 + 48);
  L1602_char(2, 13, sec % 10 + 48);
  L1602_char(1, 8, year / 10 % 10 + 48);
  L1602_char(1, 9, year % 10 + 48);
  L1602_char(1, 10, '-');
  L1602_char(1, 11, month / 10 % 10 + 48);
  L1602_char(1, 12, month % 10 + 48);
  L1602_char(1, 13, '-');
  L1602_char(1, 14, day / 10 % 10 + 48);
  L1602_char(1, 15, day % 10 + 48);
 }

}

/********************************************************************
* 名称 : Main(void)
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 L1602_init();
 L1602_string(1,1,"DAYS 20");
 L1602_string(2,1,"TIME");
 Write_DS1302Init();
 Run_DS1302();
}


共31条 3/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]