⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计算器._c

📁 八位整数的+-*/
💻 _C
字号:
#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);             //先关闭中断,因为用的是键盘反转扫描法,故扫描过程中会出现
	 	                        //电平交替变化,为防止再次触发中断先关闭中断
 	 if(keyscan()!=255)         //检测按键是否有效
	 i=keyscan();
	 while(t--);                //按键扫描会导致电平不稳定,延时一小段时间等待波形稳定
	 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)           //在数码管的第i位,显示数字j
{
 	 PORTA=0x00;	 	
	 PORTA|=BIT(i);
	 PORTB=0x02;
	 PORTB=0x00;
	 PORTA=0x00;
	 PORTA=~code[j];
	 PORTB=0X01;
	 PORTB=0X00;
	// delay(1);
}
 	 	         
void display(long i)         //检测一整数的位数并显示
{  	 
	 if(i==0)show(0,0);
	 else
	 {
	 	uchar t=9;
     	uchar wei,x=0;
	 	long j=10000000;
 	 	while(x==0)             //检测i的位数
	 	{ 	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的位数
	 	   { 	x=(i>=j);
	 			j/=10;
				t--;
	 		}
					
			show(8-t,10);	
			for(wei=8-t;wei<8;wei++)  //先确定最低位在数码管的位置,然后从低位到高位依次显示
	 		{  show(wei,i%10);        //整数部分
	       	   i/=10;
	 		}
			 
	 		for(wei=7-t;wei+1>0;wei--)//小数部分显示
			{						
				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;        //设置INT0为下降沿触发中断
	 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);
	}
}
	 
	 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -