?? 計(jì)算器.c
字號(hào):
#include<iom16v.h>
#include<macros.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#pragma interrupt_handler int0:2
uint code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar i=0;
uchar sign;
void int0()
{ uchar t=255;
GICR&=~BIT(6); //先關(guān)閉中斷,因?yàn)橛玫氖擎I盤反轉(zhuǎn)掃描法,故掃描過程中會(huì)出現(xiàn)
//電平交替變化,為防止再次觸發(fā)中斷先關(guān)閉中斷
if(keyscan()!=255) //檢測按鍵是否有效
i=keyscan();
while(t--); //按鍵掃描會(huì)導(dǎo)致電平不穩(wěn)定,延時(shí)一小段時(shí)間等待波形穩(wěn)定
while((PIND|=BIT(2))==0); //檢測按鍵是否抬起
GICR|=BIT(6);
}
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<1141;j++);
}
void InitC_0() //配置c口高四位為輸出,低四位為帶上拉電阻的輸入
{ DDRC=0xf0;
PORTC=0x0f;
}
void InitC_1() //配置c口低四位為輸出,高四位為帶上拉電阻的輸入
{
DDRC=0x0f;
PORTC=0xf0;
}
void show(uchar i,uchar j) //在數(shù)碼管的第i位,顯示數(shù)字j
{
PORTA=0x00;
PORTA|=BIT(i);
PORTB=0x02;
PORTB=0x00;
PORTA=0x00;
PORTA=~code[j];
PORTB=0X01;
PORTB=0X00;
// delay(1);
}
void display_1(long i) //檢測一整數(shù)的位數(shù)并顯示
{
if(i==0)show(0,0);
else
{
uchar t=9;
uchar wei,x=0;
long j=10000000;
while(x==0) //檢測i的位數(shù)
{ x=(i>=j);
j/=10;
t--;
}
for(wei=0;wei<t;wei++) //從低位到高位依次顯示
{ show(wei,i%10);
i/=10;
}
}
}
void display(float a)
{
float n;
long i=(long)a;
n=a-i;
if(n==0)display_1(i);
else{
uchar t=9;
uchar wei,x=0;
long j=10000000;
while(x==0) //檢測i的位數(shù)
{ x=(i>=j);
j/=10;
t--;
}
show(8-t,10);
for(wei=8-t;wei<8;wei++) //先確定最低位在數(shù)碼管的位置,然后從低位到高位依次顯示
{ show(wei,i%10); //整數(shù)部分
i/=10;
}
for(wei=7-t;wei+1>0;wei--)//小數(shù)部分顯示
{
n*=10;
show(wei,(long)n%10);
}
}
}
uint keyscan()
{
uint i,j;
InitC_0();
//delay(10);
i=PINC;
if(i==0x0f)return 0xff;
i&=0x0f;
InitC_1();
j=PINC;
j&=0xf0;
i|=j;
if(i==0xD7)return 0; //0 11010111
if(i==0xEB)return 1; //1 11101011
if(i==0xDB)return 2; //2 11011011
if(i==0xBB)return 3; //3 10111011
if(i==0xED)return 4; //4 11101101
if(i==0xDD)return 5; //5 11011101
if(i==0xBD)return 6; //6 10111101
if(i==0xEE)return 7; //7 11101110
if(i==0xDE)return 8; //8 11011110
if(i==0xBE)return 9; //9 10111110
if(i==0xB7)return '='; //= 10110111
if(i==0x77)return '+'; //+ 01110111
if(i==0x7B)return '-'; //- 01111011
if(i==0x7D)return '*'; //* 01111101
if(i==0x7E)return '/'; /// 01111110
if(i==0xe7)return 'C';
else return 0xff;
}
void main(void)
{
float a,b;
uchar t=0xff;
uint n=5821;
uint key;
DDRA=0XFF;
PORTA=0Xff;
DDRB=0X03;
InitC_0();
MCUCR=2; //設(shè)置INT0為下降沿觸發(fā)中斷
GICR|=BIT(6);
SREG|=BIT(7);
while(1)
{
if(i!=0xff)
{
if(i<10){ a=10*a+i;i=0xff;}
else
{
if(i=='+'){ sign=1;b=a;a=0;}
if(i=='-'){ sign=2;b=a;a=0;}
if(i=='*'){ sign=3;b=a;a=0;}
if(i=='/'){ sign=4;b=a;a=0;}
if(i=='C'){ sign=0;a=0;b=0;}
if(i=='=')
{ switch(sign)
{
case 1:a=a+b;break;
case 2:a=b-a;break;
case 3:a=a*b;break;
case 4:a=b/a;break;
default: break;
}
sign=0;
}
i=0xff;
}
}
t=0x0f;
while(t--)display(a);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -