#include"c8051f330.h"
#include"zlg7289.h"
#define uchar unsigned char
void DelayMs(unsigned int n) //延时(n)MSk
{
unsigned int i;
for(;n>0;n--)
{
for(i=1200;i>0;i--);
}
}
void SysClkInit(void)//系统时钟初始化
{
OSCICL=OSCICL+4;//设置片内振荡器为24MHz
OSCICN|=0x02;//选择内部高频振荡二分频,12MHz
}
void SystemInit(void)//系统设置初始化
{
PCA0MD&=~0x40;//禁止看门狗定时器
EA=1;//开中断
}
void PortInit(void)//端口初始化
{
// P0MDIN=0xfc; //配置P0口输入方式,0:对应的 P0.n 引脚被配置为模拟输入
P0MDOUT=0xfd; //配置P0口输出方式,0:对应的p0.n输出为漏极开路,P0.1输出漏极开路
P1MDIN=0xff; //默认即为0xff
P1MDOUT=0xff; //配置P1口输出方式,1:对应的P1.n输出为推挽方式
// P0SKIP=0x02; //配置P0口被交叉开关跳过的端口:P0.0,P0.1
// XBR0=0x00;
XBR1|=0x40;//交叉开关使能
}
void timer0_Init(void)//定时器0初始化
{
TH0=(65536-10000)/256; //置初值,定时10ms
TL0=(65536-10000)%256;
CKCON=0x00; //定时器时钟控制寄存器 2:T0M时钟选择位,0由分频位定义时钟;1系统时钟
//1~0:定时器0/1分频位,00:12分频;01:4分频;10:48分频;11:外部时钟8分频
TMOD=0x01; //定时器方式寄存器:01选择定时器方式1
ET0=1; //定时器0中断允许
}
uchar period=100;//定时器定时100ms,经过100次中断实现1s定时
uchar time;//定时次数
uchar sec;//秒计时
uchar min;//分计时
uchar hour;//小时计时
//定时器0中断程序,时分秒进位
void timer0(void) interrupt 1 using 1{
TH0=(65536-10000)/256; //置初值,定时10ms
TL0=(65536-10000)%256;
// if(ZLG7289_pinINT!=0)//无按键按下
// {
if(time<period-1)
time++;
else if(time==period-1)
{
time=0;
if(sec<59)
sec++;
else if(sec>=59)
{
sec=0;
if(min<59)
min++;
else if(min>=59)
{
min=0;
if(hour<23)
hour++;
else if(hour>=23)
hour=0;
}
}
}
// }
}
void anjian(void)
{
uchar i;
uchar s,m,h;
uchar a,b;
while (ZLG7289_pinINT==0)//有键按下
{ DelayMs(100);
// TR0=0;//关定时器
while(ZLG7289_key()==10)//选择时分秒位
{
if(i<1)
i++;
else if(i>=1)
i=0;
DelayMs(200);
ZLG7289_Download(1,0,0,i);
ZLG7289_Download(1,1,0,i);
ZLG7289_Download(1,2,0,i);
ZLG7289_Download(1,3,0,i);
}
while(ZLG7289_key()==11)//11键按下
{
if(i==0)
{
if(h>=23) h=0;
else if(h<23) h++;
hour=h;
a=h/10;
b=h%10;
DelayMs(200);
ZLG7289_Download(1,0,0,i);
ZLG7289_Download(1,1,0,i);
ZLG7289_Download(1,2,0,a);
ZLG7289_Download(1,3,0,b);
}
else if(i==1)//分设定
{
if(m>=59) m=0;
else if(m<59) m++;
min=m;
a=m/10;
b=m%10;
DelayMs(200);
ZLG7289_Download(1,0,0,i);
ZLG7289_Download(1,1,0,i);
ZLG7289_Download(1,2,0,a);
ZLG7289_Download(1,3,0,b);
}
/* else if(i==2)//秒设定
{
if(s>=59) s=0;
else if(s<59) s++;
sec=s;
a=s/10;
b=s%10;
DelayMs(200);
ZLG7289_Download(1,0,0,i);
ZLG7289_Download(1,1,0,0);
ZLG7289_Download(1,2,0,a);
ZLG7289_Download(1,3,0,b);
}
// else s=m=h=0;*/
}
}
}
void main(void){
uchar shi[2];
uchar fen[2];
uchar miao[2];
int c=0;
SysClkInit();
SystemInit();
PortInit();
timer0_Init();
TR0=1;//开定时器
while(1){
// TR0=1;
anjian();
shi[1]=hour/10;
shi[0]=hour%10;
fen[1]=min/10;
fen[0]=min%10;
miao[1]=sec/10;
miao[0]=sec%10;
DelayMs(100);
if((ZLG7289_pinINT==0)&(ZLG7289_key()==15))
{
if(c==0) c++;
else if(c==1)c=0;
}
if(c==0)
{
ZLG7289_Download(1,0,0,shi[1]);
ZLG7289_Download(1,1,0,shi[0]);
ZLG7289_Download(1,2,0,fen[1]);
ZLG7289_Download(1,3,0,fen[0]);
}
else if(c==1)
{
ZLG7289_Download(1,2,0,miao[1]);
ZLG7289_Download(1,3,0,miao[0]);
ZLG7289_Download(1,0,0,0);
ZLG7289_Download(1,1,0,0);
}
}
}