?? main2.c
字號(hào):
#include <AT89X51.h> //頭文件
#include <intrins.H>
#include <absacc.h>
//################## lcd #######################
extern void lcd_init(void); //lcd 初始化
extern void lcd_data(char); //lcd 寫(xiě)數(shù)據(jù)
extern char lcd_rdata(void); //lcd 讀數(shù)據(jù)
extern void lcd_command(char); //lcd 寫(xiě)命令
extern void lcd_address(char); //lcd 顯示地址
//################# display ####################
extern void display(void); //顯示內(nèi)容刷新
//################## key ##############
extern char key(void); //返回按鍵鍵值 1--16
extern char number(void); //返回按鍵數(shù)字 1--16
extern void nokey(void); //誤操作,連操作
//###################################################
void delay(int); //延時(shí)
void time0_int(void); //定時(shí)器
char time_temp[6]={0x05,0x04,0x09,00,00,00}; //萬(wàn)年歷更新緩沖區(qū)
char time_en=1;temp; //時(shí)間更新允許位
char disp_temp[32]={"^^^^^^^^^^^^^^^^5/04/09-22:41:00"}; //顯示緩沖區(qū)
int time=0; //定時(shí)器狀態(tài)標(biāo)志
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; //開(kāi)全局中斷
ET0=1; //開(kāi)T0中斷
TMOD=0x01; //用T0。模式1。16位
TH0=0xb8; //設(shè)定時(shí)時(shí)長(zhǎng)20ms
TL0=0x00;
TR0=1; //開(kāi)計(jì)數(shù)器
_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) //先輸被加數(shù)
{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)) //做被加數(shù)=被加數(shù)+加數(shù)操作
{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; //顯示結(jié)果
}
jia=0; //加數(shù)清零
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(); //輸入加數(shù)
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; //顯示加數(shù)結(jié)果
}
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; //顯示結(jié)果
}
nokey();
}
delay(100);
}
if(e==14) goto _time;
delay(200);
}
//================================= time =======================
_time:
time_en=0; //時(shí)間更新停止
for(i=0;i<16;i++) { disp_temp[i]=' '; } //清第一行
disp_temp[0]='v'; x=1; //第一位修改標(biāo)志
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'; //重新寫(xiě)箭頭
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) // 在箭頭標(biāo)志位置加
{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]++; //時(shí)加
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;
// 把重新設(shè)定的時(shí)間更新到顯示緩沖區(qū) 時(shí)間刷新
k=time_temp[5]; y=(k%10)+0x30; z=(k/10)+0x30; //秒更新 個(gè)位和十位
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; //時(shí)更新
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) //跳出設(shè)置狀態(tài),返回計(jì)算器
{for(i=0;i<16;i++) { disp_temp[i]=' '; }
nokey();
time_en=1;break; //時(shí)間允許打開(kāi),跳出
}
delay(100); //WHILE的延時(shí) 給其他分支留有時(shí)間
}
time_en=1;
goto _caculator;
}
void time0_int(void) interrupt 1 // T0 中斷 顯示刷新
{char x,y,z;
TR0=0; //關(guān)計(jì)數(shù)器
TH0=0xb8;
TL0=0x00;
TR0=1; //開(kāi)計(jì)數(shù)器
time++; //更新記數(shù)累加器
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 分進(jìn)位
if(time_temp[4]>=60)
{time_temp[4]=0; time_temp[3]++;} //59分 時(shí)進(jìn)位
if(time_temp[3]>=24)
{time_temp[3]=0; time_temp[2]++;} // 24小時(shí) 日進(jìn)位
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月,日調(diào)整
{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月,日調(diào)整
{time_temp[2]=1; time_temp[1]++;}
}
else if(time_temp[1]==2) //如果是2月
{if((time_temp[0]+2000)%4==0) //如果是閏年,日調(diào)整
{if(time_temp[2]>=30)
{time_temp[2]=1; time_temp[1]++;}
}
else //如果不是閏年,日調(diào)整
{if(time_temp[2]>=29)
{time_temp[2]=1; time_temp[1]++;}
}
}
else ;
if(time_temp[1]>=13) //12 月 年進(jìn)位
{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; //時(shí)更新
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_();}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -