栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

进制转换——基于STC89C52RC系列单片机

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

进制转换——基于STC89C52RC系列单片机

随着Internet技术的发展,人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势,可以充分地相信网络技术将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。

本设计实现在二进制、八进制、十进制间的转换。主要用到的是STC89C52RC系列的单片机,LCD1602显示屏以及4x4矩阵键盘。首先进行模式选择(共有六种模式)然后从矩阵键盘输入要转换的数字,按下转换键,在LCD1602显示屏上显示结果。

 将4×4矩阵键盘的S1、S2、S3、S5、S6、S7、S9、S10、S11、S14设为数字键(0~9),S15设置为功能键,S16为转换键。有六种进制转换的选项(B,O,D之间相互转换)。

#include
#include



sbit RS = P1^0;   //定义端口 
sbit RW = P1^1;
sbit EN = P2^5;
sbit DU = P2^6;
sbit WE = P2^7;

#define RS_CLR RS=0 
#define RS_SET RS=1

#define RW_CLR RW=0 
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0



void cmg88()//关数码管,点阵函数
{
	DU=1;
	WE=1;  
	P0=0x00;
	DU=0;
	WE=0;
}

void DelayUs2x(unsigned char t)
{   
 while(--t);
}

void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
	 DelayUs2x(245);
 }
}

 bit LCD_Check_Busy(void) 
 { 
 DataPort= 0xFF; 
 RS_CLR; 
 RW_SET; 
 EN_CLR; 
 _nop_(); 
 EN_SET;
 return (bit)(DataPort & 0x80);
 }

 void LCD_Write_Com(unsigned char com) 
 {  
 while(LCD_Check_Busy()); //忙则等待
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 }
 

 void LCD_Write_Data(unsigned char Data) 
 { 
 while(LCD_Check_Busy()); //忙则等待
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
 }

 //----------------------------------------------


 void LCD_Clear(void) 
 { 
 LCD_Write_Com(0x01); 
 DelayMs(5);
 }

 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
	 if (y == 0) 
	 	{     
		 	LCD_Write_Com(0x80 + x);     //表示第一行
	 	}
	 else 
	 	{      
	 		LCD_Write_Com(0xC0 + x);      //表示第二行
	 	}        
	 while (*s) 
	 	{     
			 LCD_Write_Data( *s);     
			 s ++;     
	 	}
 }

 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
	 if (y == 0) 
	 	{     
	 		LCD_Write_Com(0x80 + x);     
	 	}    
	 else 
	 	{     
	 		LCD_Write_Com(0xC0 + x);     
	 	}        
	 LCD_Write_Data( Data);  
 }

 void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);     
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);     
   LCD_Write_Com(0x01);     
   LCD_Write_Com(0x06);     
   DelayMs(5); 
   LCD_Write_Com(0x0C);    
   }

void delay(unsigned int xms)	//延迟xms
{
    unsigned char i,j;
	for(i=xms;i>0;i--)
	  for(j=112;j>0;j--);
}



void Transform10To2(unsigned int num){
	unsigned char e,x=0;
	unsigned long int n=2;
	while(1){					   //计算需要几个二进制位表示这个数字
		n*=2;
		x++;
		if(n>num) break;
	}

	 // LCD_Write_Char(14,1,x+0x30);
	while(x>=0){
	    e=num%2;
		LCD_Write_Char(x+2,1,e+0x30);
		num=num/2;
		x--;
		if(x==-1) break;
	}
}
void TransformTo10(unsigned long int num){
	  
	unsigned char e,x=0;
	unsigned long int n=10;
	while(1){					   //计算需要几个十进制位表示这个数字
		n*=10;
		x++;
		if(n>num) break;
	}

	 // LCD_Write_Char(14,1,x+0x30);
	while(x>=0){
	    e=num%10;
		LCD_Write_Char(x+2,1,e+0x30);
		num=num/10;
		x--;
		if(x==-1) break;
	}

}
void Transform10To8(unsigned long int num){
	unsigned char e,x=0;
	unsigned long int n=8;
	while(1){					   //计算需要几个八进制位表示这个数字
		n*=8;
		x++;
		if(n>num) break;
	}

	 // LCD_Write_Char(14,1,x+0x30);
	while(x>=0){
	    e=num%8;
		LCD_Write_Char(x+2,1,e+0x30);
		num=num/8;
		x--;
		if(x==-1) break;
}
}

char keyscan4x4()
{
    unsigned char temp,key; 
	///第一行扫描///
	P3=0xfe;//1111 1110 让P3.0口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);		 //消抖
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			//i++;
			switch(temp)
			{
			  case 0xee:	   //1110 1110 S1被按下
			       key=7;
				   break;
			  case 0xde:		  //1101 1110  S2被按下
				   key=8;
				   break;
			  case 0xbe:		  //1011 1110  S3被按下
				   key=9;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			
			//display(i-1,0,key);
			return key;
		}
	}
			///第二行扫描///
	P3=0xfd;//1111 1101 让P3.1口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			//i++;
			switch(temp)
			{
			  case 0xed:	   //1110 1101 S5被按下
			       key=4;
				   break;
			  case 0xdd:		  //1101 1101  S6被按下
				   key=5;
				   break;
			  case 0xbd:		  //1011 1101  S7被按下
				   key=6;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			//display(i-1,0,key);
			return key;
		}
	 }
			///第三行扫描///
	P3=0xfb;//1111 1011 让P3.2口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			//i++;
			switch(temp)
			{
			  case 0xeb:	   //1110 1011 S9被按下
			       key=1;
				   break;
			  case 0xdb:		  //1101 1011  S10被按下
				   key=2;
				   break;
			  case 0xbb:		  //1011 1011  S11被按下
				   key=3;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			//display(i-1,0,key);
			return key;
		  }
		}

			///第四行扫描///
	P3=0xf7;//1111 0111 让P3.0口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			//i++;
			switch(temp)
			{
			  case 0xd7:		  //1101 0111  S14被按下
				   key=0;
				   break;
			  case 0xb7:		  //1011 0111  S15被按下,功能选择
			  		key=11;
					break;				  
			  case 0x77:
			  		key=10;		  //0111 0111  S16被按下,确认转化
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			//display(i-1,0,key);
			return key;

		 }
	 }
	 return -1;


}

void main()
{	
    unsigned long int number;
	unsigned char key,i=0,count=0,g;
	cmg88();								//关数码管,点阵函数
	DelayMs(15);
	LCD_Init(); 
	LCD_Clear();							//清屏
	LCD_Write_String(0,0,"Select function");
		while(1)
		{  
			
	   		key=keyscan4x4();
			
			if(key==11){				   	//功能选择	
			g=count%6+1;   					//count++;
			}  
			switch(g){
				case 1:							  //十进制转二进制			
					//LCD_Write_String(0,0,"D:");
					//LCD_Write_String(0,1,"B:");
						if(i==0&&key!=-1&&key!=11){ 	
							LCD_Clear();
							LCD_Write_String(0,0,"D:");
							LCD_Write_String(0,1,"B:");
							}
	   					if(key!=-1&&key!=11){
						if(key==10){					  //按下确定按钮后
							//LCD_Write_Char(i,0,key+0x30);
							if(number>16383){				  //判断是否超过范围
								LCD_Write_String(2,1,"error!");
								number=0;
								i=0;
								continue;		//使输入确定键转化后不让10计算到number中
								}else{						//未超过范围则转化为二进制
								Transform10To2(number);
								number=0;
								//key=-1;
								i=0;					  
								continue;
								}
	   					}
						else{
								LCD_Write_Char(i+2,0,key+0x30);  //第一行显示输入的数字
								i++;						   //输入数字的位置
							}
	   	 				number=key+number*10;			   //将输入的数字字符转化为十进制
	   					}
						if(key==11){
						count++;
						LCD_Clear();
						LCD_Write_String(0,0,"D:");
						LCD_Write_String(0,1,"B:");
						//while(1);
						//key=-1;
						//break;
						}  
					//}
					break;
				case 2:							  //二进制转十进制
					//LCD_Write_String(0,0,"B:");
					//LCD_Write_String(0,1,"D:");
						if(i==0&&key<=1){ 	
							LCD_Clear();
							LCD_Write_String(0,0,"B:");
							LCD_Write_String(0,1,"D:");
							}
					if(key==0||key==1||key==10){
						switch(key){
							case 10:
								TransformTo10(number);
								number=0;
								i=0;
								break;
							default:
								LCD_Write_Char(i+2,0,key+0x30);
								i++;
								number=key+number*2;
						}
					}
					if(key==11){
						count++;
						LCD_Clear();
						LCD_Write_String(0,0,"B:");
						LCD_Write_String(0,1,"D:");
						break;
						}
					//}
					break;								  
				case 3:											  //八进制转二进制
					//LCD_Write_String(0,0,"O:");	  
				//	LCD_Write_String(0,1,"B:");
					if(i==0&&key>=0&&key<=7){ 	
							LCD_Clear();
							LCD_Write_String(0,0,"O:");	  
							LCD_Write_String(0,1,"B:");
							}
					if((key>=0&&key<=7)||key==10){
						switch(key){
							case 10:
								if(number>16383){				  //判断是否超过范围
								LCD_Write_String(2,1,"error!");
								number=0;
								i=0;
								continue;		
								}else{						//未超过范围则转化为二进制
								Transform10To2(number);
								number=0;
								i=0;					  
								continue;
								}
								break;
							default:
								LCD_Write_Char(i+2,0,key+0x30);
								i++;
								number=key+number*8;
						}
					}
					if(key==11){
						count++;
						LCD_Clear();
						LCD_Write_String(0,0,"O:");
						LCD_Write_String(0,1,"B:");
						break;
						}
								   
					break;
				case 4:							  //二进制转八进制
					//LCD_Write_String(0,0,"B:");	
					//LCD_Write_String(0,1,"O:");
					if(i==0&&key<=1){ 	
							LCD_Clear();
							LCD_Write_String(0,0,"B:");	
							LCD_Write_String(0,1,"O:");
							}
					if(key==0||key==1||key==10){
						switch(key){
							case 10:
								Transform10To8(number);
								number=0;
								i=0;
								break;
							default:
								LCD_Write_Char(i+2,0,key+0x30);
								i++;
								number=key+number*2;
						}
					}
					if(key==11){
						count++;
						LCD_Clear();
						LCD_Write_String(0,0,"B:");	
						LCD_Write_String(0,1,"O:");
						break;
						}	
					break;
				case 5:							//八进制转十进制
					//LCD_Write_String(0,0,"O:");	 
					//LCD_Write_String(0,1,"D:");
					if(i==0&&key<=7&&key>=0){ 	
							LCD_Clear();
							LCD_Write_String(0,0,"O:");	 
							LCD_Write_String(0,1,"D:");
							}
					if((key<=7&&key>=0)||key==10){
						switch(key){
							case 10:
								if(number>4294967290){				  //判断是否超过范围
								LCD_Write_String(2,1,"error!");
								number=0;
								i=0;
								continue;						 
								}else{
								TransformTo10(number);
								number=0;
								i=0;
								}
								break;
							default:
								LCD_Write_Char(i+2,0,key+0x30);
								i++;
								number=key+number*8;
						}
					}
					if(key==11){
						count++;
						LCD_Clear();
						LCD_Write_String(0,0,"O:");	 
						LCD_Write_String(0,1,"D:");
						break;
						}
					break;
				case 6:							//十进制转八进制		
					//LCD_Write_String(0,0,"D:");	 
					//LCD_Write_String(0,1,"O:");
					if(i==0&&key!=-1&&key!=11){ 	
						LCD_Clear();
						LCD_Write_String(0,0,"D:");	 
						LCD_Write_String(0,1,"O:");
						}
						if(key!=-1&&key!=11){
						switch(key){
							case 10:				 ;
								if(number>4294967290){				  //判断是否超过范围
								LCD_Write_String(2,1,"error!");
								number=0;
								i=0;
								continue;						  
								}else{							 
								Transform10To8(number);
								number=0;
								i=0;					  
								continue;
								}
								break;

							default:
								LCD_Write_Char(i+2,0,key+0x30);  //第一行显示输入的数字
								i++;
								number=key+number*10;
	   					}
						}
					if(key==11){
						count++;
						LCD_Clear();
						LCD_Write_String(0,0,"D:");	 
						LCD_Write_String(0,1,"O:");
						break;
						}
					break;
			}	
			
			
													   
			continue;	
			
			
	   }
	while(1);
	
	
	

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976410.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号