📄 commonfunc.c
字号:
//======================================================
// 文件名称: CommonFunc.c
// 功能描述: 系统相关程序和多个模块公用的程序
// 维护记录: 2006-09-20 v1.0
//======================================================
#include "..\include\SPCE061A.h"
#include "..\include\SPLC501User.h"
#include "..\include\LCD_Chinese.h"
#include "..\include\Key.h"
#include "..\include\Flash.h"
#include "..\include\4096.h"
#include "..\include\PhoneBook.h"
//========================================================================
// 语法格式: unsigned long SPR_GetResAddr(unsigned int ResIndex)
// 实现功能: 获取指定序号的资源在SPR4096中的起始地址
// 参数: ResIndex 资源的序号
// 返回值: 资源的起始地址,如果查找失败则返回-1
//========================================================================
unsigned long SPR_GetResAddr(unsigned int ResIndex)
{
unsigned long TempData;
unsigned long TempOffset;
TempData = SP_SIOReadAWord(0x00000);
TempData <<= 16;
TempData |= SP_SIOReadAWord(0x00002);
// if(TempData != 0x50535752) return -1; // 检查校验字
TempData = SP_SIOReadAByte(0x0000C); // 检查ResIndex是否存在
TempData <<= 8;
TempData |= SP_SIOReadAByte(0x0000D);
if((unsigned int)TempData<=ResIndex) return -1;
TempOffset = 0x00012L + ResIndex * 12; // 获得资源索引的存储地址
TempData = SP_SIOReadAByte(TempOffset); // 获得资源起始地址
TempData <<= 8;
TempData |= SP_SIOReadAByte(TempOffset + 1);
TempData <<= 8;
TempData |= SP_SIOReadAByte(TempOffset + 2);
TempData <<= 8;
TempData |= SP_SIOReadAByte(TempOffset + 3);
return TempData;
}
//========================================================================
// 语法格式: void System_Init(void)
// 实现功能: 系统初始化(系统时钟、中断、通讯录索引等)
// 参数: 无
// 返回值: 无
//========================================================================
void System_Init(void)
{
PHONEBOOK_IDX *p_PB_Idx, PB_Idx;
unsigned int i;
extern void Initial_INT(void);
SP_SIOInitial(); // 初始化SPR4096
LCD501_Init(0); // 初始化LCD
Key_Init(); // 初始化键盘
Initial_INT(); // 更新R_InterruptStatus(被语音识别程序使用)
p_PB_Idx = (PHONEBOOK_IDX *)PB_IDX_SA; // 如果是第一次使用则初始化通讯录索引
if(p_PB_Idx->ItemNum==0xffff)
{
p_PB_Idx = &PB_Idx;
p_PB_Idx->ItemNum = 0;
p_PB_Idx->FirstItem = (PHONEBOOK *)PB_ITEM_SA;
p_PB_Idx->LastItem = (PHONEBOOK *)PB_ITEM_SA;
p_PB_Idx->Voice_Num = 0;
for(i=0; i<PB_MAX_VOICE; i++)
p_PB_Idx->Voice_PBAddr[i] = NULL;
Flash_Modify(PB_IDX_SA, (unsigned int*)p_PB_Idx, sizeof(PHONEBOOK_IDX));
}
LCD501_SetHZStartAddr(SPR_GetResAddr(0));
}
//========================================================================
// 语法格式: void DelayMS(unsigned int ms)
// 实现功能: 延时一段时间(不精确)
// 参数: ms 延时的毫秒数
// 返回值: 无
//========================================================================
void DelayMS(unsigned int ms)
{
unsigned int i;
while(ms--)
{
for(i = 0; i < 1044; i++)*P_Watchdog_Clear = 1;
}
}
//========================================================================
// 语法格式: unsigned char Key_GetCh(void)
// 实现功能: 获取按键编码,4*4键盘编码排布如下:
// 1 2 3 Up(u)
// 4 5 6 Dn(d)
// 7 8 9 Enter(y)
// * 0 # Esc(n)
// 参数: 无
// 返回值: 按键编码
//========================================================================
unsigned char Key_GetCh(void)
{
unsigned char KeyCode, KeyCh;
KeyCode = Key_Get();
switch(KeyCode)
{
case PAD_0:
KeyCh = '0'; break;
case PAD_1:
KeyCh = '1'; break;
case PAD_2:
KeyCh = '2'; break;
case PAD_3:
KeyCh = '3'; break;
case PAD_4:
KeyCh = '4'; break;
case PAD_5:
KeyCh = '5'; break;
case PAD_6:
KeyCh = '6'; break;
case PAD_7:
KeyCh = '7'; break;
case PAD_8:
KeyCh = '8'; break;
case PAD_9:
KeyCh = '9'; break;
case PAD_STAR:
KeyCh = '*'; break;
case PAD_POUND:
KeyCh = '#'; break;
case PAD_UP:
KeyCh = 'u'; break;
case PAD_DN:
KeyCh = 'd'; break;
case PAD_ENTER:
KeyCh = 'y'; break;
case PAD_ESC:
KeyCh = 'n'; break;
default:
KeyCh = '\0'; break;
}
return KeyCh;
}
//========================================================================
// 语法格式: unsigned ShowMenu(const unsigned char **MenuItem, unsigned int ItemCount)
// 实现功能: LCD显示菜单,并通过按键进行选择
// 参数: MenuItem 菜单项字符串数组
// ItemCount 菜单项数量
// 返回值: 选中的菜单项(0 ~ ItemCount-1),若未选择任何项目则返回ItemCount
//========================================================================
unsigned ShowMenu(const unsigned char **MenuItem, unsigned int ItemCount)
{
unsigned CurItem, flagChanged, i;
unsigned KeyCode;
CurItem = 0;
flagChanged = 1; // 标示显示是否需要刷新
while(1)
{
/// 显示菜单项
if(flagChanged == 1)
{
LCD501_ClrScreen(0);
for(i = 0; i < 4 && (CurItem&0xfc)+i < ItemCount; i++)
{
LCD501_SetPos(16, i<<4);
LCD501_Print(MenuItem[(CurItem&0xfc)+i]);
}
LCD501_SetPos(0, (CurItem&0x03)<<4);
LCD501_Print("◆");
flagChanged = 0;
}
/// 按键控制
KeyCode = Key_GetCh();
if(KeyCode>='1' && KeyCode<='9') // 如果按数字键则直接进入相应选项
{
if(KeyCode-'1'<ItemCount)
return KeyCode-'1';
}
switch(KeyCode)
{
case 'u': // Up键
LCD501_SetPos(0, CurItem<<4);
LCD501_Print(" ");
flagChanged = 1;
if(CurItem == 0)
CurItem = ItemCount - 1;
else
CurItem--;
break;
case 'd': // Dn键
LCD501_SetPos(0, CurItem<<4);
LCD501_Print(" ");
flagChanged = 1;
if(CurItem == ItemCount - 1)
CurItem = 0;
else
CurItem++;
break;
case 'y': case '#': // Enter键或#键,确定
return CurItem;
case 'n': case '*': // Esc键或*键,取消
return ItemCount;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -