📄 pro8279.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 + -