#include #include"define.H" #include"Delayms.h" #include"LCD1602.h" #include"I2C.h" #include"dulikey.h" uchar code clock1[]="I Like Clock"; //液晶第一排 uchar clock[]={23,59,50}; //时间缓冲区 uchar tim; //加20次 等于1秒 bit wrmiao=0; //写秒标记,定时器中断中用 uchar *rdadd=clock; //指向时间缓冲区的指针 void main() { uchar i; //循环用的变量 TMOD= 0x11; /*T1工作方式2,T0工作方式1*/ TH0=0x4c; /*T0装初值定时50ms*/ TL0=0x00; // Write(rdadd,1,3); //////////////////////////调试初始化时间用的 Delayms(1000); //上电后等电压稳定 Read(rdadd,1,3); /*从I2C器件第1个存储区开始,连续读取3个字节,放入时间缓冲区中*/ Lcd_init(); /*LCD1602液晶初始化函数*/ Lcd_wr_com(0x80+2); /*设置LCD数据地址指针.*/ for(i=0;i<12;i++) { Lcd_wr_data(clock1); //LCD写数据函数 } Lcd_wr_com(0x80+0x46); /*设定显示第二行的LCD数据地址指针*/ Lcd_wr_data(0x3a); //LCD写数据":" Lcd_wr_com(0x80+0x49); /*设定显示第二行的LCD数据地址指针*/ Lcd_wr_data(0x3a); //LCD写数据":" Lcd_pos(clock[0],0x44); //LCD写数据 时 Lcd_pos(clock[1],0x47); //LCD写数据 分 Lcd_pos(clock[2],0x4a); //LCD写数据 秒 EA = 1; /*开中断*/ ET0 = 1; TR0 = 1; /*启动T0*/ while(1) { if (wrmiao == 1) //1秒标记,定时器中断50ms*20次; { clock[2]++; //秒+1 P1 = clock[2]; //送流水灯显示 wrmiao = 0; //写秒标记清零 if (clock[2]==60) //秒 = 60? { clock[2]=0; //秒=60!秒=0; clock[1]++; //分+1 if (clock[1]==60) //分 = 60? { clock[1]=0; //分=60!分=0; clock[0]++; //时+1 if (clock[0]==24) //时= 24? { clock[0]=0; //时=24!时=0; } rdadd=clock; //时间缓冲区指针初始化 Write(rdadd,1,1); //I2C写 时 Lcd_pos(clock[0],0x44);//LCD液晶写 时 } rdadd=clock; //时间缓冲区指针初始化 rdadd++; //指针,指向 分 Write(rdadd,2,1); //I2C写 分 Lcd_pos(clock[1],0x47);//LCD液晶写 分 } rdadd=clock; //时间缓冲区指针初始化 rdadd+=2; //指针,指向 秒 Write(rdadd,3,1); //I2C写 秒 Lcd_pos(clock[2],0x4a);//LCD液晶写 秒 } rdadd=clock; //时间缓冲区指针初始化 Key(rdadd); //调用键盘扫描函数,传递时间缓冲区指针 } } void Time0 () interrupt 1 /*T0中断服务程序*/ { TH0=0x4c; /*T0装初值定时50ms*/ TL0=0x00; tim++; if (tim==20) { tim=0; wrmiao=1; } }
/********************************************************* 文件名称:DuLikey.C 主控芯片:STC89C52RC 功能描述:按键检测程序 函数名称:Key() 返 回 值:key键码为1-4;错误码0; 作者日期:田卫卫 / 2013年2月13日 版 本:V1.1 *********************************************************/ #include #include"define.H" #include"dulikey.h" #include"Delayms.h" #include"LCD1602.h" #include"I2C.h" ***it s1 = P3^0; ***it s2 = P3^1; ***it s3 = P3^2; uchar s1num; void Key(uchar *go) { /**************************中断法检测按键代码:开始**************************/ RD = 0; if (s1==0) /*判断按键按下?*/ { Delayms(10); /*按键按下持续时间,单位ms*/ if (s1==0) { while (!s1); //按键释放等待 Delayms(10); //延时 s1num++; if (s1num>5) //防出错处理 { s1num = 0; Lcd_wr_com(0x0c); Write(go,1,3); ////////////////////////// TR0 = 1; } } } else { switch (s1num) //功能模式处理,判断当前是设置:时?分?秒?,调整指针指向。 { case 1: //功能键1次:停止计时,时 闪烁 TR0 = 0; Lcd_wr_com(0x80+0x44); Lcd_wr_com(0x0f); break; case 2: //功能键2次:指针指向分,分闪烁 go++; Lcd_wr_com(0x80+0x47); break; case 3: //功能键3次:指针指向秒,秒闪烁 go+=2; Lcd_wr_com(0x80+0x4a); break; case 4: //功能键4次:清零功能键,显示正常,写I2C保存设置,开始计时; s1num = 0; Lcd_wr_com(0x0c); Write(go,1,3); ////////////////////////// TR0 = 1; break; default: break; } if (s1num!=0) { uchar temp; //++++++++++++++++++++ if (s2 == 0) { Delayms(10); if (s2 == 0) { while(!s2); *go+=1; if (s1num == 1) { if (*go == 24) { *go=0; } } else { if (*go == 60) { *go = 0; } } } } //-------------------- if (s3 == 0) { Delayms(10); if (s3 == 0) { while(!s3); Delayms(10); *go-=1; if (s1num == 1) { if (*go == -1) { *go = 23; } } else { if (*go == -1) { *go = 59; } } } } switch (s1num) { case 1: temp = *go; Lcd_pos(temp,0x44); //LCD液晶写时 Lcd_wr_com(0x80+0x45); Delayms(10); break; case 2: temp = *go; Lcd_pos(temp,0x47); //LCD液晶写分 Lcd_wr_com(0x80+0x48); Delayms(10); break; case 3: temp = *go; Lcd_pos(temp,0x4a); //LCD液晶写秒 Lcd_wr_com(0x80+0x4b); Delayms(10); break; } } } } |