}
2、Lcd程序(1602)
#include"aduc848.h"
sbitRS=P3^6;
sbitRW=P3^5;//位定义
sbitEN=P3^3;
voiddelay(unsignedintz);延时函数声明
voidwrite_com(unsignedcharcom);LCD显示位置函数声明
voidwrite_data(unsignedchardate);写数据函数声明
voidinit();
P3:
控制位P0:
数据位
RW=0:
写允许RW=1:
读允许
RS=0:
写地址RS=1:
写数据
P0口=com:
P0口输出显示位置的地址
P0口=data:
P0口输出数据的地址
EN=1:
从1602显示到LCD屏
EN=0:
关掉显示以便显示下一个数据
voidinit()//初始化
{
RS=0;
RW=0;
EN=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
}
voiddelay(unsignedintz)//延时函数延时时间=Z*110
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(unsignedcharcom)//
{
RS=0;
RW=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
voidwrite_data(unsignedchardate)
{
RS=1;
RW=0;
P0=date;
delay(5);
EN=1;
delay(5);
EN=0;
}
3、iic程序(RTC)//实时时钟
#include"aduc848.h"
voidiic_start(void);
voidiic_stop(void);
voidiic_ack(void);
bitread_ack(void);
voidiic_nack();
unsignedcharget_byte(void);
voidout_byte(unsignedchardd);
voidIIC_Delay_us(unsignedinttimes);
voidReadTime(unsignedcharTIME[7]);
voidSetTime(unsignedcharTIME[7]);
voidSwitchRTC(unsignedcharSWITCH);
voidReadTime(unsignedcharTIME[7])
{
bitEATemp;
unsignedchartemp;
EATemp=EA;
iic_start();
out_byte(0xd0);
read_ack();
out_byte(0x00);
read_ack();
iic_stop();
IIC_Delay_us
(1);
iic_start();
out_byte(0xd1);
read_ack();
TIME[0]=get_byte();
iic_ack();
TIME[1]=get_byte();
iic_ack();
TIME[2]=get_byte();
iic_ack();
TIME[3]=get_byte();
iic_ack();
TIME[4]=get_byte();
iic_ack();
TIME[5]=get_byte();
iic_ack();
TIME[6]=get_byte();
iic_nack();
iic_stop();
IIC_Delay_us
(1);
TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f);//second
TIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f);//minute
if(TIME[2]&0x40)
{
if(TIME[2]&0x20)temp=0x80;elsetemp=0x40;
TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f);//hour
TIME[2]|=temp;
}
else
{
TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f);
}
TIME[3]=TIME[3]&0x07;//week
TIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f);//date
TIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f);//month
TIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f);//year
EA=EATemp;
}
voidSetTime(unsignedcharTIME[7])
{
bitEATemp;
unsignedchartemp=0;
unsignedcharTimeTemp[7];
EATemp=EA;
for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp];
temp=0;
TimeTemp[6]=((TimeTemp[6]/10)<<4)+(TimeTemp[6]%10);//Year
TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10);//Month
TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10);//Day
TimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10);//Week
if((TimeTemp[2]&0xc0)==0x00)//Hour
{
TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);
}
else
{
if((TimeTemp[2]&0xc0)==0x01)temp=0x40;elsetemp=0x60;
TimeTemp[2]&=0x3f;
TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);
TimeTemp[2]|=temp;
}
TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTemp[1]%10);//Minute
TimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTemp[0]%10);//Second
TimeTemp[0]&=0x7f;
iic_start();
out_byte(0xd0);
read_ack();
out_byte(0x00);
read_ack();
out_byte(TimeTemp[0]);
read_ack();
out_byte(TimeTemp[1]);
read_ack();
out_byte(TimeTemp[2]);
read_ack();
out_byte(TimeTemp[3]);
read_ack();
out_byte(TimeTemp[4]);
read_ack();
out_byte(TimeTemp[5]);
read_ack();
out_byte(TimeTemp[6]);
read_ack();
iic_stop();
IIC_Delay_us
(1);
EA=EATemp;
}
voidSwitchRTC(unsignedcharSWITCH)
{
unsignedchartemp;
bitEATemp;
EATemp=EA;
iic_start();
out_byte(0xd0);
read_ack();
out_byte(0x00);
read_ack();
iic_stop();
//IIC_Delay_us
(1);
iic_start();
out_byte(0xd1);
read_ack();
temp=get_byte();
iic_nack();
iic_stop();
//IIC_Delay_us
(1);
if(SWITCH)temp&=0x7f;
elsetemp|=0x80;
iic_start();
out_byte(0xd0);
read_ack();
out_byte(0x00);
read_ack();
out_byte(temp);
read_ack();
iic_stop();
//IIC_Delay_us
(1);
EA=EATemp;
}
voidiic_start(void)
{
MDE=1;
MDO=1;
//IIC_Delay_us
(2);
MCO=1;
//IIC_Delay_us
(2);
MDO=0;
//IIC_Delay_us
(2);
}
voidiic_stop(void)
{
MDE=1;
MDO=0;
//IIC_Delay_us
(2);
MCO=1;
//IIC_Delay_us
(2);
MDO=1;
}
voidiic_ack(void)
{
MDE=1;
MCO=0;
MDO=0;
//IIC_Delay_us
(2);
MCO=1;
//IIC_Delay_us
(2);
MCO=0;
//IIC_Delay_us
(1);
MDO=1;
}
bitread_ack(void)
{
bitflag;
MCO=0;
//IIC_Delay_us
(2);
MDE=1;
MDO=1;
MCO=1;
//IIC_Delay_us
(2);
MDE=0;
flag=MDI;
MCO=0;
returnflag;
}
voidiic_nack()
{
MDE=1;
MDO=1;
//IIC_Delay_us
(2);
MCO=1;
//IIC_Delay_us
(2);
MCO=0;
}
/***********************************************************************************
*函数名:
get_byte;
*描述:
从IIC总线获取一个字节;
*输入:
none;
*返回值:
一字节数据;
*注释:
none;
************************************************************************************/
unsignedcharget_byte(void)//输入一个字节
{
unsignedchardd;
inti;
dd=0;
MDE=1;
MDO=1;
MDE=0;
for(i=0;i<8;i++)
{
MCO=0;
IIC_Delay_us
(1);
MCO=1;
//IIC_Delay_us
(1);
dd<<=1;
if(MDI)dd|=0x01;
}
MCO=0;
return(dd);
}
/***********************************************************************************
*函数名:
out_byte;
*描述:
向IIC总线输出一个字节;
*输入:
一字节数据
*返回值:
none;
*注释:
none;
************************************************************************************/
voidout_byte(unsignedchardd)//输出一个字节
{
unsignedchari;
MDE=1;
for(i=0;i<8;i++)
{
MCO=0;
//IIC_Delay_us(0);
MDO=(dd&0x80)>>7;
IIC_Delay_us
(1);
MCO=1;
//IIC_Delay_us(3);
dd<<=1;
}
MCO=0;
}
/***********************************************************************************
*函数名:
IIC_Delay_us;
*描述:
IIC总线延时函数;
*输入:
延时参数
*返回值:
none;
*注释:
none;
************************************************************************************/
voidIIC_Delay_us(unsignedinttimes)
{
unsignedinti;
unsignedcharDelayJs;
for(i=0;i}
4、主程序(Prj6)
#include"aduc848.h"
#include"KeyProcess.h"
#include"rtc.h"
#include"LCD1602.h"
unsignedcharCurrentTime[7]={55,59,21,6,23,04,11};
unsignedcharClockSetSave1[3]={10,00,22},ClockSetSave2[3]={20,00,22};
unsignedcharcodetable[7]={0x53,0x4d,0x48,0x59,0x6d,0x44,0x57};
unsignedcharcodetable1[4]={0x20,0x53,0x4d,0x48};
unsignedcharKeyValue,ClockKeyValue,shijianzhi=0;
unsignedcharSetMode=0;
unsignedcharShowMode=0;
unsignedcharClock=1,ClockSet=0,FinishClockSet1=0,FinishClockSet2=0,ClockEn1=0,ClockEn2=0;
unsignedinti=0;
voidKeyProcess();
voidstop()
{
P1&=0xf0;
P2|=0x0f;
P2&=0xfe;
if((P1&0x08)==0)
{
P2&=0xfe;
}
}
voidmain()
{
PLLCON&=0xf8;//设置频率为12.58MHz
CFG848|=0x01;//使用片内xram
init();
I2CCON=0xE8;//配置IIC为软件主发送模式