📄 ds12887.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 + -