#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 Keyvalue;
int n=0;
int number=0;
int mathsign=0;
int sign1=0,sign2=0,sign3=0,sign4=0;
int num1=0,num2=0;num3=0;num4=0;
int show1,show2,show3,show4,show5=16;
u8 mark=0;
u8 k;
int flag=0;
reset=0;
#define DigDisplay P0
#define Key P1
sbit LSA=P2^2; //動態數碼管位選IO口
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共陰數碼管 陣列
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(u16 i) //延時函式
{
while(i--);
}
void Appear() //動態數碼管顯示
{
if((number<10000)&&(number>1000)) //將計算最終結果個十百千位數取出
{
show1=number/1000;
show2=number%1000/100;
show3=number%100/10;
show4=number%10;
}
if((number<1000)&&(number>100))
{
show1=number/100;
show2=number%100/10;
show3=number%10;
show4=16;
}
if((number<100)&&(number>10))
{
show1=number/10;
show2=number%10;
show3=16;
show4=16; //0xf0
}
if(number<10)
{
show1=number;
show2=16;
show3=16;
show4=16;
}
if(number==0)
{
show1=16;
show2=16;
show3=16;
show4=16;
}
for(k=0;k<8;k++) //動態數碼管位選回圈,達到同時顯示目的
{
switch(k)
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
if(k==0)
{
DigDisplay=smgduan[show1];
delay(100);
DigDisplay=0x00;
}
if(k==1)
{
DigDisplay=smgduan[show2];
delay(100);
DigDisplay=0x00;
}
if(k==2)
{
DigDisplay=smgduan[show3];
delay(100);
DigDisplay=0x00;
}
if(k==3)
{
DigDisplay=smgduan[show4];
delay(100);
DigDisplay=0x00;
}
if(k>3)
{
DigDisplay=smgduan[show5];
delay(100);
DigDisplay=0x00;
}
}
}
void Keydown(void) //矩陣按鍵
{
char a=0;
Key=0x0f; //檢測列電平確認按下的按鍵
if(Key!=0x0f)
{
delay(1000);
if(Key!=0x0f)
{
Key=0x0f;
switch(Key)
{
case 0x07:Keyvalue=https://bbs.csdn.net/topics/0;break;
case 0x0b:Keyvalue=https://bbs.csdn.net/topics/1;break;
case 0x0d:Keyvalue=https://bbs.csdn.net/topics/2;break;
case 0x0e:mathsign=1;break; //最后一列為數學運算子
}
Key=0xf0; //檢測行電平,確認按下按鍵所在行
if(mathsign==0)
{
switch(Key) //給按下的數字鍵一個數
{
case 0x70:Keyvalue=https://bbs.csdn.net/topics/Keyvalue;break; // 0 1 2 +
case 0xb0:Keyvalue=https://bbs.csdn.net/topics/Keyvalue+3;break; // 3 4 5 -
case 0xd0:Keyvalue=https://bbs.csdn.net/topics/Keyvalue+6;break; // 6 7 8 *
case 0xe0:Keyvalue=https://bbs.csdn.net/topics/Keyvalue+9;break; // 9 C = /
}
if(Keyvalue=https://bbs.csdn.net/topics/=11) //按下為11的鍵相當于按下等號,flag標志位置1
{
flag=1;
}
n++; //每按下一個鍵,n+1,當n為奇數按下數字,偶數按下運算子
}
if(Keyvalue=https://bbs.csdn.net/topics/=10) //按下10的鍵相當于按下重置鍵,reset同樣為標志位
{
reset=1;
}
if(mathsign==1) //按下第四列按鍵時,sign代表各個運算子
{
switch(Key)
{
case 0x70:sign1=1;break;
case 0xb0:sign2=1;break;
case 0xd0:sign3=1;break;
case 0xe0:sign4=1;break;
}
n++;
}
}
if(n%2==1) //將按下的數字值賦給變數num
{
switch(n)
{
case(1):
num1=Keyvalue;break;
case(3):
num2=Keyvalue;break;
case(5):
num3=Keyvalue;break;
case(7):
num4=Keyvalue;break;
}
Keyvalue=https://bbs.csdn.net/topics/0;
}
}
while((a<50)&&(Key!=0xf0)) //按下一段時間自動退出,按下一次只有一個數
{
delay(100);
a++;
}
}
void InitInt0() //中斷允許位打開
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
while(1)
{
Keydown();
InitInt0();
if(flag==1) //按下等號時顯示最終結果
{
Appear();
if(reset==1) //重置
{
n=0;
flag=0;
show1=0;
show2=0;
show3=0;
show4=0;
num1=0;
num2=0;
num3=0;
num4=0;
reset=0;
}
}
}
}
void Int0() interrupt 0 //外部中斷0
{
delay(1000);
if((sign1==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1+num2;break;
case 4:
number=number+num3;break;
case 6:
number=number+num4;break;
}
}
if((sign2==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1-num2;break;
case 4:
number=number-num3;break;
case 6:
number=number-num4;break;
}
}
if((sign3==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1*num2;break;
case 4:
number=number*num3;break;
case 6:
number=number*num4;break;
}
}
if((sign4==1)&&(n%2==0))
{
switch(n)
{
case 2:
number=num1/num2;break;
case 4:
number=number/num3;break;
case 6:
number=number/num4;break;
}
}
}
uj5u.com熱心網友回復:
沒仔細看,但你既然是動態顯示的話Appear();要不停的刷才有得顯示啊,所以你應該放在if(flag==1)的外面
uj5u.com熱心網友回復:
但是我用了while(1) {}重復執行
uj5u.com熱心網友回復:
我到時候試試
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271725.html
標籤:單片機/工控
上一篇:KEIL自學碰到了問題
