/***************************************************
* License: Full Free under GPL *
* Author: Dailizhou in HIT *
* URL: http://www.dailzh.net *
****************************************************/
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
sbit KSET = P3^4; /* key 1 */
sbit KINC = P3^5; /* key 2 */
sbit KDEC = P1^6; /* key 3 */
sbit DSET = P1^7; /* DISP MODE */
#define key_down 0 /* key press down: GND */
#define key_up 1 /* key lift up : VCC */
sbit ALARM=P1^0; /* indicate lamp LED */
sbit POWER=P1^1; /* display power switch */
sbit SDA = P1^5;
sbit SCL = P1^4;
unsigned char code db[26]=
{ 0x3F,0x06,0x5B,0x4F,0X66,0x6D,0x7D,0x07,0x7F,0X6F,0x00,
/* 0 1 2 3 4 5 6 7 8 9 NULL */
0x6E,0x79,0x77,0x37,0x5C,0x54,0x1C,0x76,0x5E,0x39,0x40,
/* Y E A M o n u H d C - */
0x38,0x48,0x04,0x0E };
/* L = i j*/
unsigned char dv[6],j,df;
bit ksetf, kdecf, kincf, dsetf,kf;
unsigned char year,month,day,hour,minute,second,week;
unsigned char adj;
/**************** IIC Access Function *******************/
/* Author: Dai LiZHou */
/* Date: 1999.8.24 */
/* Last Date: 1999.8.24 */
/********************************************************/
/********** Function Declare Begin **********************/
char Start(); /* Start IIC bus for reading or writing*/
void Stop(); /* Stop IIC bus */
char Shin(); /* Shift a byte from EEPROM, */
/* most significant first */
void Shout(char Byte); /* Shift a byte to EEPROM */
char TestAck(); /* check if Acknowledge bit is valid */
char RandomRead(char DeviceAddr, char ByteAddr);
void RandomWrite(char DeviceAddr, char ByteAddr, char Byte);
char SRead( char DeviceAddr, char ByteAddr, char ByteNum, char ReadBuf[] );
/*
void PageWrite(char DeviceAddr, char ByteAddr, char ByteNum, char ByteBuf[] );
*/
/********** Function Declare End *************************/
char Start()
{
SCL=1; /* release SCL */
SDA=1; /* release SDA */
_nop_();
if( SCL==0 || SDA==0 ) return 0; /* IIC bus not available, Start false */
else
{
SCL=1; /* Send start operation */
_nop_();
_nop_();
SDA=0; /* SDA high-to-low when SCL high */
_nop_();
_nop_();
_nop_(); /*one cycle delay function */
_nop_(); /*declare in <intrins.h> */
_nop_();
SCL=0;
_nop_();
SDA=1; /*release SDA */
}
} /*return with SDA high, SCL low */
void Stop()
{
SDA=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1; /* SDA low-to-high when SCL high, return with SCL SDA high */
}
char Shin()
{
char i,RetByte;
for(i=0;i<8;i++)
{
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
RetByte<<=1;
if( SDA ) RetByte++;
}
SCL=0;
_nop_();
_nop_(); /* return with SCL low, SDA high */
SDA=1;
return RetByte;
}
void Shout( char Byte )
{ /* Send one byte to EEPROM */
/* most significant */
char i;
for(i=0;i<8;i++)
{
SCL=0;
_nop_();
if( Byte&0x80 ) SDA=1;
else SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
Byte<<=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
SCL=0;
_nop_();
_nop_();
SDA=1; /* return with SCL low , SDA high */
}
char TestAck()
{
char rf=0; /* return flag */
SCL=0;
_nop_();
SDA=1; /* release SDA */
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if( SDA==1 ) rf=1; /* Acknowledge bit is invalid*/
else rf=0;
SCL=0;
_nop_();
SDA=1; /* return with SCL low, and SDA high*/
}
char RandomRead( char DeviceAddr, char ByteAddr )
{
char rc=0;
Start();
Shout( DeviceAddr&0xFE ); /* send device address & write command */
if( !TestAck() )
{
Shout( ByteAddr ); /* send byte address to read */
if( !TestAck() )
{
Start();
Shout( DeviceAddr|0x01 ); /* send read command */
if( !TestAck() )
rc=Shin();
TestAck();
}
}
Stop();
return rc;
}
char SRead( char DeviceAddr, char ByteAddr, char ByteNum, char ReadBuf[] )
{
char i;
Start();
Shout( DeviceAddr&0xFE );
if( !TestAck() )
{
Shout( ByteAddr );
if( !TestAck() )
{
Start();
Shout( DeviceAddr|0x01 );
if( !TestAck() )
for(i=0;i<ByteNum-1;i++)
{
ReadBuf[i]=Shin();
SCL=0;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
SDA=1;
}
ReadBuf[i]=Shin();
TestAck();
}
}
Stop();
}
void RandomWrite( char DeviceAddr, char ByteAddr, char Byte)
{
Start();
Shout( DeviceAddr&0xFE ); /* write command */
if( !TestAck() )
{
Shout( ByteAddr );
if( !TestAck() )
Shout( Byte );
TestAck();
}
Stop();
}
/*
void PageWrite(char DeviceAddr, char ByteAddr, char ByteNum, char ByteBuf[])
{
char i=0;
Start();
Shout( DeviceAddr&0xFE );
if( !TestAck() )
{
Shout( ByteAddr );
if( !TestAck() )
do
{
Shout( ByteBuf[i] );
i++;
}while( !TestAck() && i<ByteNum );
}
Stop();
}
*/
void READINT() interrupt 0{
char rb[3];
SRead( 0xA0,2,3,rb);
j=rb[0];
j=RandomRead( 0xA0,2);
dv[0]=j&0x0F;
dv[1]=j>>4;
j=rb[1];
j=RandomRead( 0xA0,3);
dv[2]=j&0x0F;
dv[3]=j>>4;
j=rb[2];
j=RandomRead( 0xA0,4);
dv[4]=j&0x0F;
dv[5]=j>>4;
df=1;
hour=dv[5]*10+dv[4];
minute=dv[3]*10+dv[2];
second=dv[1]*10+dv[0];
}
void disp(){
signed char i;
for(i=5;i>=0;i--){
TI=0;
SBUF = db[ dv[i] ];
while( !TI );
TI = 0;
}
}
void setdisp( char s1,char s2,char s3,char sv ){
dv[5]=s1;
dv[4]=s2;
dv[3]=s3;
dv[2]=23;
dv[1]=sv/10;
dv[0]=sv%10;
disp();
}
void del_10(){
signed int delay;
for( delay=0; delay<18000; delay++) _nop_();
}
void get_key(){
kf=0;
if( KSET==key_down ){
del_10();
if( KSET==key_down ) ksetf = key_down, kf=1;
else ksetf = key_up;
}
else ksetf = key_up;
if( KINC==key_down ){
del_10();
if( KINC==key_down ) kincf = key_down, kf=1;
else kincf = key_up;
}
else kincf = key_up;
if( KDEC==key_down ){
del_10();
if( KDEC==key_down ) kdecf = key_down, kf=1;
else kdecf = key_up;
}
else kdecf = key_up;
if( DSET==key_down ){
del_10();
if( DSET==key_down ) dsetf = key_down, kf=1;
else dsetf = key_up;
}
else dsetf = key_up;
}
void setdate(){
unsigned char v;
char wb[7];
EA=0;
POWER=0;
kf=1;
do{
if(kf) kf=0, setdisp( 11,12,13, year );
get_key();
if( kincf==key_down ){ year++; if( year>99 ) year=0;}
if( kdecf==key_down ){ year--; if( year>99 ) year=99;}
}while(ksetf==key_up);
kf=1;
do{
if(kf) kf=0, setdisp( 14,15,16, month );
get_key();
if( kincf==key_down ){ month++; if( month>12 ) month=1; }
if( kdecf==key_down ){ month--; if( month>12 ) month=12;}
}while(ksetf==key_up);
kf=1;
do{
if(kf) kf=0, setdisp( 19,13,11, day );
get_key();
if( kincf==key_down ){ day++; if( day>31 ) day=1; }
if( kdecf==key_down ){ day--; if( day>31 ) day=31;}
}while(ksetf==key_up);
kf=1;
do{
if(kf) kf=0, setdisp( 18,15,17, hour );
get_key();
if( kincf==key_down ){ hour++; if( hour>23 ) hour=0; }
if( kdecf==key_down ){ hour--; if( hour>23 ) hour=23;}
}while(ksetf==key_up);
kf=1;
do{
if(kf) kf=0, setdisp( 14,24,16, minute );
get_key();
if( kincf==key_down ){ minute++; if( minute>59 ) minute=0; }
if( kdecf==key_down ){ minute--; if( minute>59 ) minute=59;}
}while(ksetf==key_up);
kf=1;
do{
if(kf) kf=0, setdisp( 5,12,20, second );
get_key();
if( kincf==key_down ){ second++; if( second>59 ) second=0; }
if( kdecf==key_down ){ second--; if( second>59 ) second=59;}
}while(ksetf==key_up);
kf=1;
do{
if(kf) kf=0, setdisp( 17,12,12, week );
get_key();
if( kincf==key_down ){ week++; if( week>6 ) week=0; }
if( kdecf==key_down ){ week--; if( week>6 ) week=6; }
}while(ksetf==key_up);
year=(year+1900)%4;
RandomWrite(0xA0,0,0x80); /* disable counter */
RandomWrite(0xA0,1,0);
v=second/10;
v<<=4;
v|=second%10;
RandomWrite(0xA0,2,v);
v=minute/10;
v<<=4;
v|=minute%10;
RandomWrite(0xA0,3,v);
v=hour/10;
v<<=4;
v|=hour%10;
RandomWrite(0xA0,4,v);
v=year<<2;
v|=day/10;
v<<=4;
v|=day%10;
RandomWrite(0xA0,5,v);
v=week&0x07;
v<<=1;
v|=month/10;
v<<=4;
v|=month%10;
RandomWrite(0xA0,6,v);
RandomWrite( 0xA0,0,0 );
POWER=1;
EA=
PCF8583和MCS51的接口(IIC)的程序.rar_MCS51 IIC_pcf8583
版权申诉
173 浏览量
2022-09-24
19:48:06
上传
评论
收藏 3KB RAR 举报
邓凌佳
- 粉丝: 66
- 资源: 1万+
最新资源
- anaconda安装Web-ma笔记
- 酷狗top500数据分析完整
- 天气数据爬虫以及可视化分析
- unity shadergraph 特效案例del-for-network-ids-mas开发笔记
- 用户空间操作I2C适配器从而与I2C设备通信
- 2_base.apk.1.1
- 32位alu设计实验logisim-ma开发笔记
- Tangram-ES 0.17.1 64位 Debug/Release版 基于OpenGL地图渲染引擎
- 2018 各系统CNC 数据采集方法-5718b19bb868a98271fe910ef12d2af90342a827.pdf
- 【知识付费小程序源码】可开激励广告流量主+虚拟资源变现+搭建教程.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈