单片机 秒表Word格式文档下载.docx
《单片机 秒表Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机 秒表Word格式文档下载.docx(19页珍藏版)》请在冰点文库上搜索。
ucharhour;
uinttcnt,g;
ucharsuanfa;
bitflag2;
bitflag1=1;
//////控制计算器还是液晶调整的状态灯
uinti=0,f,m,g,s,t;
//
for里的计数值,用于循环
//用来标记按了什么,如+,-.*,或是/
sbitP2_0=P2^0;
//定义P2.0口用来,当计算值超过15时,P2.0所对应的灯闪几下
sbitP2_1=P2^1;
//定义P2.1口用来,当除数为0时,P2.1所对应的灯闪几下
sbitP2_2=P2^2;
sbitP2_3=P2^3;
uintnum[4]={0};
//用于记录外面输入的数字
uintTablenum;
sbitP3_4=P3^4;
sbitP3_5=P3^5;
voidjieguo(void);
voidSettime(ucharverify);
ucharkbscan(void);
///键盘扫描
voidShow_Time(void);
////显示时间
//verify在这里为调整的意思
uinttransfor(ucharkey1);
voiddelay400ms(void);
voiddelay200ms(void);
voiddelay5ms(void);
voiddelay_1s(void);
voiddlms(void);
voiddlms1(void)
{
uintg=20000;
while(--g);
//延时100mS钟
}
voidclr(void)
{
i=0;
suanfa=0;
Tablenum=0;
for(f=0;
f<
4;
f++)
{
num[f]=0;
}
P2_0=1;
P2_1=1;
P2_2=1;
P2_3=0;
P3_4=0;
P3_5=1;
P0=0xc0;
P3_5=0;
//***************************************************************************************************
//***************************************以下液晶驱动****************************************************
voidwaitLcd()
//justwaituntil液晶不忙为止
chartemp;
bitflag=1;
while(flag==1)
temp=XBYTE[rc];
if(temp>
>
7==0)flag=0;
P1=temp;
P1=0xff;
voidWriteCommand_Lcd(bitisCheck,charc)
if(isCheck==1)waitLcd();
XBYTE[wc]=c;
voidwritedata(charc)
waitLcd();
XBYTE[wd]=c;
voidLcdInit()
delay5ms();
delay5ms();
WriteCommand_Lcd(0,0x38);
//三次显示模式设置,不检测忙信号
WriteCommand_Lcd(1,0x38);
//显示模式设置,开始要求每次检测忙信号,8位2行5*7
WriteCommand_Lcd(1,0x08);
//关闭显示
WriteCommand_Lcd(1,0x01);
//清显示
WriteCommand_Lcd(1,0x06);
//文字不动,光标右移
WriteCommand_Lcd(1,0x0C);
//显示开及光标设置
}
voiddisplayListChar(unsignedcharX,unsignedcharY,ucharDData)
{
Y&
=0x1;
X&
=0xF;
if(X<
=0xF)
Y&
if(Y)X|=0x40;
X|=0x80;
WriteCommand_Lcd(0,X);
writedata(dispbuf[DData]);
//****************************************以上液晶驱动*****************************************************
//*****************************************************************************************************
//**********************************以下显示时间*****************************************************
voidShow_Time(void)
displayListChar(0,0,hour/10);
displayListChar(1,0,hour%10);
displayListChar(2,0,10);
displayListChar(3,0,minute/10);
displayListChar(4,0,minute%10);
displayListChar(5,0,10);
displayListChar(6,0,second/10);
displayListChar(7,0,second%10);
//**********************************以上显示时间*****************************************************
voidmain(void)
TMOD=0x02;
//置自动重装载模式
TH0=0x06;
//设初值
TL0=0x06;
TR0=1;
//开始计数
ET0=1;
//开定时器/计数器
EA=1;
//中断开
delay400ms();
//启动等待,等LCM讲入工作状态
LcdInit();
//LCM初始化
P3_4=0;
P2_0=1;
P2_1=1;
P2_2=0;
P2_3=1;
P3_5=1;
P0=0xc0;
P3_5=0;
while
(1)
ucharkey;
key=kbscan();
dlms();
//0(111001110xe7)
///*****************************以下是两种状态的切换********************
//**********************************************************************************************
if(key==0xe7)
flag1=~flag1;
key=0x00;
if(flag1==1)
///液晶状态灯
if(flag1==0)
P2_2=1;
P2_3=0;
///计算器状态灯
dlms1();
///*****************************以上是两种状态的切换********************
///**************************************************************************************
///*******************************用于调整时间********************************************
{LcdInit();
Show_Time();
if(key!
=0)
if(key==0x7e)
EA=0;
flag2=1;
if(key==0x7d)
flag2=0;
Settime(key);
delay200ms();
//**************************************下面是计算器*************************
if(flag1==0)
if((key!
=0x7e)&
&
(key!
=0x7d)&
=0x7b)&
=0x77)&
=0xd7)&
=0xb7)&
=0x00))
{//0x7e为"
+"
0x7d为"
-"
0x7b为"
*"
0x77为"
/"
.0xd7为"
CLR"
0xb7为"
="
Tablenum=transfor(key);
if(Tablenum!
=0)
num[i]=Tablenum;
P0=(table[Tablenum]);
//这里的key只能进来0至9
if((key==0x77)||(key==0x7d)||(key==0x7b)||(key==0x7e))
i++;
if(i>
1){i=1;
if(key==0x7e){suanfa=1;
if(key==0x7d){suanfa=2;
if(key==0x7b){suanfa=3;
if(key==0x77){suanfa=4;
if(key==0xb7)//按等号(0xb7)给P2赋值
jieguo();
//按等号给P2赋值
if(key==0xd7)//如果按清零,则清零
clr();
//如果按清零,则清零
//**************************************上面是计算器************************************************
}//此括号为while的括号
voiddelay5ms(void)
unsignedintTempCya=277;
while(--TempCya);
//延时400ms
voiddelay400ms(void)
unsignedintTempCya=22160;
voiddelay200ms(void)
unsignedintTempCyaaa=11080;
while(--TempCyaaa);
//*****************************定时器********************************************
voidtimer0(void)interrupt1using1
tcnt++;
if(tcnt==2000)
tcnt=0;
second++;
if(second==60)
second=0;
minute++;
if(minute==60)
minute=0;
hour++;
if(hour==24)
hour=0;
//*****************************显示结果*********************************************
voidjieguo(void)
if(suanfa==1)
num[2]=(num[1]+num[0]);
if((num[2]<
=15)&
(num[2]>
=0))
P0=table[num[2]];
else
{clr();
for(m=0;
m<
8;
m++)
P2_0=~P2_0;
delay_1s();
if(suanfa==2)//减法显示
num[2]=(num[0]-num[1]);
}//减法显示
if(suanfa==3)//乘法显示
num[2]=(num[0]*num[1]);
}//乘法显示
if(suanfa==4)//除法显示
if(num[1]!
num[2]=(num[0]/num[1]);
P2_1=~P2_1;
}//除法显示
uinttransfor(ucharkey1)
uinttemp;
switch(key1)
case0xee:
temp=1;
break;
case0xde:
temp=2;
case0xbe:
temp=3;
case0xed:
temp=4;
case0xdd:
temp=5;
case0xbd:
temp=6;
case0xeb:
temp=7;
case0xdb:
temp=8;
case0xbb:
temp=9;
default:
temp=0;
returntemp;
//*******************************以下时间调节******************************************************
voidSettime(ucharverify)
//键盘设置
//1/hour+(0xee)2/minute+0xde3/second+0xbe+
//4/hour-0xed5/minute-0xdd6/second-0xbd-
//789*
//0CLR=/
////hour+的代码
if(flag2)
if(verify==0xee)
//while(verify==0xee);
verify=0x00;
//1/hour+(0xee)2/minute+0xde3/second+0xbe
///minute+的代码
elseif(verify==0xde)
if(verify==0xde)
//while(verify==0xde);
//////second++的代码
elseif(verify==0xbe)
if(verify==0xbe)
//while(verify==0xbe);
//////hour-(0xed)的代码
elseif(verify==0xed)
if(verify==0xed)
if(hour==0)
{hour=24;
hour--;
//if(hour==0)
//{
//hour=23;
//}
//while(verify==0xed);
//4/hour-0xed5/minute-0xdd6/second-0xbd
///下面为minute-的代码
elseif(verify==0xdd)
if(verify==0xdd)
{if(minute==0)
{minute=60;
minute--;
//if(minute==0)
//{
//minute=59;
//while(verify==0xdd);
//4/hour-0xed5/minute-0xdd6/second-0xbd
///下面为second-的代码
elseif(verify==0xbd)
if(verify==0xbd)
{if(second==0)
{second=60;
second--;
//if(second==0)
//second=59;
//while(verify==0xbd);
//4/hour-0xed5/