#include "atmel\at89x51.h"
#include "intrins.h"
#define HI ((65536 - 50000) / 256)
#define LO ((65536 - 50000) % 256)
#define _TH0_TL0_ (65536 - 50000)
#define M 20 //(1000/25)
bit km; //按键已去抖动标志
bit kp; //按键已处理标志
bit led_on;
bit flash;
bit new_time_info;
unsigned char show_status;
unsigned char display[6];
unsigned char hou,min,sec;
unsigned char cur_time_set;
unsigned char attr;
unsigned int count_down;
/**********************************************************************************************/
unsigned char SEG_TAB_B[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数字
unsigned char SEG_TAB_A[ ] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0.-9.数字
/*********************************************************************************************/
void Delay(unsigned char a)//延时程序a*1MS
{
unsigned char j;
while(a-- != 0)
{
for (j = 0; j < 125; j++);
}
}
/*********************************************************************************************/
void Disp(void)//数码管显示
{
P2_0 = 1;
P1 = SEG_TAB_B[ hou / 10 ];
Delay(5);
P2_0 = 0;
P2_1 = 1;
P1 = SEG_TAB_A[ hou % 10 ];
Delay(5);
P2_1 = 0;
P2_2 = 1;
P1 = SEG_TAB_B[ min / 10 ];
Delay(5);
P2_2 = 0;
P2_3 = 1;
P1 =SEG_TAB_A[ min % 10 ];
Delay(5);
P2_3 = 0;
P2_4 = 1;
P1 = SEG_TAB_B[ sec / 10 ];
Delay(5);
P2_4 = 0;
P2_5 = 1;
P1 = SEG_TAB_B[ sec % 10 ];
Delay(5);
P2_5 = 0;
}
/********************************************************************************************/
void IsrTimer0(void) interrupt 1 using 1 //定时50ms
{
static unsigned char count = 0; //定义静态变量count
count++;
if(count == M)
{
count = 0;
sec++;
if(sec == 60)
{
min++;
sec = 0;
if(min == 60)
{
hou++;
min = 0;
if(hou == 24)
{
hou = 0;
}
}
}
}
}
/******************************************************************************************/
void Timer0Init(void) //定时器0
{
TMOD = 0x01;
TH0 = HI;
TL0 = LO;
TR0 = 1;
ET0 = 1;
EA = 1;
}
**************************************************************************************************
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
char tmp;
TH1=0x15; TL1=0xa0; // 每30ms中断一次
if((show_status==1 )||(show_status==2)) //当前显示或设置时间
{ display[0]=hou/10; display[1]=hou%10; display[2]=min/10;
display[3]=min%10; display[4]=sec/10; display[5]=sec%10;
}
keytmp=~(P1) & 0x0f;
if(keytmp==0) { km=0; kp=0; }
else
{ if(km==0) km=1;
else
{ if(kp==0)
{ kp=1;
if(keytmp==1) //第一个按钮
if((show_status==1) && led_on) //正显示时间
{ show_status=2; cur_time_set=0; attr=0x3f; } //进入时间设置
else if(show_status==2) //如正在设置时间项
{ show_status=1; new_time_info=1; attr=0xff; } //返回当前时间显示
return;
}
if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效
{ switch(attr)
{
case 0x3f: if(show_status==2)
hou=(hou+1)%24; //当前时间的"时"加1
break;
case 0xcf:
if(show_status==2)
min=(min+1)%60; //当前时间的“分”加1
break;
case 0xf3: if(show_status==2)
{count_down=8000;
sec=(sec+1)%60; } //当前时间的“秒”加1
break;
} //end of switch(attr)
return;
} //end of if(keytmp==1)
if(keytmp==3) //第三个按钮
{ switch(attr)
{ case 0xff: if((show_status==1 )|| (show_status==2))
led_on=~led_on; //打开或关闭数码管显示
break;
case 0x3f: if(show_status==2) //如果正在设置时间
{ if(cur_time_set==2)
//当前时间的“时”减
{ tmp=hou-1; if(tmp<0) hou=23; else hou=tmp; }
break;
}
else if(show_status==2)
{ tmp=min-1; //当前时间的“分”减1
if(tmp<0) min=59; else min=tmp; }
break;
else if(show_status==2)
{ tmp=sec-1; //当前时间的“秒”减1
count_down=8000;
if(tmp<0) sec=59; else sec=tmp; }
break;
}
}
}
}
}
/******************************************************************************************/
void main()
{unsigned char i;
hou=00; min=00; sec=00;
count_down=8000;
flash=0; attr=0xff; led_on=1;
km=0; kp=0; show_status=2; //加电后显示当前时间
while(1)
{ if (hou==00&&min==00&&sec==00 )
P1_5=0 ;
else if (hou==00&&min==05&&sec==00)
P1_5=1;
}
IE=0; IP=0; //打开所有中断和低优先
TMOD=0x12; //timer 0 is set to mode 2,auto_reloading,timer1,mode 1定时器0设成模式2,自动重装,定时器1模式1.
TH0=6; TL0=6; //timer0 parameters for 0.125ms
TH1=0x15; TL1=0xa0; //timer1 parameters for 30ms
TR0=1; TR1=1; //timer0 interrupt most important
ET0=1; ET1=1; EA=1; //enable interrupt function
}
错误提示left side of asn-op not an lvalue,是 display[3]=min%10; display[4]=sec/10; display[5]=sec%10;这行出的错。还有这行 else if(show_status==2) 出错:syntax error near 'else';另外还有void Timer1ISR (void ) interrupt 3 using 2 这行出错:syntax error near 'void'
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
是你的程序如此,还是粘贴有误?
我在你的程序中没有看到display[]的定义
引用: 引用 2 楼 btiger2000 的回复:
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
是你的程序如此,还是粘贴有误?
我在你的程序中没有看到display[]的定义
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描
{unsigned char keytmp;
引用: 引用 2 楼 btiger2000 的回复:
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
是你的程序如此,还是粘贴有误?
我在你的程序中没有看到display[]的定义
那个是粘贴的问题,原程序里是换行了的。unsigned char display[6];不是对display[]的定义吗?好像就是这个定义出了什么问题哈?该怎么改呢?麻烦老师指点指点呗!谢谢了!
从程序上无法看出直接的错误。
你用的是Keil吧?建议你做如下工作:
重新新建一个project,重建一个main.c文件,然后,从main()开始,一点一点重新拷贝过去,其实最好是重新敲代码,但是估计你没这个耐心了。
每次复制过去,就编译一次。看看到底哪里会出问题。
像中断函数的定义,绝对是最标准最通用的,竟然也出错,显然不是函数体本身的问题了。
说个以前碰到过的问题:Keil不支持中文,强行写中文进去也能显示,但是删除的时候,就会将中文截成2个字节,一不小心,就会删一半剩一半。如果剩下的一半正好是非显示字符,那么编译时必然报错,偏偏你还看不到。
引用: 引用 5 楼 shuiyan 的回复:
从程序上无法看出直接的错误。
你用的是Keil吧?建议你做如下工作:
重新新建一个project,重建一个main.c文件,然后,从main()开始,一点一点重新拷贝过去,其实最好是重新敲代码,但是估计你没这个耐心了。
每次复制过去,就编译一次。看看到底哪里会出问题。
像中断函数的定义,绝对是最标准最通用的,竟然也出错,显然不是函数体本身的问题了。
说个以前碰到过的问题:Keil不支持中文,强行写中文进去也能显示,…
果然是高手,你说的这个问题我以前也遇到过!可能这次还是这问题。不过第二处错误那里display[]的定义好像也有问题,可我不知道该怎么改,你觉得会是什么问题啊?
经历了注册,不停的完善信息,我已经不想帮你解决问题了。自己努力吧!兄弟
下次把程序拷贝的整齐点,方便大家分析,好吗?
这个网页还不让拷贝粘贴,兄弟。
我问一下,你定义的DISPLAY是char型的,但是你除法得到的结果应该是什么类型的呀?
改一下试试看吧,希望能正确
引用: 引用 9 楼 dowegood 的回复:
这个网页还不让拷贝粘贴,兄弟。
我问一下,你定义的DISPLAY是char型的,但是你除法得到的结果应该是什么类型的呀?
改一下试试看吧,希望能正确
hou/10这个是个位求整,hou%10是十位求整,字符型和整型是可以相互赋值的不是吗?而且我试过了改了也不对的。我实在想不到该怎么改了才来论坛求助的啊!谢谢个位老师的指点,学习了很多!虽然问题还是没解决。。。。。。。。
现在感觉应该不是display的问题,而是hou,min,sec的问题。
问题解决了!感谢各位老师的无私帮助!越来越喜欢这个论坛了!
奇怪,display部分看不出什么问题。你解决了?是什么地方出的毛病?
直接删了。把那断程序改了一下换了个位置。然后整个程序重新手动输入了一遍。
引用: 引用 14 楼 nianchao 的回复:
直接删了。把那断程序改了一下换了个位置。然后整个程序重新手动输入了一遍。
晕倒……估计之前你已经花了很长很长的时间来找问题了吧。痛苦吧。。。曾经我也是经历过的,所以,后来我用keil,一是尽量不用中文,二是用中文的,全部在Ultraedit里面输入,三是原来ok的程序,一旦加新功能出现莫名其妙的问题,立即新建工程,新建文件,从原来好的程序开始,一点一点的加,一点一点的剥
真的好痛苦啊!我最大的梦想就是以后中国强大了全世界都用中国产的CPU,MCU,编程全用汉语,所有IC的说明书都是汉语的,而且不能用翻译软件翻译,痛苦死那些老外!!!
引用: 引用 17 楼 nianchao 的回复:
真的好痛苦啊!我最大的梦想就是以后中国强大了全世界都用中国产的CPU,MCU,编程全用汉语,所有IC的说明书都是汉语的,而且不能用翻译软件翻译,痛苦死那些老外!!!
太极端,没必要这样,只要到时所有的最新技术论文都是中文发表的,那么那些老外就值得头疼了。计算机嘛,用中文的可能性不大,真的。