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

📄 pro8279.c

📁 关于8279的键盘的读取及驱动数码显示的例子
💻 C
字号:
#define PRO8279_C
#include <REGX51.h>
#include "pro8279.h"
#include "main.h"

enum tagEnumDot DotPosition;	/*显示小数点位置*/
bit bDisplayType;	/*显示类型*/

/*8279初使化*/

void Initialize8279(void)
{
	unsigned char i;

	COMMAND_8279 = CLEAR_8279;	/*8279清除命令*/	
	COMMAND_8279 = MODE_8279;	/*8279方式设置*/
	COMMAND_8279 = CLOCK_8279;	/*8279时钟编程*/
	COMMAND_8279 = WRITE_8279;	/*8279写RAM命令*/

	for(i = 0; i < 12; i ++)
	{
		DATA_8279 = 0xff;	/*送一个数据*/
	}
}

/*设置小数点位置*/

void SetDotPosition(enum tagEnumDot position)
{
	DotPosition = position;
}	

/*设置显示类型*/

void SetDisplayType(bit type)
{
	bDisplayType = type;
}

/*显示函数*/

void Display(enum tagEnumBegin begin, enum tagEnumCount count, unsigned int iData)
{
	bit bHide = true;
	unsigned char i, j = 0;
	unsigned int divisor = DIVISOR;
	unsigned int temp;
	unsigned char display[DISPLAYMAX];

	if(count > DISPLAYMAX)
	{	
		bDisplayType = CHAR;		/*字符显示*/
		count -= DISPLAYMAX;        /*显示个数*/
		j = DISPLAYMAX - count;		/*显示存储位置*/
		i = j;
		for(; j < DISPLAYMAX; j ++)
		{
			display[j] = iData / 4096;
			iData <<= 4;				
		}		
		for(; i < DISPLAYMAX; i ++)
		{			
			display[i] += VK_A;
			display[i] = GetLedCodeIndex(display[i]);
			display[i] = GetLedCode(display[i]);
		}
	}
	else
	{
		bDisplayType = COUNT;		/*数值显示*/
		for(j = 0; j < DISPLAYMAX; j ++)	/*数值显示转换*/
		{
			temp = iData / divisor;	/*取整*/
			iData %= divisor;		/*取余*/
			display[j] = temp;
			display[j] = GetLedCode(display[j]);
			divisor /= 10;
		}
		for(j = 0; j < DotPosition; j++)	/*小数点/无效0处理*/
		{
			if(display[j] == GetLedCode(0))
			{
				display[j] = DISPLAYHIDE;			/*直到大于0的数值出现之前,无效0不显示*/		 
			}
			else
			{				
				break;
			}			
		}
		if(DotPosition != NODOT)	/*显示小数点*/
			display[DotPosition] &= DOTVALUE;			/*加小数点*/	
	}

	/*计算显示值*/

	j = DISPLAYMAX - count;	/*显示存储位置*/

	begin |= WRITE_8279;	/*计算开始显示的位置*/	
	COMMAND_8279 = begin;	/*8279写显示RAM命令*/
	for(; j < DISPLAYMAX; j ++)
	{			
		DATA_8279 = display[j];	
	}	
}

/*获取用户输入键值*/

unsigned char GetKeyValue(void)
{
	unsigned char k;	

	if(!IE0)//  
	{
		k = KEY_N1_3;	/*读取N1-N3的键值*/
		k &= 0x0e;	/*只要D3-D1三位*/
		k <<= 3;	/*键值左循环3位,避免与8279键值冲突*/			
	}
	else
	{
		COMMAND_8279 = READ_8279;		/*读8279键盘命令*/
		k = DATA_8279;				/*读8279FIFO RAM键值*/
		k &= 0x3f;				/*屏蔽控制及移位键*/
		IE0 = 0;
		RESET_8279();		/*8279中断复位*/
	}	
	if(!IsDefineKey(k))	/*消除未定义的键值*/
	{
		k = ERROR;		
	}
	return k;			/*返回键值*/		
}

/*取显示代码*/

unsigned char GetLedCode(unsigned char index)
{
	unsigned char code Display[]=
		{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,	/*0~9*/
		 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 					/*a~f*/				
		 0x89, 0xc7, 0x8c, 0xc1, 0xbf, 0xff, 		/*H,L,-,P,U,空格*/
		 0xce, 0xf9, 0x92};					/*T,I,S*/	
			 		 		 
	return Display[index];
}

/*获取显示代码索引*/

unsigned char GetLedCodeIndex(unsigned char value)
{
	unsigned char index;

	switch(value)
	{
		/*数值键*/
		case VK_0: 			index = 0; break;						
		case VK_1: 			index = 1; break;			
		case VK_2:			index = 2; break;		
		case VK_3:			index = 3; break;			
		case VK_4: 			index = 4; break;			
		case VK_5: 			index = 5; break;			
		case VK_6: 			index = 6; break;			
		case VK_7: 			index = 7; break;			
		case VK_8: 			index = 8; break;			
		case VK_9: 			index = 9; break;			
		/*特殊字符*//*功能键*/
		case VK_A:
 		case VK_MODE: 		index = 10; break;								
		case VK_B:
		case VK_DISP: 		index = 11; break;	
		case VK_C:
		case VK_START: 		index = 12; break;	
		case VK_D:
		case VK_FUN: 		index = 13; break;	
		case VK_E:
		case VK_ENTER: 		index = 14; break;	
		case VK_F:
		case VK_MA: 		index = 15; break;	
		case VK_H:
		case VK_UP: 		index = 16; break;		
		case VK_L:
		case VK_DOWN: 		index = 17; break;	
		case VK_P:
		case VK_ADD: 		index = 18; break;	
		case VK_U: 			index = 19; break;			
		case VK_MIDDLELINE: index = 20; break;			
		case VK_SPACE: 		index = 21; break;
		case VK_T: 			index = 22; break;
		case VK_I: 			index = 23; break;
		case VK_S: 			index = 24; break;
		/*需要时继续往下加*/
		default: return ERROR;						
	}
	return index;	
}

/*判断是否为用户定义的键值*/

bit IsDefineKey(unsigned char value)
{
	switch(value)
	{
		/*数值键*/
		case VK_0:						
		case VK_1:			
		case VK_2:		
		case VK_3:			
		case VK_4:		
		case VK_5:			
		case VK_6:	
		case VK_7:		
		case VK_8:			
		case VK_9:			
		/*功能键*/
 		case VK_MODE:						
		case VK_DISP:
		case VK_START:
		case VK_FUN:
		case VK_ENTER:
		case VK_MA:
		case VK_UP:
		case VK_DOWN:
		case VK_ADD:
			return true;
		default:
			return false;
	}
}

⌨️ 快捷键说明

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