⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 DS1302+LCD试验模块D S1302+LCD试验模块DS1302+LCD试验模块
💻 C
字号:
/*********************************************************
模块名称:DS1302+LCD试验模块
创 建 人:luoway  
创建日期:2007年3月28日
功能描述:LCD演示
说    明:此模块在51_MCU Borad1.0上验证通过,晶振使用11.0592M
*********************************************************/

#include <REGX51.H>

typedef unsigned char uchar;
typedef unsigned int  uint;

//定义LCD引脚
#define LCD_RS     P2_1            //定义RS引脚。寄存器选择脚,1是数据;0是命令
#define LCD_RW     P2_2            //定义引脚    读写操作选择,1读  0写
#define LCD_E      P2_3            //定义使能脚  使能信号
#define LCD_PSB    P2_4            //H并,L串
#define LCD_RST    P2_5            //复位
#define LCD_Data   P0              //数据总线


//定义DS1302引脚
#define DS_CLK   P1_7           //定义DS1302 时钟输入端口
#define DS_DAT   P1_5           //定义DS1302 串行数据输入输出端口(双向)
#define DS_RST   P1_6           //定义DS1302 复位/片选端口
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
unsigned char inittime[7]={0x06,0x10,0x12,0x27,0x03,0x07,0x05};

uchar code CG[]={0x08, 0x1f, 0x02, 0x0f, 0x0a, 0xff, 0x02, 0x00, // 年
                 0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x13, 0x00, // 月
                 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x0f, 0x00, // 日
                 } ;       
               
                 

void  initlcd(void);
void  delay(uint n);
void  WriteCommand(uchar cmd,busyflag);
void  WriteData(uchar Data);
uchar Readlcdstatus(void);
void  DisplayOneChar(uchar X, uchar Y, uchar s);
void  lcdpos(uchar XPOS,uchar YPOS);
void  DisplayChar(uchar X,uchar Y,uchar *s);
void  lcdfill(uchar s);

uchar DS1302Read(uchar address);
void  DS1302Write(uchar address,uchar number);

main()
{
  uchar sec;
 // P1_5=1;   ////                        
 // P1_6=0;                               
  initlcd();                            //液晶初始化
  DisplayChar(80,0,"DS1302时钟实验");


  DS1302Write(0x8E,0x00);//取消写保护
  DS1302Write(0x80,0x00);

  if (DS1302Read(0x81)==0x80&&DS1302Read(0x83)==0x00) {DS1302Write(0x80,0x00);}    //如果分和秒都为初始状态,则初始化1302,开始走时  
  while(1)
  {
  sec=DS1302Read(0x85);
  DisplayOneChar(0,1,sec/16+0x30);
  DisplayOneChar(1,1,sec%16+0x30);

  sec=DS1302Read(0x83);
  DisplayOneChar(3,1,sec/16+0x30);
  DisplayOneChar(4,1,sec%16+0x30);
  
  sec=DS1302Read(0x81);
  DisplayOneChar(6,1,sec/16+0x30);
  DisplayOneChar(7,1,sec%16+0x30);
  
  }


}



void delay(uint n)
{
while(--n);
}


/********************************************************
函数名称:液晶模块初始化函数
功能描述:LCD初始化
全局变量:无
参数说明:无
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
---------------------------------------------------------
初始化设置命令,0 0 1 DL N F * *  
DL=1 8位数据接口 DL="04位数据接口":
N=1 二行显示     N="0一行显示"
F=1 5*10点阵显示 F="05"*7点阵显示
---------------------------------------------------------
显示开关控制命令:0 0 0 0 1 D C B
D:表示显示开关 D="1开"  D=0关
C:光标显示开关 C="1开"  C=0关
B:表示闪烁开关 B="1开"  B=0关
---------------------------------------------------------
输入方式设置命令:0 0 0 0 0 1 N S
N=1:数据读写后,地址指针自动加1,且光标加1
N=0:数据读写后,地址指针自动减1,且光标减1
S=1:数据读写操作,显示屏左移(N=1)或右移(N=0),以得到光标不
动,而屏幕移动的效果。
S=0:当写一个字符,整屏不动
********************************************************/
void initlcd(void)
{
  /*延时15ms以上*/
  delay(2500);                     //延时15ms
  WriteCommand(0x3c,0);            //初始化设置,8位数据接口模式,两行显示,5*7点阵字符:
  delay(600);                      //延时5ms以上
  WriteCommand(0x3C,0);
  delay(600);                      //延时5ms以上
  WriteCommand(0x3C,0);
  delay(100);
  WriteCommand(0x3c,1);            
  WriteCommand(0x01,1);            //清屏
  WriteCommand(0x06,1);            //屏幕不动,光标加1
  WriteCommand(0x0c,1);            //显示开,光标关
}


/********************************************************
函数名称:液晶模块写指令函数
功能描述:向LCD写入指令
全局变量:无
参数说明:cmd:命令字  busyflag:忙检测,0不检测 1检测
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void WriteCommand(uchar cmd, busyflag)
{
  if(busyflag) Readlcdstatus();            //检测忙标志
  
  LCD_RS=0;
  LCD_RW=0;
  LCD_E =1;            //使能LCD命令输送
  delay(1);                                          //短暂延时
  LCD_Data=cmd;                                    //送出命令值
  LCD_E=0; 
  LCD_PSB =1; 
  LCD_RST=1;                                        //关闭LCD使能

}


/********************************************************
函数名称:液晶模块写数据函数
功能描述:向LCD写入数据
全局变量:无
参数说明:data:写入的数据
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void WriteData(uchar Data)
{
  Readlcdstatus();
  LCD_RS=1; 
  LCD_RW=0;            //设置为数据输入状态
  LCD_Data=Data;                  //送入数据
  LCD_E =1;                              //使能LCD
  delay(1);                              //短暂延时
  LCD_E=0;                              //关闭LCD使能
}


/********************************************************
函数名称:读LCD忙状态函数
功能描述:读取LCD状态
全局变量:无
参数说明:无
返回说明:返回LCD数据,类型是UCHAR
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
uchar Readlcdstatus(void)
{
  LCD_Data=0Xff;                    //
  LCD_RS=0;  
  LCD_RW=1;                         //设置LCD为读取数据状态
  LCD_E= 1; 
  LCD_PSB=1;						//使能LCD
  LCD_RST=1;                             
  while((LCD_Data&0x80)==0x80);     //检测忙
  LCD_E=0;                          //关闭使能
  return(LCD_Data);                 //返回LCD数据
}

/********************************************************
函数名称:按指定位置显示一个字符
功能描述:按指定位置显示一个字符
全局变量:无
参数说明:X行  Y列  S显示字符
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, uchar s)
{
   lcdpos(X,Y);                   //根据参数定位
   WriteData(s);                  //写入字符数据
}

/********************************************************
函数名称:定位函数
功能描述:定位函数
全局变量:无
参数说明:X行  Y列
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void lcdpos(uchar XPOS,uchar YPOS)
{  XPOS&=0x0f;
   YPOS&=0x03;
   if(YPOS==0x00)
      WriteCommand(XPOS|0x80,1);
   else if(YPOS==0x01)
      WriteCommand((XPOS+0x40)|0x80,1);
}

/********************************************************
函数名称:按指定位置显示一个字符串
功能描述:按指定位置显示一个字符串
全局变量:无
参数说明:X行  Y列  S显示字符串
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void DisplayChar(uchar X,uchar Y,uchar *s)
{
   uchar XPOS;  
   for(XPOS=X;XPOS<16;XPOS++)
   {  lcdpos(XPOS,Y);
      WriteData(*s);
      s++;
   }
}

/********************************************************
函数名称:用某一字符全屏填充屏幕
功能描述:用某一字符全屏填充屏幕
全局变量:无
参数说明:S填充字符
返回说明:无
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void lcdfill(uchar s)
{
   uchar XPOS,YPOS;
   for(YPOS=0;YPOS<2;YPOS++)
      for(XPOS=0;XPOS<16;XPOS++)
      {  lcdpos(XPOS,YPOS);
         WriteData(s);  }
}


/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
uchar DS1302Read(uchar address)
{
  uchar i;
  DS_CLK=0;                                                //复位各脚
  DS_DAT=0;
  DS_RST=0;
  DS_RST=1;                                                //允许读写数据
  for (i=8;i>0;i--)                                    //地址输入,8位
  {
    DS_CLK=0;                                          //上升沿数据输入
    DS_DAT=address&0x01;                        //送出一位数据
    address>>=1;                                    //右移一位
     DS_CLK=1;                                          //上升沿
  }
  
  for (i=8;i>0;i--)                                    //数据读出
  {
    DS_CLK=0;                                          //下降沿数据读出
     address>>=1;                                    //把数据右移
     if (DS_DAT)      address=address|0x80;      //读取数据
    DS_CLK=1;                                          
     DS_CLK=1;
  }
                                                           //时钟置高位
  DS_CLK=1;                                                //片选无效
  DS_RST=0;
  return(address);
}


/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:luoway
版    本:1.0
说    明:
********************************************************/
void DS1302Write(uchar address,uchar number)
{
  uchar i;
  DS_CLK=0;
  DS_DAT=0;
  DS_RST=0;
  DS_RST=1;
  /*地址输入*/
  for (i=16;i>0;i--)
  {
     DS_CLK=0;
    if (i>8)
     {
       DS_DAT=address&0x01;
      address=address>>1;
     }
     else
     {
       DS_DAT=number&0x01;
      number>>=1;
     }
    DS_CLK=1;
  }

  DS_CLK=1;
  DS_RST=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -