📄 main2.c
字号:
#include <AT89X51.h> //头文件
#include <intrins.H>
#include <absacc.h>
//################## lcd #######################
extern void lcd_init(void); //lcd 初始化
extern void lcd_data(char); //lcd 写数据
extern char lcd_rdata(void); //lcd 读数据
extern void lcd_command(char); //lcd 写命令
extern void lcd_address(char); //lcd 显示地址
//################# display ####################
extern void display(void); //显示内容刷新
//################## key ##############
extern char key(void); //返回按键键值 1--16
extern char number(void); //返回按键数字 1--16
extern void nokey(void); //误操作,连操作
//###################################################
void delay(int); //延时
void time0_int(void); //定时器
char time_temp[6]={0x05,0x04,0x09,00,00,00}; //万年历更新缓冲区
char time_en=1;temp; //时间更新允许位
char disp_temp[32]={"^^^^^^^^^^^^^^^^5/04/09-22:41:00"}; //显示缓冲区
int time=0; //定时器状态标志
main()
{char i,k,ke=0;
unsigned char e,x,y,z;
long int jia=0,bjia=0,jieguo=0;
lcd_init(); //lcd初始化
EA=1; //开全局中断
ET0=1; //开T0中断
TMOD=0x01; //用T0。模式1。16位
TH0=0xb8; //设定时时长20ms
TL0=0x00;
TR0=1; //开计数器
_caculator:
for(i=0;i<16;i++) //第一行清零
{ disp_temp[i]=' '; }
disp_temp[15]='0';
while(1)
{
time_en=1;
e=key();
if(e==14)
{goto _time;}
while(1) //先输被加数
{e=number();
if(e<=9&&e>=0)
{bjia=bjia*10+e;
for(i=1;i<=14;i++)
disp_temp[i]=disp_temp[i+1];
disp_temp[15]=e+0x30;
nokey();
}
else
{e=key();
if(e==16) {ke=1; disp_temp[0]='+';}
if(e==8) {ke=2; disp_temp[0]='-';}
if(e==4) {ke=3; disp_temp[0]='*';}
break;
}
}
while(1)
{
e=key();
if((e==16)||(e==12)||(e==8)) //做被加数=被加数+加数操作
{if(ke==1){ bjia=bjia+jia; jieguo=bjia; }
if(ke==2){ bjia=bjia-jia; jieguo=bjia; }
if(ke==3){ bjia=bjia*jia; jieguo=bjia; }
if(ke==0){ bjia=bjia+jia; jieguo=bjia;}
if(e==16) {ke=1; disp_temp[0]='+';}
if(e==12) {ke=2; disp_temp[0]='-';}
if(e==8) {ke=3; disp_temp[0]='*';}
for(i=1;i<16;i++) { disp_temp[i]=' '; } //第一行清零
for(i=15;i>0;i--)
{k=jieguo%10+0x30; disp_temp[i]=k;
jieguo=jieguo/10; if(jieguo==0) break; //显示结果
}
jia=0; //加数清零
nokey();
}
else if(e==14) break;
else if(e==15) //c
{bjia=0; jia=0; jieguo=0;
for(i=1;i<16;i++) { disp_temp[i]=' '; } //第一行清零
disp_temp[15]='0';
nokey();
goto _caculator;
}
e=number(); //输入加数
if(e<=9&&e>=0)
{jia=jia*10+e;
for(i=0;i<16;i++) { disp_temp[i]=' '; } //第一行清零
jieguo=jia;
for(i=15;i>0;i--)
{k=jieguo%10+0x30; disp_temp[i]=k;
jieguo=jieguo/10; if(jieguo==0) break; //显示加数结果
}
nokey();
}
e=key();
if(e==4)
{for(i=1;i<16;i++) { disp_temp[i]=' '; } //第一行清零
if(ke==1){ bjia=bjia+jia; jieguo=bjia; }
if(ke==2){ bjia=bjia-jia; jieguo=bjia; }
if(ke==3){ bjia=bjia*jia; jieguo=bjia; }
for(i=15;i>0;i--)
{k=jieguo%10+0x30; disp_temp[i]=k;
jieguo=jieguo/10; if(jieguo==0) break; //显示结果
}
nokey();
}
delay(100);
}
if(e==14) goto _time;
delay(200);
}
//================================= time =======================
_time:
time_en=0; //时间更新停止
for(i=0;i<16;i++) { disp_temp[i]=' '; } //清第一行
disp_temp[0]='v'; x=1; //第一位修改标志
nokey(); //防止连按
while(1)
{e=key();
if(e==1) //左移
{x--;
if(x==0) x=16;
while(x==2||x==3||x==5||x==6||x==8||x==9||x==11||x==12||x==14||x==15) x--; //判断箭头位置
for(i=0;i<16;i++) { disp_temp[i]=' '; } //清空第一行屏幕
disp_temp[x-1]='v'; //重新写箭头
nokey(); //防止误操作
}
if(e==2) //右移
{x++;
if(x==17) x=1;
while(x==2||x==3||x==5||x==6||x==8||x==9||x==11||x==12||x==14||x==15) x++;
for(i=0;i<16;i++) { disp_temp[i]=' '; }
disp_temp[x-1]='v';
nokey();
}
if(e==3) // 在箭头标志位置加
{if(x==1) time_temp[0]++; //年加
if(time_temp[0]==10) time_temp[0]=0;
if(x==4) time_temp[1]++; //月加
if(time_temp[1]==13) time_temp[1]=1;
if(x==7) time_temp[2]++; //日加
if(time_temp[2]==32) time_temp[2]=1;
if(x==10) time_temp[3]++; //时加
if(time_temp[3]==24) time_temp[3]=0;
if(x==13) time_temp[4]++; //分加
if(time_temp[4]==60) time_temp[4]=0;
if(x==16) time_temp[5]++; //秒加
if(time_temp[5]==60) time_temp[5]=0;
// 把重新设定的时间更新到显示缓冲区 时间刷新
k=time_temp[5]; y=(k%10)+0x30; z=(k/10)+0x30; //秒更新 个位和十位
disp_temp[31]=y; disp_temp[30]=z;
k=time_temp[4]; y=(k%10)+0x30; z=(k/10)+0x30; //分更新
disp_temp[28]=y; disp_temp[27]=z;
k=time_temp[3]; y=(k%10)+0x30; z=(k/10)+0x30; //时更新
disp_temp[25]=y; disp_temp[24]=z;
k=time_temp[2]; y=(k%10)+0x30; z=(k/10)+0x30; //日更新
disp_temp[22]=y; disp_temp[21]=z;
k=time_temp[1]; y=(k%10)+0x30; z=(k/10)+0x30; //月更新
disp_temp[19]=y; disp_temp[18]=z;
k=time_temp[0]; y=(k%10)+0x30; //年更新
disp_temp[16]=y;
display();
nokey();
}
if(e==14) //跳出设置状态,返回计算器
{for(i=0;i<16;i++) { disp_temp[i]=' '; }
nokey();
time_en=1;break; //时间允许打开,跳出
}
delay(100); //WHILE的延时 给其他分支留有时间
}
time_en=1;
goto _caculator;
}
void time0_int(void) interrupt 1 // T0 中断 显示刷新
{char x,y,z;
TR0=0; //关计数器
TH0=0xb8;
TL0=0x00;
TR0=1; //开计数器
time++; //更新记数累加器
if((time%3)==0) //60毫秒刷屏
display();
if(time%50==0&&time_en==1)
{
time_temp[5]++;
if(time_temp[5]>=60)
{time_temp[5]=0; time_temp[4]++;} //秒到60 分进位
if(time_temp[4]>=60)
{time_temp[4]=0; time_temp[3]++;} //59分 时进位
if(time_temp[3]>=24)
{time_temp[3]=0; time_temp[2]++;} // 24小时 日进位
if(time_temp[1]==1||time_temp[1]==3||time_temp[1]==5|| \
time_temp[1]==7||time_temp[1]==8||time_temp[1]==10||time_temp[1]==12)
{
if(time_temp[2]>=32) //如果是1,3,5,7,8,10,12月,日调整
{time_temp[2]=1; time_temp[1]++;}
}
else if(time_temp[1]==4||time_temp[1]==6||time_temp[1]==9||time_temp[1]==11)
{
if(time_temp[2]>=31) //如果是4,6,9,11月,日调整
{time_temp[2]=1; time_temp[1]++;}
}
else if(time_temp[1]==2) //如果是2月
{if((time_temp[0]+2000)%4==0) //如果是闰年,日调整
{if(time_temp[2]>=30)
{time_temp[2]=1; time_temp[1]++;}
}
else //如果不是闰年,日调整
{if(time_temp[2]>=29)
{time_temp[2]=1; time_temp[1]++;}
}
}
else ;
if(time_temp[1]>=13) //12 月 年进位
{time_temp[1]=1; time_temp[0]++;}
if(time_temp[0]>=100) //年更新
{time_temp[0]=1; }
x=time_temp[5]; y=(x%10)+0x30; z=(x/10)+0x30; //秒更新
disp_temp[31]=y; disp_temp[30]=z;
x=time_temp[4]; y=(x%10)+0x30; z=(x/10)+0x30; //分更新
disp_temp[28]=y; disp_temp[27]=z;
x=time_temp[3]; y=(x%10)+0x30; z=(x/10)+0x30; //时更新
disp_temp[25]=y; disp_temp[24]=z;
x=time_temp[2]; y=(x%10)+0x30; z=(x/10)+0x30; //日更新
disp_temp[22]=y; disp_temp[21]=z;
x=time_temp[1]; y=(x%10)+0x30; z=(x/10)+0x30; //月更新
disp_temp[19]=y; disp_temp[18]=z;
x=time_temp[0]; y=(x%10)+0x30; //z=(x/16)+0x30;//年更新
disp_temp[16]=y; // disp_temp[30]=c;
time=0;
}
}
void delay(int x)
{char i=81;
for(;x>0;x--)
{i=81; while((i--)>0) _nop_();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -