sbit K2=P3^5; sbit K3=P3^6;
//加 //减
sbit K4=P3^7; //确定
uchar tCount=0;
uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; uchar *WEEK[]={%uchar LCD_DSY_BUFFER1[]={\显示格式 uchar LCD_DSY_BUFFER2[]={%uchar DateTime[7]; //所读取的日期时间
char Adjust_Index=-1; //当前调节的时间对象:,,分,是,日,月,年
(1,2,3,4,6)
uchar Change_Flag[]= \ //(分,时,日,月,年)(不调节秒与
周)
/*---------延时程序------------------*/ void DelayMS(uint ms) {
uchar i;
while(ms--){for(i=0;i<120;i++);} }
//-----------向DS1302写入一字节------------------// void Write_A_Byte_TO_DS1302(uchar x) { uchar i;
for(i=0;i<8;i++){
IO=x&0x01; //每一位与1与存入IO中
SCLK=1;SCLK=0; //一个高脉冲将数据送入液晶控制器
21 / 53
} }
x>>=1; // 右移
//-----------从DS1302读取一字节------------------// uchar Get_A_Byte_FROM_DS1302() { uchar i,b=0x00; for(i=0;i<8;i++){
b |= _crol_((uchar)IO,i); }
return b/16*10+b; //返回BCD码 }
//-----------从DS1302指定位置读数据------------------// uchar Read_Data(uchar addr) {
uchar dat;
RST = 0;SCLK=0;RST=1;
//RST高电平时读/写
SCLK=1;SCLK=0;
//每一个高脉冲读取一位数据
Write_A_Byte_TO_DS1302(addr); //先写入地址 dat = Get_A_Byte_FROM_DS1302(); SCLK=1;RST=0; return dat; }
//---------向DS1302某地址写入数据--------------------// void Write_DS1302(uchar addr,uchar dat) { SCLK=0;RST=1;
Write_A_Byte_TO_DS1302(addr);
22 / 53
Write_A_Byte_TO_DS1302(dat); SCLK=0;RST=0; }
//--------------设置时间----------------// void SET_DS1302() { uchar i;
//写控制字,取消写保护 Write_DS1302(0x8E,0x00); //分时日月年依次写入 for(i=1;i<7;i++)
{ //分的起始地址10000010(0x82),后面依次是时,日,月,周,年,写入
地址每次递增2
Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]));
//高脉冲写入数据
}
Write_DS1302(0x8E,0x80); //加保护 }
//----------读取当前日期时间------------// void GetTime() {uchar i;
for(i=0;i<7;i++){ DateTime[i]=Read_Data(0X81+2*i);} }
//-----------读LCD状态------------------// uchar Read_LCD_State() { uchar state;
RS=0;RW=1;EN=1; //输出:D0~D7=状态字 DelayMS(1);
23 / 53
state=P0; //从P0口读LCD状态
EN = 0;DelayMS(1); return state; }
//-----------忙等待------------------// void LCD_Busy_Wait() {
while((Read_LCD_State()&0x80)==0x80); DelayMS(5); }
//-----------向LCD写数据------------------// void Write_LCD_Data(uchar dat) {
LCD_Busy_Wait(); RS=1;EN=0;RW=0;
//写数据,EN为高脉冲,
P0=dat;EN=1;DelayMS(1);EN=0; }
//-------------写LCD指令-------------------// void Write_LCD_Command(uchar cmd) {
LCD_Busy_Wait();
RS=0;EN=0; RW=0; //写指令,EN高脉冲,输出:D0~D7=数据 P0=cmd;EN=1;DelayMS(1);EN=0; }
//-------------LCD初始化-------------------//
24 / 53
void Init_LCD() {
Write_LCD_Command(0x38); //设置16*2显示,5*7点阵,8位数据接口 DelayMS(1);
Write_LCD_Command(0x01); //显示清零,数据指针清零 DelayMS(1);
Write_LCD_Command(0x06); //写一个字符后地址指针自动加1 DelayMS(1);
Write_LCD_Command(0x0c); //设置开显示,不显示光标 DelayMS(1); }
//------------------------------------------ //设置液晶显示位置
//------------------------------------------ void Set_LCD_POS(uchar p){
Write_LCD_Command(p|0x80);//相当于在0x80基础上加入位置量 }
//----在LCD上显示字符串---------// void Display_LCD_String(uchar p,uchar *s) {
uchar i;
Set_LCD_POS(p); for(i=0;i<16;i++) { }
25 / 53
Write_LCD_Data(s[i]); //在固定位置显示时间日期 DelayMS(1);