求AVR(ATmega8L)读写DS12C887(时钟芯片)的C语言例子程序。

一、求AVR(ATmega8L)读写DS12C887(时钟芯片)的C语言例子程序。

//首次使用时下载该程序后,调节实验箱最下面的W1液晶对比度调节电位器,使液晶显示最佳。

#include

#include

#define uchar unsigned char

#define uint unsigned int

/12864端口定义/

#define LCD_data P0 //数据口

sbit LCD_RS = P3^5; //寄存器选择输入

sbit LCD_RW = P3^6; //液晶读/写控制

sbit LCD_EN = P3^4; //液晶使能控制

sbit LCD_PSB = P3^7; //串/并方式控制

sbit wela = P2^6;

sbit dula = P2^7;

sbit beep=P2^3;

sbit dscs=P1^4;

sbit dsas=P1^5;

sbit dsrw=P1^6;

sbit dsds=P1^7;

sbit dsirq=P3^3;

bit flag1,flag_ri;

uchar count,s1num,flag,t0_num,num,mm;

char miao,shi,fen,year,month,day,week,amiao,afen,ashi;

void write_ds(uchar,uchar);

void lcd_wdat(uchar);

void set_time();

#define delayNOP(); {nop();nop();nop();nop();};

//uchar IRDIS[2];

//uchar IRCOM[4];

void delay0(uchar x); //x*0.14MS

//void beep();

void lcm_word(uchar str);

void write_ds(uchar,uchar);

uchar read_ds(uchar);

void dataconv();

void lcd_pos(uchar X,uchar Y); //确定显示位置

/******************************************************************/

/* /

/ 延时函数 /

/ /

/******************************************************************/

void delay(int ms)

{

while(ms–)

{

uchar i;

for(i=0;i<250;i++)

{

nop();

nop();

nop();

nop();

}

}

}

/*****************************************************************/

/* */

/*检查LCD忙状态 */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 /

/ */

/**************************************************************/

bit lcd_busy()

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0&0x80);

LCD_EN = 0;

return(result);

}

/**************************************************************/

/* */

/*写指令数据到LCD */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /

/ */

/**************************************************************/

void lcd_wcmd(uchar cmd)

{

while(lcd_busy());

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

nop();

nop();

P0 = cmd;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

/******************************************/

/显示数字/

/******************************************/

void write_sfm(uchar add,uchar date) //时,分,秒

{

uchar shi,ge;

shi=date/10;

ge=date%10;

lcd_wcmd(0x98+add);

lcd_wdat(0x30+shi);

lcd_wdat(0x30+ge);

}

void write_nyr(uchar add,uchar date) //年,月,日

{

uchar shi,ge;

shi=date/10;

ge=date%10;

lcd_wcmd(0x89+add);

lcd_wdat(0x30+shi);

lcd_wdat(0x30+ge);

}

/**********************************************************/

/转成汉字显示/

/***********************************************************/

void lcm_word(unsigned char *str)

{

while(*str!=‘\0’)

{

//lcd_wcmd(0x9f);

lcd_wdat(*str++);

}

*str=0;

}

/***************************************************************/

/星期处理/

/**************************************************************/

void lcm_xingqi(void)

{

uchar sel;

sel=read_ds(6); //将DS12C887星期数赋给sel

lcd_wcmd(0x9f); //星期显示位置

if(sel==7)

{

lcm_word(“日”);

//lcd_wdat(0xc8); //星期日

//lcd_wdat(0xd5);

}

if(sel==6)

{

lcm_word(“六”);

//lcd_wdat(0xc1); //星期六

//lcd_wdat(0xf9);

}

if(sel==5)

{

lcm_word(“五”);

//lcd_wdat(0xce); //星期五

//lcd_wdat(0xc4);

}

if(sel==4)

{

lcm_word(“四”);

//lcd_wdat(0xcb); //星期四

//lcd_wdat(0xd5);

}

if(sel==3)

{

//lcm_word(“三”);

lcd_wdat(0xc8); //星期三

lcd_wdat(0xfd);

}

if(sel==2)

{

lcm_word(“二”);

//lcd_wdat(0xb6); //星期二

//lcd_wdat(0xfe);

}

if(sel==1)

{

lcm_word(“一”);

//lcd_wdat(0xd2); //星期一

// lcd_wdat(0xbb);

}

}

/**************************************************************/

/* */

/*写显示数据到LCD */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 /

/ */

/**************************************************************/

void lcd_wdat(uchar dat)

{

while(lcd_busy());

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

P0 = dat;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

/**************************************************************/

/* /

/ LCD初始化设定 /

/ */

/***************************************************************/

void lcd_init()

{

//uchar i;

LCD_PSB = 1; //并口方式

write_ds(0x0a,0x20);//打开振荡器;

write_ds(0x0b,0x26);

//set_time(); //在第一次设置12C887时打开

lcd_wcmd(0x34); //扩充指令操作

delay(5);

lcd_wcmd(0x30); //基本指令操作

delay(5);

lcd_wcmd(0x0C); //显示开,关光标

delay(5);

lcd_wcmd(0x01); //清除LCD的显示内容

delay(5);

/lcd_wcmd(0x88);

for(i = 0; i < 10; i++)

lcd_wdat(dis3[i]);/

}

/**********************************/

/* DS12C887时钟芯片写指令*/

/*********************************/

void write_ds(uchar add,uchar date)

{

dscs=0;

dsas=1;

dsds=1;

dsrw=1;

P0=add;

dsas=0;

dsrw=0;

P0=date;

dsrw=1;

dsas=1;

dscs=1;

}

/*******************************/

/* DS12C887读指令*/

/*******************************/

uchar read_ds(uchar add)

{

uchar ds_date;

dsas=1;

dsds=1;

dsrw=1;

dscs=0;

P0=add;

dsas=0;

dsds=0;

P0=0xff;

ds_date=P0;

dsds=1;

dsas=1;

dscs=1;

return ds_date;

}

/***********************************/

/向DS12c887内写数据/

/***********************************/

void set_time()

{

write_ds(0,50); //秒

write_ds(1,0); //秒闹铃

write_ds(2,18); //分

write_ds(3,0); //分闹铃

write_ds(4,7); //时

write_ds(5,0); //时闹铃

write_ds(6,1); //星期

write_ds(7,11); //日

write_ds(8,10); //月

write_ds(9,10); //年

}

/****************************************************/

/* /

/ 主程序 /

/ */

/****************************************************/

main()

{

uchar i;

delay(10); //延时

wela=0;

dula=0;

lcd_init(); //初始化LCD

while(1)

{

//xs();

days();

lcd_pos(1,0); //设置显示位置为第二行的第1个字符

i = 0;

while(dis2[i] != ‘\0’)

{

lcd_wdat(dis2[i]); //显示字符

i++;

}

//lcd_wcmd(0x89); //设置显示位置为第三行的第1个字符

year=read_ds(9);

month=read_ds(8);

day=read_ds(7);

week=read_ds(6);

shi=read_ds(4);

fen=read_ds(2);

miao=read_ds(0);

lcd_wcmd(0x88);

lcd_wdat(0x32);

lcd_wdat(0x30);

write_nyr(0,year);

lcd_wdat(0xc4);

lcd_wdat(0xea);

write_nyr(2,month);

lcd_wdat(0xd4);

lcd_wdat(0xc2);

write_nyr(4,day);

lcd_wdat(0xc8);

lcd_wdat(0xd5);

//lcd_wdat(0xc8);

//lcd_wdat(0xd5);

write_sfm(4,miao);

write_sfm(2,fen);

lcd_wdat(0x3a);

lcd_wdat(0x3a);

write_sfm(0,shi);

lcd_wdat(0x3a);

lcd_wdat(0x3a);

lcd_wcmd(0x9d);

lcd_wdat(0xd0);

lcd_wdat(0xc7);

lcd_wdat(0xc6);

lcd_wdat(0xda);

//write_sfm(7,week);

lcd_wcmd(0x9f);

lcm_xingqi();

}

}

/****************************************************/

/* /

/ 延时x*0.14ms子程序 /

/ */

/*****************************************************/

void delay0(uchar x) //x*0.14MS

{

uchar i;

while(x–)

{

for (i = 0; i<13; i++) {}

}

}

/*****************************************************/

/* /

/ 设定显示位置 /

/ */

/*******************************************************/

void lcd_pos(uchar X,uchar Y)

{

uchar pos;

if (X==0)

{X=0x80;}

else if (X==1)

{X=0x90;}

else if (X==2)

{X=0x88;}

else if (X==3)

{X=0x98;}

pos = X+Y ;

lcd_wcmd(pos); //显示地址

}

求AVR(ATmega8L)读写DS12C887(时钟芯片)的C语言例子程序。

二、请帮忙介绍一个带秒脉冲输出的时钟芯片

DS12887的功能特点 DS12887是美国达拉斯半导体公司最新推出的时钟芯片,采用CMOS技术制成,把时钟芯片所需的晶振和外部锂电池相关电路集于芯片内部,同时它与目前IBM AT计算机常用的时钟芯片MC146818B和DS1287管脚兼容,可直接替换。采用DS12887芯片设计的时钟电路勿需任何外围电路并具有良好的微机接口。DS12887芯片具有微轼耗、外围接口简单、精度高、工作稳定可靠等优点,可广泛用于各种需要较高精度的实时时钟场合中。其主要功能如下: (1)内含一个锂电池,断电情况运行十年以上不丢失数据。 (2)计秒、分、时、天、星期、日、月、年,并有闰年补偿功能。 (3)二进制数码或BCD码表示时间、日历和定闹。 (4)12小时或24小时制,12小时时钟模式带有PWM和AM指导,有夏令时功能。 (5)MOTOROLA5和INATAEL总线时序选择。 (6)有128个RAM单元与软件音响器,其中14个作为字节时钟和控制寄存器,114字节为通用RAM,所有ARAM单元数据都具有掉电保护功能。 (7)可编程方波信号输出。 (8)中断信号输出(IRQ)和总线兼容,定闹中断、周期性中断、时钟更新周期结束中断可分别由软件屏蔽,也可分别进行测试。

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。