?? microvfd.c
字號:
{
VFD_strobeSendByte(VFD_ADDRESS_FIX);
VFD_next_state = VFD_state_refresh_3;
}
PRIVATE void VFD_state_refresh_3()
{
unsigned char * refresh_tbl = T_VFD_refresh_tbl;
RefreshCounter = POPVFD;
CLEAR_VFD_STROBE;
VFD_objectSendByte(refresh_tbl[RefreshCounter] | VFD_ADDRESS_MASK);
VFD_next_state = VFD_state_refresh_4;
}
PRIVATE void VFD_state_refresh_4()
{
VFD_objectSendByte(ShadowRam[RefreshCounter]);
SET_VFD_STROBE;
VFD_next_state = VFD_state_refresh_5;
}
PRIVATE void VFD_state_refresh_5()
{
if (EnableFlashing && (glbTimer > ObjectTime.FlashTime)) {
ObjectTime.FlashTime = glbTimer + HALF_SECOND;
flashCalendar();
}
VFD_next_state = VFD_state_scan_key_0;
}
#endif /* D16312 */
#ifdef MN12510
/* By Liang Weihua */
PRIVATE int AddrCounter;
PRIVATE int ShadowCounter;
PRIVATE int ReadKey;
/************************************************************************
********************** State machine for 12510 *************************
************************************************************************/
PRIVATE void VFD_state_init()
{
/* STATE_INIT is too long,and it can reset by itself,so I don't send 0 to it
--- Liang Weihua */
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x00);
VFD_objectSendByte(FLPCNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x01);
VFD_objectSendByte(DGTCNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x02);
VFD_objectSendByte(SEGCNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x03);
VFD_objectSendByte(P01CNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x04);
VFD_objectSendByte(P2DIR);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x05);
VFD_objectSendByte(P2CNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x06);
VFD_objectSendByte(P3DIR);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x07);
VFD_objectSendByte(P3CNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x08);
VFD_objectSendByte(KEYCNT);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x0c);
VFD_objectSendByte(P01DATA);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x0d);
VFD_objectSendByte(P2DATA);
SET_VFD_STROBE;
CLEAR_VFD_STROBE;
VFD_objectSendByte(0x0e);
VFD_objectSendByte(P3DATA);
SET_VFD_STROBE;
VFD_next_state = VFD_state_scan_key_0;
}
PRIVATE void VFD_state_scan_key_0()
{
CLEAR_VFD_STROBE;
DataLength = KEY_LENGTH;
ReadKey = 0x60;
VFD_state_scan_key_1();
}
PRIVATE void VFD_state_scan_key_1()
{
CLEAR_VFD_STROBE;
VFD_objectSendByte(ReadKey++);
VFD_next_state = VFD_state_scan_key_2;
}
PRIVATE void VFD_state_scan_key_2()
{
VFD_objectReadByte();
ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;
--DataLength;
VFD_next_state = VFD_state_scan_key_3;
}
PRIVATE void VFD_state_scan_key_3()
{
VFD_objectReadByte();
ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;
SET_VFD_STROBE;
if (--DataLength)
VFD_next_state = VFD_state_scan_key_1;
else
VFD_next_state = VFD_state_scan_key_4;
}
PRIVATE void VFD_state_scan_key_4()
{
VFD_searchKey();
VFD_next_state = VFD_state_scan_key_5;
}
PRIVATE void VFD_state_scan_key_5()
{
VFD_parseKey();
VFD_next_state = VFD_state_refresh_0;
}
PRIVATE void VFD_state_refresh_0()
{
if (!VFDptr)
VFD_state_refresh_4();
else
VFD_state_refresh_1();
}
PRIVATE void VFD_state_refresh_1()
{
unsigned char * refresh_tbl = T_VFD_refresh_tbl;
RefreshCounter = POPVFD;
AddrCounter = (int)(RefreshCounter/2);
if (RefreshCounter & 0x1)
ShadowCounter = (RefreshCounter - 1);
else
ShadowCounter = RefreshCounter;
CLEAR_VFD_STROBE;
VFD_objectSendByte(refresh_tbl[AddrCounter] | VFD_ADDRESS_MASK);
VFD_next_state = VFD_state_refresh_2;
}
PRIVATE void VFD_state_refresh_2()
{
VFD_objectSendByte(ShadowRam[ShadowCounter++]);
VFD_next_state = VFD_state_refresh_3;
}
PRIVATE void VFD_state_refresh_3()
{
VFD_objectSendByte(ShadowRam[ShadowCounter]);
SET_VFD_STROBE;
VFD_next_state = VFD_state_refresh_4;
}
PRIVATE void VFD_state_refresh_4()
{
if (EnableFlashing && (glbTimer > ObjectTime.FlashTime)) {
ObjectTime.FlashTime = glbTimer + HALF_SECOND;
flashCalendar();
}
VFD_next_state = VFD_state_scan_key_0;
}
#endif /* MN12510 */
#ifdef BU2872
/* By Liang Weihua */
PRIVATE int AddrCounter;
PRIVATE int ShadowCounter;
/************************************************************************
********************** State machine for 2872 **************************
************************************************************************/
PRIVATE void VFD_state_init()
{
/*
* BU2872AK VFD driver only send two bit per send a address,its speed
* very slow, sending 0 to it in STATE_INIT use time,and it can reset ,
* so I don't do it! --- Liang Weihua
*/
VFD_strobeSendByte(VFD_MODE);
VFD_next_state = VFD_state_scan_key_0;
}
PRIVATE void VFD_state_scan_key_0()
{
SET_VFD_STROBE;
DataLength = KEY_LENGTH;
VFD_objectSendByte(VFD_READ_KEY);
VFD_next_state = VFD_state_scan_key_1;
}
PRIVATE void VFD_state_scan_key_1()
{
VFD_objectReadByte();
VFD_next_state = VFD_state_scan_key_2;
}
PRIVATE void VFD_state_scan_key_2()
{
ObjectKey.KeyBuffer[KEY_LENGTH - DataLength] = ReceivedByte;
if (--DataLength)
VFD_state_scan_key_1();
else {
CLEAR_VFD_STROBE;
VFD_state_scan_key_3();
}
}
PRIVATE void VFD_state_scan_key_3()
{
VFD_searchKey();
VFD_next_state = VFD_state_scan_key_4;
}
PRIVATE void VFD_state_scan_key_4()
{
VFD_parseKey();
VFD_next_state = VFD_state_refresh_0;
}
PRIVATE void VFD_state_refresh_0()
{
if (!VFDptr)
VFD_state_refresh_4();
else {
VFD_strobeSendByte(VFD_MODE);
VFD_next_state = VFD_state_refresh_1;
}
}
PRIVATE void VFD_state_refresh_1()
{
unsigned char * refresh_tbl = T_VFD_refresh_tbl;
RefreshCounter = POPVFD;
AddrCounter = (int)(RefreshCounter/2) + 1;
if (RefreshCounter & 0x1)
ShadowCounter = RefreshCounter;
else
ShadowCounter = (RefreshCounter + 1);
SET_VFD_STROBE;
VFD_objectSendByte(refresh_tbl[AddrCounter] | VFD_ADDRESS_MASK);
VFD_next_state = VFD_state_refresh_2;
}
PRIVATE void VFD_state_refresh_2()
{
VFD_objectSendByte(ShadowRam[ShadowCounter--]);
VFD_next_state = VFD_state_refresh_3;
}
PRIVATE void VFD_state_refresh_3()
{
VFD_objectSendByte(ShadowRam[ShadowCounter]);
CLEAR_VFD_STROBE;
VFD_next_state = VFD_state_refresh_4;
}
PRIVATE void VFD_state_refresh_4()
{
if (EnableFlashing && (glbTimer > ObjectTime.FlashTime)) {
ObjectTime.FlashTime = glbTimer + HALF_SECOND;
flashCalendar();
}
VFD_next_state = VFD_state_scan_key_0;
}
#endif /* BU2872 */
int micro_convert_irkey(int ir_key)
{
int irKey;
int newKey;
char * key_tbl = T_IR_key_tbl;
irKey = ir_key & 0xff;
#ifdef DEBUG_OSD
/* debug_osd("IRKEY",irKey,13);*/
#endif
#ifdef IR_PHILIPS
/* Philips IR */
newKey = key_tbl[irKey];
#endif /* IR_PHILIPS */
#if (IR_NEC || IR_SANYO)
/* NEC or SANYO */
if (REMOTE_KEY > 0x20)
newKey = key_tbl[irKey - 0x20];
else
newKey = key_tbl[irKey];
#endif /* IR_NEC || IR_SANYO */
return (newKey);
}
int micro_is_power_key(int ir_key)
{
int newKey;
#ifndef MASTER
newKey = micro_convert_irkey(ir_key) | 0xff00;
if (newKey == POWER_KEY)
return (1);
#endif
return (0);
}
#ifdef VCDROM
int micro_is_reset_key(int ir_key)
{
int newKey;
newKey = micro_convert_irkey(ir_key);
if ((newKey == POWER_KEY) || (newKey == EJECT_KEY))
return (1);
return (0);
}
#endif
void microEngine(void)
{
int tmpKey;
static int oldTimer;
extern int dsa_status;
#ifdef SGAME
static unsigned int hltimer;
#endif
if (REMOTE_VALID) {
CLEAR_REMOTE;
tmpKey = micro_convert_irkey(codeIR);
ObjectKey.FireKey = tmpKey;
#ifdef SGAME
if (vcd_game_loaded == 1){
if ((ObjectKey.FireKey == 0x68) || (ObjectKey.FireKey == 0x69))
goto sgame_loop;
}
#endif
VFD_parseKey();
}
#ifdef SGAME
sgame_loop:
if (vcd_game_loaded == 1){
if (ObjectKey.FireKey == 0x68) {
av_game_flag ^=1;
if (av_game_flag == 1)
SET_VCD_V;
else
SET_GAME_V;
VFD_parseKey();
return;
}
if (ObjectKey.FireKey == 0x69) {
CLEAR_H_L;
/* CLEAR_WE;*/
hltimer = glbTimer;
while(1) if((glbTimer - hltimer) > 10) break;
SET_H_L;
SET_WE;
av_game_flag = 0;
SET_GAME_V;
VFD_parseKey();
return;
}
}
#endif
#if defined(DVD_VCD) && defined(SLAVE) /* vcd slave have no VFD to show */
return;
#endif
#ifdef DSC
if (DSC_status == DSC_STATUS_RUNNING) {
if (glbTimer <= oldTimer+5 &&
(VFD_next_state == VFD_state_scan_key_0) && !VFDptr)
return;
oldTimer = glbTimer;
if (VFDptr && (VFD_next_state == VFD_state_scan_key_0)) {
VFD_next_state = VFD_state_refresh_0;
}
}
#endif
VFD_next_state();
}
PRIVATE void VFD_objectReadByte(void)
{
int i;
for (i = 0; i < 8; i++) {
#ifdef VFD_RCV_MSB_FIRST
/* Receive most significant bit first */
ReceivedByte <<= 1;
CLEAR_VFD_CLK;
asm("nop");asm("nop");
SET_VFD_CLK;
ReceivedByte &= ~0x01;
if (VFD_DATA_HIGH)
ReceivedByte |= 0x01;
#else
/* Receive least significant bit first */
ReceivedByte >>= 1;
CLEAR_VFD_CLK;
TRIGGER_HOST_PORT;
ReceivedByte &= ~0x80;
if (VFD_DATA_HIGH)
ReceivedByte |= 0x80;
SET_VFD_CLK;
#endif /* VFD_RCV_MSB_FIRST */
}
TRISTATE_VFD_DATA ;
}
PRIVATE void VFD_objectSendByte(int SendByte)
{
int i;
for (i = 0;i <8;i++) {
#ifdef VFD_XMIT_MSB_FIRST
/* Transmit most significant bit first */
CLEAR_VFD_CLK;
if (SendByte & 0x80) {
SET_VFD_DATA;
} else {
CLEAR_VFD_DATA;
}
SET_VFD_CLK;
SendByte <<= 1;
#else
/* Transmit least significant bit first */
CLEAR_VFD_CLK;
if (SendByte & 0x01) {
SET_VFD_DATA;
} else {
CLEAR_VFD_DATA;
}
SET_VFD_CLK;
SendByte >>= 1;
#endif /* VFD_XMIT_MSB_FIRST */
}
TRISTATE_VFD_DATA;
}
/*
* If the item is already in the list of things to update, then
* don't do anything. Otherwise, put the item in the list.
*/
PRIVATE void VFD_push(state)
{
int i;
for (i = 0; i < VFDptr; i++)
if (VFD_refresh_stack[i] == state)
return;
VFD_refresh_stack[VFDptr++] = state;
}
PRIVATE void VFD_strobeSendByte(int data)
{
VFD_STROBE_ACTIVE;
VFD_objectSendByte(data);
VFD_STROBE_INACTIVE;
}
void Waiting_powerkey_up()
{
while (KeySearchLock)
microEngine();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -