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

📄 text1.c

📁 单片机实现计算器程序
💻 C
字号:
#include <reg51.h>
#include<math.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dc=0xa0;		/*P2.0	LCD的RS  21*/
sbit rw=0xa1;		/*P2.1	LCD的R/W 22*/
sbit cs=0xa4;		/*P2.4	LCD的E   25*/
sfr  lcdbus=0x80;	/*p0	LCD数据 D0=P0.0*/
void soft_nop(){}
void lcd_wr(char a);
void lcd_wrdata(uchar a);
void lcd_init(void);
void lcd_cls(void);

void soft_10ms()/***********12MHZ提供10MS软件延时************/
{	register int i;
	for(i=0;i<711;i++);
}
void soft_20ms()/***********12MHZ提供20MS软件延时************/
{	soft_10ms();
	soft_10ms();
}

uchar keyscan( )
{uchar rcode , lcode;
 uint i;
 P1=0xf0;
 if((P1 & 0xf0)!=0xf0)
 	{for(i=1;i<16;i++)
	 	soft_20ms();
     if((P1 & 0xf0)!=0xf0)
	 	{rcode = 0xfe;
		 while((rcode & 0x10)!=0)
		 	{P1 = rcode;
			 if((P1 & 0xf0)!=0xf0)
			 	{lcode = (P1 & 0xf0);
				 rcode = (rcode & 0x0f);
				 return(rcode + lcode);
				 }
			 else
			   rcode = (rcode<<1)|0x01;
			}
		}
	}
	return(0);
}
	
uchar data lcdcounter;
bit lcdusing1,lcdusing2;
bit lcd_checkbusy()/*检查LCD忙*/
{	register lcdstate;
	dc=0;				/*dc=1为数据,=0为命令.*/
	rw=1;				/*rw=1为读,=0为写.*/
	cs=1;				/*cs=1选通.*/
	soft_nop();
	lcdstate=lcdbus;
	cs=0;
	return((bit)(lcdstate&0x80));
}

void lcd_string(char *strpoint) /*在当前显示位置显示LCD字符串*/
{	register i=0;
	while(strpoint[i]!=0){
		lcd_wrdata(strpoint[i]);
		i++;
		}
}


void lcd_wrcmd(uchar lcdcmd) /*写LCD命令*/
{	lcdusing1=1;
	while(lcd_checkbusy());
	lcdbus=lcdcmd;
	dc=0;				/*dc=1为数据,=0为命令.*/
	rw=0;				/*rw=1为读,=0为写.*/
	cs=1;				/*cs=1选通.*/
	soft_nop();
	cs=0;
	lcdbus=0xff;
	lcdusing1=0;
}

void lcd_wrdata(uchar lcddata) /*在当前显示位置显示数据*/
{	//char i;
	lcdusing2=1;
	//while(lcd_checkbusy());	
	if(lcdcounter==8){
//		lcd_moveto(20);
		lcd_wrcmd(0xC0);
		while(lcd_checkbusy());	
		}

	if(lcdcounter==16){
//		lcd_moveto(0);
		lcd_wrcmd(0x80);
	    while(lcd_checkbusy());	
		lcdcounter=0;
		}					/*为通用而如此*/
	lcdcounter++;
	lcdbus=lcddata;
	dc=1;				/*dc=1为数据,=0为命令.*/
	rw=0;				/*rw=1为读,=0为写.*/
	cs=1;				/*cs=1选通.*/
	soft_nop();
	cs=0;
	lcdbus=0xff;
	lcdusing2=0;
}


void calc( float* a,int k)
{ long int out,i=0,out3;
  float out1,out2;
  switch(k)
	{
		case 0:out1=a[0];break;
		case 1:out1=a[0]+a[1];break;
		case 2:out1=a[0]-a[1];break;
		case 3:out1=a[0]*a[1];break;
		case 4:out1=a[0]/a[1];break;
		default:break;
	}
	
	if(k==4&&a[1]==0)
		{
		 lcd_string("error!");
		 }
	else
		{out=(long int)out1;
         if(out<0)
			{lcd_wrdata('-');out=abs(out);}
	     if(out/10000)
			{lcd_wrdata(out/10000+'0');i++;}
         if(out%10000/1000)
			{lcd_wrdata(out%10000/1000+'0');i++;}
	     else if(i!=0)
			lcd_wrdata('0');
		 if(out%1000/100)
			{lcd_wrdata(out%1000/100+'0');i++;}
    	else if(i!=0)
			lcd_wrdata('0');
	     if(out%100/10)
			lcd_wrdata(out%100/10+'0');
         else if
			(i!=0)lcd_wrdata('0');
	lcd_wrdata(out%10+'0');
	i=0;
	if((out2=out1-out)>=0.001)
		{lcd_wrdata('.');
		 out3=(int)(out2*1000);
		 lcd_wrdata(out3%1000/100+'0');
	     lcd_wrdata(out3%100/10+'0');
		 lcd_wrdata(out3%10+'0');
		 }
	 }
}

void lcd_init()/*初始化*/
{	lcd_wrcmd(0x38);		/*设置8位格式,2行,5*7*/
	lcd_wrcmd(0x0c);		/*整体显示,关光标,不闪烁*/
	lcd_wrcmd(0x06);		/*设定输入方式,增量不移位*/
	//lcd_wrcmd(0x01);		/*清除显示*/
	lcdcounter=0;
}

void lcd_cls()/*清除显示*/
{	lcd_wrcmd(0x01);
	lcdcounter=0;
}



 void main(void)
 {uchar key;
  int j=0,k=0;
  float a[2]={0,0};
  
  lcd_init();
  while(1)
  	{
	 
	 key = keyscan();
	 switch(key)
	 {
	  case 0x7e:lcd_wrdata('0');a[j]=a[j]*10+0;break; 
	  case 0xbe:lcd_wrdata('1');a[j]=a[j]*10+1;break;
	  case 0xde:lcd_wrdata('2');a[j]=a[j]*10+2;break;
	  case 0xee:lcd_wrdata('3');a[j]=a[j]*10+3;break;
	  case 0x7d:lcd_wrdata('4');a[j]=a[j]*10+4;break;
	  case 0xbd:lcd_wrdata('5');a[j]=a[j]*10+5;break;
	  case 0xdd:lcd_wrdata('6');a[j]=a[j]*10+6;break;
	  case 0xed:lcd_wrdata('7');a[j]=a[j]*10+7;break;
	  case 0x7b:lcd_wrdata('8');a[j]=a[j]*10+8;break;
	  case 0xbb:lcd_wrdata('9');a[j]=a[j]*10+9;break;
	  case 0xdb:lcd_wrdata('+');k=1;j=1;break;
	  case 0xeb:lcd_wrdata('-');k=2;j=1;break;
	  case 0x77:lcd_wrdata('*');k=3;j=1;break;
	  case 0xb7:lcd_wrdata('/');k=4;j=1;break;
	  case 0xd7:lcd_wrdata('=');calc(a,k);a[0]=0;a[1]=0;j=0,k=0;break;
	  case 0xe7:lcd_cls();break;
	  default :break;
	  }
	 soft_20ms();
	 soft_20ms();
	 soft_20ms();
	 soft_20ms();
	 
	 }
  	  
  }

⌨️ 快捷键说明

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