51单片机 简单计算机实现

书接上回;http://t.csdnimg.cn/T4b0W

键盘位置如上

效果图

因为是四位,就没显示等于号, 而且段数比较少 显示不出来加号 所以 A = + ; B = - ; C = *; D =/ 基本原来都一样.

代码奉上

cpp 复制代码
#include <reg51.h>

#include <STRING.H>


//利用矩阵键盘按键按下依次在数码管显示0-F。

/*
	接线:
	矩阵键盘:P3端口
	数码管:  P0端口
*/
#define KEY P3
#define DIG P0

void delay10ms(void);
unsigned char GetKey(void);
void CheckKeyValue(unsigned char);
unsigned char StrToNum(unsigned char);
void Refresh(); //刷新
void Equal();   //等于
//void ShowNum(); //显示数码管


void delay(unsigned int t)
{
    unsigned int i, j;
    for (i = 0; i < t; i++) {
        for (j = 0; j < 1275; j++) {
            ; // 空循环,等待时间过去
        }
    }
}

//计算机显示数组
unsigned char numShow[] = {0x01,0x02,0x03,0x04};
unsigned char numKey = 0;
unsigned char operationKey;
//独立数码管的显示0-F
unsigned char leddata[]={
	0x3F,  //"0"
    0x06,  //"1"
    0x5B,  //"2"
    0x4F,  //"3"
    0x66,  //"4"
    0x6D,  //"5"
    0x7D,  //"6"
    0x07,  //"7"
    0x7F,  //"8"
    0x6F,  //"9"
    0x77,  //"A"
    0x7C,  //"B"
    0x39,  //"C"
    0x5E,  //"D"
    0x79,  //"E"
    0x71,  //"F"
    0x76,  //"H"
    0x38,  //"L"
    0x37,  //"n"
    0x3E,  //"u"
    0x73,  //"P"
    0x5C,  //"o"
    0x40,  //"-"
    0x00  //熄灭
};

unsigned char keynum = 0;
unsigned char keyBool = 1;
void main(void)
{
	unsigned char Key = 0;
	unsigned char i  = 0;

	//P2=0;

	while(1)
	{	 
		Key = GetKey();
		if ((KEY == 0x0e || KEY == 0x0d||KEY == 0x0b||KEY == 0x07||KEY == 0xe0
		||KEY == 0xd0||KEY == 0xb0||KEY == 0x70)&&keyBool == 0 )
		{
			//keyBool = 1 ;
		}
		else
		{
			keyBool = 1 ;
		}

		
		for ( i = 0; i < 5; i++)
		{
			switch (i)
			{
			case 0:
				P0 =leddata[numShow[0]];
				P2 =0xFE;  //1111 1110
				break;
			case 1:
				P0 = leddata[numShow[1]];
				P2 =0xFD;//1111 1101  
				break;
			case 2:
				P0 =leddata[numShow[2]];
				P2 =0xFB;//1111 1011  
				break;
			case 3:
				P0 =leddata[numShow[3]];
				P2 =0xF7;//1111 0111 
				break;
			
			default:
				break;			
			}
				
			delay(1);
			P0=0x00;	
	}
	}
}
	
void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}


unsigned char GetKey(void)
{
	unsigned char KeyValue = 0;
	unsigned char hang = 0,lie = 0;
	unsigned char flag = 0;

	KEY = 0x0f;
	
	if(KEY != 0x0f && keyBool == 1 )	
	{
		keyBool = 0;
	    delay10ms();
		
		 switch (KEY)
		{
			case 0x0e: hang = 1; break; //0000  1110  
			case 0x0d: hang = 2; break; //0000  1101  
			case 0x0b: hang = 3; break; //0000  1011
			case 0x07: hang = 4; break; //0000  0111
			default:break;
		}
		KEY = 0xf0;
		if(KEY != 0xf0)
		{	
			switch (KEY)
			{
				case 0xe0: lie = 1; break;//1110  0000  
				case 0xd0: lie = 2; break;//1101  0000  
				case 0xb0: lie = 3; break;//1011  0000  
				case 0x70: lie = 4; break;//0111  0000  
				default:break;
			}			
	    	KeyValue = (hang - 1)*4 + lie;	
			CheckKeyValue(KeyValue);		   
		}
		return KeyValue;
	}
   return 0;
}
void CheckKeyValue(unsigned char keyvalue)
{
	switch (keyvalue)
	{
	    case 1:
		numShow[keynum] = 1;
		break;
		case 2:
		numShow[keynum] = 2;
		break;
		case 3:
		numShow[keynum] = 3;
		break;
		case 4:
		operationKey = 10;//+
		numShow[keynum] = 10;
		break;
		case 5:
		numShow[keynum] = 4;
		break;
		case 6:
		numShow[keynum] = 5;
		break;
		case 7:
		numShow[keynum] = 6;
		break;
		case 8:
		operationKey = 11;// /
		numShow[keynum] = 11;
		break;
		case 9:
		numShow[keynum] = 7;
		break;
		case 10:
		numShow[keynum] = 8;
		break;
		case 11:
		numShow[keynum] = 9;
		break;
		case 12:
		operationKey = 12;// /
		numShow[keynum] = 12;// *
		break;
		case 13:
		//刷新
		Refresh();
		break;
		case 14:
		numShow[keynum] = 0;
		break;
		case 15:
		//等于
		Equal(); 
		break;
		case 16:
		operationKey = 13;// /
		numShow[keynum] = 13; //   /
		break;
	
	default:
		break;
	}
	 ++keynum;
	//ShowNum();
}
void Refresh()
{
	keynum = -1;
	numShow[0] = 0x00;
	numShow[1] = 0x00;
	numShow[2] = 0x00;
	numShow[3] = 0x00;
}
void Equal()
{
	switch (operationKey)
	{
	case 10:
		numShow[3]  =numShow[0] + numShow[2];
		break;
	case 11:
		numShow[3]  = numShow[0] - numShow[2];
		break;
	case 12:
		numShow[3]  = numShow[0] * numShow[2];
		break;
	case 13:
		numShow[3]  = numShow[0] / numShow[2];
		break;
	default:
	numShow[3] = operationKey;
		//Refresh();
		break;
	}
	//ShowNum();

}

//字符串转化为数字
unsigned char StrToNum(unsigned char dig){

unsigned int num = 0;
switch (dig)
{
	case '0':
	num = 0;
	break;
case '1':
	num = 1;
		break;
	case '2':
	num = 2;
		break;
	case '3':
	num = 3;
		break;
	case '4':
	num = 4;
		break;
	case '5':
	num = 5;
		break;
	case '6':
		num = 6;	
		break;
	case '7':
		num = 7;	
		break;
	case '8':
		num = 8;	
		break;
	case '9':
		num = 9;	
		break;

	default:
		break;
}
return(num);

}
相关推荐
FreakStudio5 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
EVERSPIN8 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
每天一杯冰美式oh8 小时前
51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
芯橦11 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
少女忧12 小时前
51单片机学习第六课---B站UP主江协科技
科技·学习·51单片机
夜间去看海14 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu15 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白15 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_16 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人16 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc