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

📄 ds12887.c

📁 DS12887 总线式驱动程序 51单片机
💻 C
字号:
/*统计 blog名称:zl0801的笔记
日志总数:201
评论数量:81
留言数量:0
访问次数:6106
建立时间:2006年6月4日
*/
//2006-6-7 7:29:00 ds12887c语言驱动程序 
/****************ds12887 时钟日历芯片调试******************/
/****************作者:赵亮 2005-8-16 18:58**************/
//8-17 修改
/*
管脚配置:
mot:接地
cs:接地 地址:0x0000
as:接单片机 ale
r/w:接 rw
ds: 接 rd
reset: 接高
irq:空
sqw: 空
*/

     
#include <reg51.h> 
#include <absacc.h>

     /*************************/
#define tm_sec XBYTE[0x0000] 
#define tm_min XBYTE[0x0002] 
#define tm_hou XBYTE[0x0004] 
#define day XBYTE[0x0006] 
#define date XBYTE[0x0007] 
#define month XBYTE[0x0008] 
#define year XBYTE[0x0009] 

     #define am_sec XBYTE[0x0001] 
#define am_min XBYTE[0x0003] 
#define am_hou XBYTE[0x0005] 

     #define reg_a XBYTE[0x000a] 
#define reg_b XBYTE[0x000b]
#define reg_c XBYTE[0x000c]
#define reg_d XBYTE[0x000d]

     /********************************************************************/
#define lcdio	P0
#define line1	0
#define line2	1
#define high	1
#define low 	0
#define clearscreen	lcd_en_command(0x01)
#define lcd_delay_time	40
/*******************************************************************/
sbit rs=P1^2;//数据、命令选择1:数据 0:指令4脚 
sbit rw=P1^1;//读、写操作选择1:读 0:写5脚
sbit e=P1^0;//使能信号6脚
/********************************************************************/
void lcd_delay(void);
void lcd_en_command(unsigned char command);
void lcd_en_dat(unsigned char temp);
void lcd_set_xy( unsigned char x, unsigned char y );
void lcd_write_char( unsigned x,unsigned char y,unsigned char dat);
void lcd_write_string(unsigned char x,unsigned char y,unsigned char *s);
void lcd_init(void);
/********************************************************************/
void set_calendar(void);
void read_calendar(void);
void start_calendar(void);
void display_calendar(void);

     void stop_calendar(void);

     /********************************************************************/
void delay_nms(unsigned int n);
/********************************************************************/

     code unsigned char calendar_day[7][3]={"mon","tue","wen","thu","fri","sat","sun"}; 
unsigned char calendar_time[7]={05,8,16,18,58,55,0};/* 05/8/16 18:58:00 星期二*/ 
code unsigned char at[7]={9,8,7,4,2,0,6};/* 年、月、日、时、分、秒 、星期*/
unsigned char xdata *calendar_address=0x0000;

     void main(void)
{
lcd_init(); 
set_calendar(); 
start_calendar();
//stop_calendar();
while(1)
{
read_calendar(); 

display_calendar();
}
}
/********************************************************************/
/******************** lcd part *************************************/
void lcd_delay(void)//延时子函数 
{
unsigned char i;
for(i=lcd_delay_time;i>0;i--);//保证lcd复位的最小延时
}

     void lcd_en_command(unsigned ch
ar command)//写命令函数
{
lcdio=command;
rs=low; 
rw=low;
e=low;
lcd_delay();
e=high;
}
     void lcd_en_dat(unsigned char dat)//写数据函数
{
lcdio=dat;
rs=high;
rw=low;
e=low;
lcd_delay();
e=high;
}

     void lcd_set_xy( unsigned char x, unsigned char y ) //设置地址函数
{
unsigned char address;
if (y == 0) 
address = 0x80 + x;
else 
address = 0xc0 + x;
lcd_en_command(address); 
}

     void lcd_write_char( unsigned x,unsigned char y,unsigned char dat)//写字符函数
{
lcd_set_xy( x, y ); 
lcd_en_dat(dat);
}

     void lcd_write_string(unsigned char x,unsigned char y,unsigned char *s)//写字符串函数
{
lcd_set_xy( x, y ); //写地址 
while (*s) // 写显示字符
{
lcdio=*s;
lcd_en_dat(*s); 
s ++;
}
}

     void lcd_init(void)//初始化子函数
{
clearscreen;//清屏
lcd_en_command(0x38);//设置8位串数据格式
lcd_en_command(0x0c);//开显示器
lcd_en_command(0x80);//显示起始地址
clearscreen;//清屏
}
/********************************************************************/

     void set_calendar(void) //设置系统时间
{
unsigned char i;
reg_b=0x80; 
for(i=0;i<9;i++)
*(calendar_address+at[i])=calendar_time[i];

}

     void read_calendar(void) //读取系统时间
{
unsigned char temp,i; 
reg_b=0x06;
do{ temp=reg_a;} 
while(temp&0x80);
for(i=0;i<7;i++)
calendar_time[i]=*(calendar_address+at[i]); 

}

     void start_calendar(void) //启动时钟
{
reg_a=0x20;
reg_b=0x06;
}
/********************************************************************/
void display_calendar(void)
{
lcd_write_string(0,line1," ");

lcd_write_string(0,line1,"20 - - ");
lcd_write_char(0x02,line1,(calendar_time[0]/10)|0x30);
lcd_write_char(0x03,line1,(calendar_time[0]%10)|0x30);
lcd_write_char(0x05,line1,(calendar_time[1]/10)|0x30);
lcd_write_char(0x06,line1,(calendar_time[1]%10)|0x30);
lcd_write_char(0x08,line1,(calendar_time[2]/10)|0x30);
lcd_write_char(0x09,line1,(calendar_time[2]%10)|0x30);
if(calendar_time[6]==1)
lcd_write_string(0x0d,line1,"mon");
if(calendar_time[6]==2)
lcd_write_string(0x0d,line1,"tue");
if(calendar_time[6]==3)
lcd_write_string(0x0d,line1,"wen");
if(calendar_time[6]==4)
lcd_write_string(0x0d,line1,"thu");
if(calendar_time[6]==5)
lcd_write_string(0x0d,line1,"fri");
if(calendar_time[6]==6)
lcd_write_string(0x0d,line1,"sat");
if(calendar_time[6]==7)
lcd_write_string(0x0d,line1,"sun");

lcd_write_string(0,line2," : :"); 
lcd_write_char(0x08,line2,(calendar_time[3]/10)|0x30);
lcd_write_char(0x09,line2,(calendar_time[3]%10)|0x30);
lcd_write_char(0x0b,line2,(calendar_time[4]/10)|0x30);
lcd_write_char(0x0c,line2,(calendar_time[4]%10)|0x30);
lcd_write_char(0x0e,line2,(calendar_time[5]/10)|0x30);
lcd_write_char(0x0f,line2,(calendar_time[5]%10)|0x30);
}

     void stop_calendar(void)
{
reg_a=0x70;
}														    	

⌨️ 快捷键说明

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