/***片選***/
unsigned char code Select[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/***碼選***/
unsigned char code LED_CODES[]=
{0xC0,0xF9,0xA4,0xB0,0x99,
//0-4
0x92,0x82,0xF8,0x80,0x90, //5-9
0x86,0xAF,0xFF,0x7F,0xBF,}; //E,r,空格,。,-
/***main函數***/
void main(void) {
char i,j,k,c;
char a[8],b[8];
/***定時1ms***/
TMOD=0;
TL0=-(1000/256);
TH0=-(1000%256);
EA = 1; //總中斷開關
ET0 = 1; //開中斷
TR0 = 1; //啟用計數器0
KSC:do {
for(i=1;i《9;i++) //數字錄入循環 {
dsp[0]=keyscan();
if(c==2&&dsp[0]《10)
//此段代碼驗證是否有舊的計算結果在顯示,且不
再參與新計算
{
dsp[1]=dsp[0];
for(j=2;j《9;j++)
dsp[j]=12;
c=0;
}
else if(c==2&&dsp[0]》9) //舊的計算結果將參與新的計算,作為第一個數
{ c=0; }
if(dsp[0]==0&&dsp[1]==0&&dsp[2]==12) //個位為0且十位為空時按下0,按鍵無
效,跳回KSC等待正確輸入 {
/***goto跳轉標志***/ goto KSC;
}
else if(dsp[0]》9) break; //有操作符按下,跳出數字錄入循環
else
{
for(j=i;j》0;j--)
dsp[j]=dsp[j-1]; //移位,以正確顯示數字 }
}
if(i==9) //判斷是否輸入8個有效數字,是則等待操作符,否則直接判斷操作符 {
do //使用do while無論是否第一個數都取一次操作符 {
dsp[0]=keyscan();
//獲取操作符號
if(dsp[0]==14||dsp[0]《10) //按下C或者第9位數字清零
{
單片機系統開發與應用工程實習計報告
7
dsp[1]=0;
for(i=2;i《9;i++)
dsp[i]=12; c=0;
}
}
while((dsp[0]==15)&&(c==0));
//等號被按下,等待新的操作符(僅對
第一個數字有效)
}
else if(dsp[0]==14) //按下C清零
{
dsp[1]=0;
for(i=2;i《9;i++)
dsp[i]=12;
c=0;
}
while(dsp[0]==15&&c==0)
//未輸滿8位且是第一個數字即按下等號,等
待非等號操作符 {
dsp[0]=keyscan();
//獲取操作符號
if(dsp[0]==14||dsp[0]《10) //按下C或者數字都進行清零,重新輸入a
{
dsp[0]=14; //將dsp[0]置為14,防止因數字清零未能攔截
dsp[1]=0;
for(i=2;i《9;i++)
dsp[i]=12;
c=0;
}
}
}while(dsp[0]==14); //數字輸入未完成即按下C,重新等待輸入
do
{
if(c==0) //沒有數字輸入 { k=dsp[0];
//存計算符(循環內已排除C、=、數字)
for(i=0;i《8;i++) //將第一個數存入a[8] {
a[i]=dsp[i+1];
}
評論