51单片机用I2C驱动0.96OLED显示时钟 加上按键控制,更改年月日,开关流水灯。
流水灯正常运行,日期也可以通过按键更改,但是不进行计时。时间卡住不动了。
问题部分相关代码
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)
{
TMOD|= 0x01;//定时器0工作方式1
TH0=0x00;
TL0=0x00;
ET1=1;
EA=1;
TR0=1;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
unsigned char num,num1,N,Y,R,S,F,M;
TIM0init(); //初始化定时器0
OLED_Init(); //初始化
OLED_ColorTurn(0); //0正常显示,1反色显示
OLED_DisplayTurn(0);//0正常显示,1屏幕反转显示
P0=0x00;
while(1)
{
key();
if(flag==0)
{
P0=0x00;
}
else if(flag==1)
flag1();
else if(flag==2)
flag2();
else if(flag==3)
flag3();
else if(flag==4)
flag4();
//后面是一些按键检测,省略
************************
//
OLED_ShowNum(0,0,N,2,8); //显示数字
OLED_ShowChinese(13,0,0,7); //文字 年
OLED_ShowNum(22,0,Y,2,8); //显示数字
OLED_ShowChinese(35,0,1,7); //文字 月
OLED_ShowNum(46,0,R,2,8); //显示数字
OLED_ShowChinese(59,0,2,7); //文字 日
OLED_ShowNum(33,5,S,2,16); //显示数字
OLED_ShowString(50,5,":",16); //显示字符串
OLED_ShowNum(57,5,F,2,16); //显示数字
OLED_ShowString(72,5,":",16); //显示字符串
OLED_ShowNum(79,5,M,2,16); //显示数字
OLED_ShowChinese(75,1,7,13); //文字 星
OLED_ShowChinese(88,1,8,13); //文字 期
OLED_ShowChinese(101,1,Q,13); //文字
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256;//重新赋值 2ms
TL0=(65536-2000)%256;
num++;
if(num==500) //大致1s
{
num=0;
second++;
if(second==60) //秒到60,分钟加1
{
second=0;
minute++;
if(minute==60)//分钟到60,小时加1
{
minute=0;
hour++;
if(hour==24)//小时到24,回零
{
hour=0;
date++;Q++;
if(Q==8)
Q=0;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//月1,3,5,7,8,10,12
{
if(date==31)
{
date=0;
month++;
if(month==12)
month=0;
year++;
}
}
if(month==4||month==6||month==9||month==11)//月4,6,9,11
{
if(date==30)
{
date=0;
month++;
if(month==12)
month=0;
year++;
}
}
if(month==2)//月2
{
if(year%4==0)
{
if(date==29)
{
date=0;
month++;
if(month==12)
{
month=0;
year++;
}
}
}
else if(date==28)
{
date=0;
month++;
if(month==12)
{
month=0;
year++;
}
}
}
}
}
}
}
ssec++;
if(ssec>=100) //毫秒 时钟
{
ssec=0;
sec++;
if(sec>=15) //秒
{
sec=0;
flag++;
}
if(flag==5)
flag=1;
}
}
刚学单片机,麻烦各位看看有什么问题?
void main()
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //装初值
EA=1;//开总中断
ET0=1;//开启定时器0中断
TR0=1;//启动定时器0
while(1);//程序在这里等待中断发生
}
以上是百度到的,“ET0=1;//开启定时器0中断”,开中断这里不一样,可以看看是不是这个问题。