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

📄 1.txt

📁 嵌入式系统实践 ARM7用键盘实现整数的加减乘
💻 TXT
字号:
/*********************************************************************************************
* File:	8led.c
* Author:	embest	
* Desc:	8-segment digit LED control functions
* History:	
*********************************************************************************************/
#include "44b.h"
#include "44blib.h"
#include "def.h"
#include "iic.h"

/*------------------------------------------------------------------------------------------*/
/*	 								global variables					 				    */
/*------------------------------------------------------------------------------------------*/
int f_nKeyPress;

/*------------------------------------------------------------------------------------------*/
/*	 								function declare						 				    */
/*------------------------------------------------------------------------------------------*/
void keyboard_test(void);
void keyboard_int(void);
UINT8T key_set(UINT8T ucChar);
void display_led(int s);
void led_test();
void clear_led();
void showerror();
void showoperator(UINT8T ucChar);
void ShowRolling(int temp3);

/*------------------------------------------------------------------------------------------*/
/*	 								global variables						 				    */
/*------------------------------------------------------------------------------------------*/
/*
		  __7___
		 |      |
		2|      |6
		 |--1---|
		3|      |5
		 |__4___|.0
		 
	data [7 6 5 4 3 2 1 0]
*/
unsigned char f_szDigital[] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};// 0 ~ 9

/*------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------*/
/*display_led函数用于在数码管上显示数字s,如果flg=0,则在L1上显示;如果flg=1,则在L2上显示;*/
void display_led(int s)
{
	int i;
	int j,k;
	k=s;

	clear_led();

	if(s==0)
	{
	iic_write(0x70, 0x14, f_szDigital[0]);
	return;
	}
	
	for(i=0; i<8; i++)
	{
		j=k%10;
		if(k!=0&&i<4)
			iic_write(0x70, 0x14+i, f_szDigital[j]);
		else if(k!=0&&i>=4)
			iic_write(0x70, 0x10+i-4, f_szDigital[j]);
		else if(k==0&&i<4)
			iic_write(0x70, 0x14+i, 0);
		else if(k==0&&i>=4)
			iic_write(0x70, 0x10+i-4, 0);
		k/=10;
	}
}

void clear_led()
{
	int i;
	for(i=0; i<8; i++)
		iic_write(0x70, 0x10+i, 0);
}

void showerror()
{
	int i=0;

	clear_led();
	unsigned char error[]={0x9E,0xEE,0xEE,0xFC,0xEE};
	
	iic_write(0x70, 0x10,error[0]);
	iic_write(0x70, 0x17,error[1]);
	iic_write(0x70, 0x16,error[2]);
	iic_write(0x70, 0x15,error[3]);
	iic_write(0x70, 0x14,error[4]);	
}

void showoperator(UINT8T ucChar)
{
	clear_led();

	unsigned char add[]={0xEE,0xFC,0xFC};
	unsigned char sub[]={0xB6,0x7C,0xFE};
	unsigned char che[]={0x9C,0x6E,0x9E};

	switch(ucChar)
	{
	case '+':
		iic_write(0x70, 0x16, add[0]);
		iic_write(0x70, 0x15, add[1]);
		iic_write(0x70, 0x14, add[2]);
		uart_printf("+\n");
		break;
	case '-':
		iic_write(0x70, 0x16, sub[0]);
		iic_write(0x70, 0x15, sub[1]);
		iic_write(0x70, 0x14, sub[2]);
		break;
	case '*':
		iic_write(0x70, 0x16, che[0]);
		iic_write(0x70, 0x15, che[1]);
		iic_write(0x70, 0x14, che[2]);
		break;
	}
}

void ShowRolling(int temp3)
{
	int rolling[20];
	int len=1;
	int i;
	int j;

	while(temp3!=0)
	{
		rolling[19-len++]=temp3%10;
		temp3/=10;
	}

	for(i=0;i<=19-len;i++)
		rolling[i]=-1;

	i=0;


	while(i<len)
	{
		for(j=0;j<4;j++)
		{
			if(rolling[i+8-j]<0)
				iic_write(0x70, 0x14+j,0);
			else
			
				iic_write(0x70, 0x14+j,f_szDigital[rolling[i+8-j]]);
		}
		for(;j<8;j++)
		{
			if(rolling[i+8-j]<0)
				iic_write(0x70, 0x10+j-4,0);
			else
			
				iic_write(0x70, 0x10+j-4,f_szDigital[rolling[i+8-j]]);
		}
		delay(6000);
		i++;
	}
}
/*********************************************************************************************
* name:		keyboard_test
* func:		test 8led
* para:		none
* ret:		none
* modify:
* comment:		
********************************************************************************************/
void keyboard_test(void)
{
	int i, j, k;
	UINT8T ucChar, t;

	int temp1,temp2,temp3,RollingNum;
	int oper;

	iic_init();
	
	// set EINT2 interrupt handler
    pISR_EINT2 = (int)keyboard_int;
    
    clear_led();

l1:	while(1)
	{		
		temp1=0;
		temp2=0;
		temp3=0;

		//首先等待输入第一个数
		while(1)
		{
			ucChar=0;
				
			 while(ucChar==0)
			 {
			 f_nKeyPress = 0;
			 rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_EINT2));		// enable EINT2 int

			 while(f_nKeyPress == 0);
			 iic_read(0x70, 0x1, &ucChar);
			 }

			 if(ucChar !=0)
			 {
				ucChar = key_set(ucChar);
				if(ucChar < 10)
				{
					temp1=temp1*10;
					temp1+=ucChar;
					display_led((temp1%100000000));
				}

				else if(ucChar == '+'|ucChar=='-'|ucChar=='*')
				{
					oper=ucChar;
					showoperator(ucChar);
					break;
				}
			 }
		}

		//然后等待输入第二个运算数
		while(1)
		{
			 ucChar=0;
				
			 while(ucChar==0)
			 {
			 	f_nKeyPress = 0;
			 	rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_EINT2));		// enable EINT2 int

			 	while(f_nKeyPress == 0);
			 	iic_read(0x70, 0x1, &ucChar);
			 }

			 if(ucChar !=0)
			 {
				ucChar = key_set(ucChar);

				if(ucChar < 10)
				{
					temp2=temp2*10;
					temp2+=ucChar;
					display_led(temp2%100000000);
				}

				else if(ucChar == 0xFF)
				{
					switch(oper)
					{
						case '+':
							temp3=temp1+temp2;
							break;
						case '-':
							temp3=temp1-temp2;
							break;
						case '*':
							temp3=temp1*temp2;
							break;
					}
					if(temp3<100000000)
					{
						display_led(temp3%100000000);
					}
					else
					{
						ShowRolling(temp3);
					}
					break;
				}

				else
				{
					showerror();
					goto l1;
					break;
				}
			 }
		}

	}

}

/*********************************************************************************************
* name:		keyboard_int
* func:		keyboard interrupt handler
* para:		none
* ret:		none
* modify:
* comment:		
********************************************************************************************/
void keyboard_int(void)
{
	UINT8T ucChar;
    delay(1000);
	rINTMSK = rINTMSK | BIT_EINT2;							// disable EINT2 int
    rI_ISPC = BIT_EINT2;
    f_nKeyPress = 1;
}
/*********************************************************************************************
* name:		key_set
* func:		keyboard setting
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
UINT8T key_set(UINT8T ucChar)
{
	switch(ucChar)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
				ucChar-=1; break;
		case 9:
		case 10:
		case 11:
		case 12:
		case 13:
				ucChar-=4; break;
		case 17:
		case 18:
		case 19:
		case 20:
		case 21:
				ucChar-=7; break;
		case 25: ucChar = 0xF; break;
		case 26: ucChar = '+'; break;
		case 27: ucChar = '-'; break;
		case 28: ucChar = '*'; break;
		case 29: ucChar = 0xFF; break;
		default: ucChar = 0xFE;
	}
	return ucChar;
}

⌨️ 快捷键说明

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