📄 pcf8563.txt
字号:
{
x=0; //列起始
y ^= 1; //行切换
}
}
}
/*****************************************************************
*功能: m1602复位
*形参: 无
*返回值:无
*备注: 无
*****************************************************************/
void m1602_Rst()
{
Delay5ms(); //延时15ms
Delay5ms();
Delay5ms();
m1602_WrC( 0x38,0 ); //置显示模式
Delay5ms(); //连续三次
m1602_WrC( 0x38,0 ); //不检测忙信号
Delay5ms();
m1602_WrC( 0x38,0 );
//----------------------//以后每次都要检测忙信号
m1602_WrC( 0x38,1 ); //写指令(指令号,1-检测忙信号 0-不检测)
m1602_WrC( 0x08,1 ); //关显示
m1602_WrC( 0x01,1 ); //显显示屏
m1602_WrC( 0x06,1 ); //读/写一字符后,地址/光标均加一
m1602_WrC( 0x0c,1 ); //开显示
}
/*****************************************************************
*功能: m1602上电初始化
*形参: 无
*返回值:无
*备注: 无
*****************************************************************/
void m1602_PowerUp( void )
{
Delay400ms(); //启动延时,等待LCD进入工作状态
m1602_Rst(); //LCD复位
Delay5ms(); //延时5MS,开始显示
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// I2C总线驱动程序+PCF8563驱动-------PCF8563-Drivers.c
//定义F0为非应答标志位
/*******************************************************
电路连接:
SDA --> P3.5
SCL --> P3.4
ACK --> P3.7
*******************************************************/
//注:当收不到ACK应答时,P3.7为低电平,D4亮
/********************************************************
*函数说明:
* void I2C_Str( void )
* void I2C_Stop( void )
* void MAck( void )
* void CAck( void )
* void I2C_WrC( byte dd )
* byte I2C_RdC( void )
* void I2C_WrS( byte sla,byte *ss,byte n)
* void I2C_RdS( byte sla,byte *ss,byte n)
********************************************************/
#define DELAY5US _nop_();_nop_();_nop_();_nop_();_nop_();
byte idata timeR[] = "00:00:00";
byte idata dateR[] = "00/00/00 - 0";
byte idata TimeDate[7];
sbit sda = P3^5;
sbit scl = P3^4;
sbit ACKt = P3^7;
/********************************************************
* 名称:起始位函数
* 形参:无
********************************************************/
void I2C_Str( void )
{
sda = 1;
scl = 1; //启动I2C总线
DELAY5US
sda = 0; //拉下SDA
DELAY5US //I2C总线要求起止建立时间>4us
scl = 0; //拉下SCL
}
/********************************************************
* 名称:停止位函数
* 形参:无
********************************************************/
void I2C_Stop( void )
{
sda = 0; //停止I2C总线传送
scl = 1; //释放SCL
DELAY5US
sda = 1; //释放SDA
}
/********************************************************
* 名称:ACK信号发送函数
* 形参:无
* 备注:F0的值会影响发出的应答信号
********************************************************/
void MAck( void ) //发出ACK信号
{
sda = F0; //由F0决定给应答标志或非应答标志
scl = 1;
scl = 0;
sda = 0;
}
/********************************************************
* 名称:ACK信号检测函数
* 形参:无
* 备注:调用此函数后,影响F0
********************************************************/
void CAck( void ) //检测ACK信号
{
sda = 1; //释放数据总线
scl = 1;
F0 = sda; //将ACK信号存入F0标志位中
scl = 0;
sda = 0;
if( F0 ) ACKt = 0;
}
/********************************************************
* 功能:向总线上写一个字节,并检测ACK
* 形参:所写的内容
********************************************************/
void I2C_WrC( byte dd )
{
byte temp,n=8;
temp = dd;
while( n-- )
{
if( (temp & 0x80) == 0x80 ) sda = 1;
else sda = 0;
scl = 1;
scl = 0;
temp = temp << 1;
}
CAck();
}
/********************************************************
* 功能:从总线上读取一个字节,同时给出ACK
* 形参:无
* 返回值:读到的字节
********************************************************/
byte I2C_RdC( void )
{
byte temp,n=8;
sda=1;
while( n-- )
{
temp = temp << 1;
scl = 1;
if( sda ) temp = temp | 0x01;
scl = 0;
}
MAck();
return(temp);
}
/********************************************************
* 功能:从总线上读取若干字节
* 形参:字节地址,数据指针,字节个数
* 返回值:读到的数据由指针返回
********************************************************/
void Rd_time( void )
{
byte *p,n=7;
p = TimeDate;
I2C_Str();
I2C_WrC( 0xa2 );
I2C_WrC( 0x02 );
I2C_Str(); //重启动
I2C_WrC( 0xa3 );
while( n-- )
{
if( n ) F0 = 0; //传送完一个字节,发出一个应答信号
else F0 = 1; //当全部字节传送结束,给出非应答信号
*p = I2C_RdC();
p++;
}
I2C_Stop();
//时间/日期格式转换
TimeDate[0] &= 0x7f;
TimeDate[1] &= 0x7f;
TimeDate[2] &= 0x3f;
TimeDate[3] &= 0x3f;
TimeDate[4] &= 0x07;
TimeDate[5] &= 0x1f;
timeR[0] = (TimeDate[2] >> 4) + '0';
timeR[1] = (TimeDate[2] & 0x0f) + '0';
timeR[3] = (TimeDate[1] >> 4) + '0';
timeR[4] = (TimeDate[1] & 0x0f) + '0';
timeR[6] = (TimeDate[0] >> 4) + '0';
timeR[7] = (TimeDate[0] & 0x0f) + '0';
timeR[8] = 0;
dateR[0] = (TimeDate[6] >> 4) + '0';
dateR[1] = (TimeDate[6] & 0x0f) + '0';
dateR[3] = (TimeDate[5] >> 4) + '0';
dateR[4] = (TimeDate[5] & 0x0f) + '0';
dateR[6] = (TimeDate[3] >> 4) + '0';
dateR[7] = (TimeDate[3] & 0x0f) + '0';
dateR[11]= (TimeDate[4] & 0x07) + '0';
dateR[12]= 0;
}
void I2C_WrS(byte dz,byte dd)
{
I2C_Str();
I2C_WrC( 0xa2 );
I2C_WrC( dz );
I2C_WrC( dd );
I2C_Stop();
}
void PCF8563_Up(void)
{
// byte m;
I2C_WrS( 0x0e, 0x81);
I2C_WrS(0x0f,64);
I2C_WrS(0x01,0x11);
I2C_WrS(0x00,0x00);
/* I2C_Str();
I2C_WrC( 0xa2 );
I2C_WrC( 0x02 );
for(m = 0;m<7;m++)
I2C_WrC(0x03);
I2C_Stop();
/* I2C_WrC(0x01,0x00); //清控制寄存器1,使其工作于普通模式
I2C_WrC(0x09,0x80); //清分报警
I2C_WrC(0x0A,0x80); //清时报警
I2C_WrC(0x0B,0x80); //清日报警
I2C_WrC(0x0C,0x80); //清星期报警
// I2C_WrC(0x0D,0x00);//CLKOUT端高阻
// I2C_WrC(0x0E,0x03);//定时器倒计时关*/
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 4*4矩阵键盘驱动程序——KEY-Drivers.c
/********************************************************
适用于YT51DP-01单片机实验板
作者:严铜
连接:
------------------------------------
P1.0 P1.1 P1.2 P1.3
p1.4 S1 S5 S9 S13
P1.5 S2 S6 S10 S14
P1.6 S3 S7 S11 S15
P1.7 S4 S8 S12 S16
------------------------------------
********************************************************/
//uchar jps; //键盘缓存
bit Key_F1,Key_F2; //键扫描标志位
/*键盘扫描程序1,检查是否有按键*/
uchar keyfun()
{
uchar key_c;
P1 = 0xf0;
key_c = P1;
if(key_c == 0xf0)
{
Key_F2 = 1;
return (0);
}
else return(1);
}
/*键盘扫描程序2,确定按键数值*/
uchar keyscan()
{
uchar idata i,k,key_s;
for(i=0 ; i<4 ;i++)
{
P1 = ~(0x10 << i);
k = P1;
if((k & 0x0f) == 0x0f) continue;
else
{
key_s = ((~k) & 0x0f) >> 1;
if(key_s == 0x04) key_s = 0x03;
key_s *= 4;
key_s += i+1;
}
return key_s;
}
}
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(15ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 3 /*当定时器中断时执行此函数*/
{
byte jps;
TH1=(0xffff-15000)/256; /*T1初始化*/
TL1=(0xffff-15000)%256;
// WR = 1;
if( Key_F1 && keyfun() && Key_F2 )
{
Key_F2 = 0;
// WR = 0;
jps = keyscan();
set_time( jps );
}
Key_F1 = keyfun();
}
/**********************************************************************
函数功能: 定时器上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void T1_PowerUp(void)
{
TMOD = 0x10; /*Time1/1为16计数器*/
TH1=(0xffff-15000)/256; /*10ms*/
TL1=(0xffff-15000)%256; /*10ms*/
TR1=1;
IE=0x89; /*EA=1 ET1=1*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -