时进入值初始化 }
else if(display_DS1302_count==2) //调日期模式 {
DS1302Write(0x8e,0x00); //写保护关
DS1302Write(DS1302_DAY_WRITE,(date/10*16+date)); //2011年1月1日星期6
DS1302Write(DS1302_MONTH_WRITE,(month/10*16+month)); DS1302Write(DS1302_YEAR_WRITE,(year/10*16+year));
DS1302Write(0x8e,0x80); //写保护开
display_DS1302_count=0; //正常显示时间 date_count=0; //将调日期进入值初始化 }
else if(display_DS1302_count==3) //调星期模式 {
DS1302Write(0x8e,0x00); //写保护关
DS1302Write(DS1302_WEEK_WRITE,week);
DS1302Write(0x8e,0x80); //写保护开
display_DS1302_count=0; //正常显示时间 week_count=0; //将调日期进入值初始化 }
else if(display_DS1302_count==4) //写入定时数据 {
Sector_erase(0X2E00);
Byte_program(0X2E00, timing_s); Byte_program(0X2E01, timing_min); Byte_program(0x2E02, timing_h);
display_DS1302_count=0; //正常显示时间 timing_count1=0; //将调时进入值初始化 }
P3|=BIT(3); }
16
2、简易计算机: /****主程序***/ void main(void) {
init();//初始化
while(1) //整个系统大循环,让计算器一直处于工作状态 {
while(1) //第一运算数扫描 {
if(ac==1) break; //若清零,则退出输入
if((keyscan()!='N')&&((num>=0&&num<=9)||num=='.')) //记录按下的数字 {
if(newcalc==1) //新一次运算开始 {
lcdwrite_com(0x01);//清屏 newcalc=0;
lcd_setxy(0,0); }
if(keynum1<=7) //限制输入位数 {
if(num=='.') {
lcdwrite_data('.'); //显示小数点 } else
lcdwrite_num1(num); //转化为数字编码进行显示
num1[keynum1]=num;
keynum1++; } }
else
if(num=='+'||num=='-'||num=='*'||num=='/'||num=='='||num=='^'||keysqrt==0)
{
if(keynum1==0&&num1[0]==0) //若直接输入运算符而没有输入数字则执行连续运算 {
here:ans1=ans; //上次运算结果,初始化值为0
17
sign=num;
lcdwrite_com(0x01); delayms(5); lcd_setxy(0,0);
lcdwrite_float(ans1); //写第一计算数
if(sqrtflag2!=1&&num!='N')
lcdwrite_data(num); //利用ascll码直接写符号
break; //跳出while
}//第一个if语句解决无输入数或已有输入数进行第二次运算
for(i=0;keynum1>0;i++) //计算按下的数字的大小 {
if(num1[i]!='.')
ans1=ans1*10+num1[i]; //非小数部分计算大小 else if(num1[i]=='.') break; keynum1--; }
//小数部分计算大小
for(keynum1--,i++,j=0;keynum1>0;j++,i++,keynum1--) point=point*10+num1[i]; //共有J位小数 for(;j>0;j--)
point*=0.1;
ans1=ans1+point;//第一输入数的最终大小
sqrtflag1=0; //清除开方标志 sqrtflag2=0;//清除开方标志
if(keysqrt==0) //计算开方 {
delayms(5);
if(keysqrt==0) {
ans=sqrt(ans1); sqrtflag1=1; //第一次开方(仅是标记,不是运算为了跳过第二次输入)
lcdwrite_data(0xe8);//写开方符号 while(keysqrt==0);
18
}
}
delayms(10);
while(keysqrt==0);
break; //跳出while可直接显示结果 } }
sign=num;
lcdwrite_data(num);
break; //输入运算符号则退出第一运算数的输入
while(1) {
if(ac==1) break; //若清零,则退出输入
if(sqrtflag1==1) //若第一次按键为开方,则直接显示结果 {
break;
}
if((keyscan()!='N')&&((num>=0&&num<=9)||num=='.')) //记录按下的数字 {
if(keynum2<=7) {
if(num=='.') {
lcdwrite_data('.'); //显示小数点 } else
lcdwrite_num1(num); num2[keynum2]=num;
keynum2++; } }
else if(num=='='||keysqrt==0) {
sqrtflag2=0;//清除开方标志 if(keysqrt==0) //进入开方 {
delayms(5);
19
if(keysqrt==0) {
sqrtflag2=1; //开方标志
lcdwrite_data(0xe8); //写开方符号 while(keysqrt==0); delayms(10);
while(keysqrt==0); } }
point=0;//用于第二输入数计算小数部分和。
for(i=0;keynum2>0;i++) //计算按下的数字的大小 {
if(num2[i]!='.')
ans2=ans2*10+num2[i]; else if(num2[i]=='.') break; keynum2--; }
for(keynum2--,i++,j=0;keynum2>0;j++,i++,keynum2--) point=point*10+num2[i]; for(;j>0;j--) point*=0.1; if(sqrtflag2!=1)
lcdwrite_data(num); ans2=ans2+point;
break; //输入等于号则退出第二运算数的输入 } else
if(num=='+'||num=='-'||num=='*'||num=='/'||num=='^') {
point=0;
for(i=0;keynum2>0;i++) //计算按下的数字的大小
{
if(num2[i]!='.')
ans2=ans2*10+num2[i]; else if(num2[i]=='.') break; keynum2--; }
20