📄 mcu.c
字号:
#include "stdio.h"
#include "8051.H"
#include "RAM.H"
#include "MCU.H"
#include "MyDef.H"
#include "IIC.H"
#include "F63REG.H"
#include "UserAdj.H"
#include "Scaler.H"
#include "AutoAdj.H"
#include "OSD.H"
#include "ModeHandle.H"
#include "sRGB.H"
code unsigned char KeyTab[]={
0x00,0x20,0x40,0x60,0x7f
};
code unsigned char SystemRegTab[]={
0xff, // PortA
0xff, // PortB
#if PanelPowerActive == High
0x6c, // PortC
#else
0xee, // PortC
#endif
0x6e, // PortD
0x55, // CLRWDT
0x98, // ADC_CON
0x00, // ADC0_REG
0x00, // ADC1_REG
0x00, // ADC2_REG
0x00, // ADC3_REG
0x02, // PWM1 Enable
0x80, // PWM15 Enable
0x00, // PWM0
0x00, // PWM1 Volume
0x00, // PWM2
0x00, // PWM3
0x00, // PWM4
0x00, // PWM5
0x00, // PWM6
0x00, // PWM7
0x00, // PWM8
0x00, // PWM9
0x00, // PWM10
0x00, // PWM11
0x00, // PWM12
0x00, // PWM13
0x00, // PWM14
0x00, // PWM15 Brightness
0x8A, // DDC_CTRL
0x00, // DDC_REG
0x40, // DDC_ADDR
0xFF, // INTIIC0_FLG/CLR
0x1F, // INTIIC0_EN
NOVATEK_Addr, // IIC0_ADDR
0xFF, // IIC0_TXDAT
0x00, // IIC0_CON
0xF0, // IIC0_CLK
0xFF, // INTIIC1_FLG/CLR
0x00, // INTIIC1_EN
0x00, // IIC1_ADDR
0xFF, // IIC1_TXDAT
0x00, // IIC1_CON
0xF3, // IIC1_CLK
0x00, // INT_SRC
0x00, // INTEXT_FLG/CLR
0x00, // INTEXT_EN
0x00, // INTHV_FLG/CLR
0x00, // INTHV_EN
0x60, // SYNC_REG
0x08, // HVO_REG
0xE0, // HVI_REG
0x00, // HPW_REG
0x00, // HFLT_REG
0x0E, // CLMP_REG
0x20, // PAT_LT
0x20, // PAT_RT
0x20, // PAT_UP
0x20, // PAT_DN
0x0f, // HVCNT_CTRL
0x00, // HCNT_LB
0x00, // HCNT_HB
0x00, // VCNT_LB
0x00, // VCNT_HB
0xc8, // DCNT_LB
0x00, // DCNT_HB --> 12M/60KHz = 0x00c8
0x20, // LCNT_LB
0x03, // LCNT_HB --> 60KHz/75Hz = 0x0320
0x40, // MUTE_CTRL
0x00, // ISP_REG
0xFF, // FLASH_BUF
0x1f, // RDPA_REG
0xff, // RDPB_REG
0x04, // RDPC_REG
0x64, // RDPD_REG
};
void InitMCU(void)
{
unsigned char *p;
unsigned char i;
// P2 = 0xF0;
p = &PortA;
for(i=0; i<0x4A; i++){
*p = SystemRegTab[i];
p++;
}
// set timer 0
TMOD &= 0xf0;
TMOD |= 0x02;
TL0 = -250;
TH0 = -250;
TCON &= 0xcf;
TCON |= 0x10;
// set timer 1
TMOD &= 0x0f;
TMOD |= 0x20;
TL1 = 0xf3; //0xf3;
TH1 = 0xf3; //0xf3;
TCON &= 0x3f;
TCON |= 0x40;
SCON = 0x52;
PCON |= 0x80;
// set interrupt
CmdTxPtr1 = 0;
CmdTxPtr2 = 0;
CmdRxPtr1 = 0;
CmdRxPtr2 = 0;
T0_INT_CNT = 0;
rwbuf = 0;
abuf = 0;
dbuf = 0;
IE = 0x86;
#ifdef Debug
flag3 = 4;
#else
flag3 = 0;
#endif
Sleep(50);
PowerStatus = 0xff;
IIC_BaudRate = 0x02;
LoadDDCData(1);
}
void Timer0(void) interrupt 1 using 2
{
if(++T0_INT_CNT >= 4){
T0_INT_CNT = 0;
if(Timer1 != 0) // 1ms
Timer1--;
if(++Timer10ms >= 10){ // 10ms
CLRWDT = 0x55;
Timer10ms = 0;
if(Timer2 != 0)
Timer2--;
if(Timer3 != 0)
Timer3--;
if(Timer4 != 0)
Timer4--;
if(RepeatTimer != 0)
RepeatTimer--;
if(PoSvTimer != 0)
PoSvTimer--;
}
}
}
void Sleep(unsigned short time)
{
Timer1 = time; /* timeout n ms */
while(Timer1 != 0){
}
}
void WaitSetup(unsigned short time)
{
Timer1 = time; /* timeout n ms */
while(Timer1 != 0){
CheckModeChange();
}
}
void ScanKeyPad(void)
{
//unsigned char i,j,k;
unsigned char Temp;
Timer1 = 0;
/*
do{
while((ADC_REG[3] & BIT_7) == 0){};
KeyPad1 = ADC_REG[0] & 0x7f;
KeyPad2 = ADC_REG[1] & 0x7f;
if((ADC_REG[2] & 0x7f) < 0x38){
flag1 |= BIT_7;
return;
}
ADC_CON = 0x17; //Channel; // Start AD Convert
ADC_CON = 0x97; //Channel; // Start AD Convert
//check adc0
if(KeyPad1 > KeyTemp1){
if((KeyPad1 - KeyTemp1 ) > 5){
KeyTemp1 = KeyPad1;
flag1 |= BIT_2;
Timer1 = KeyStabTime;
}
}
else{
if((KeyTemp1 - KeyPad1 ) > 5){
KeyTemp1 = KeyPad1;
flag1 |= BIT_2;
Timer1 = KeyStabTime;
}
}
//check adc1
if(KeyPad2 > KeyTemp2){
if((KeyPad2 - KeyTemp2 ) > 5){
KeyTemp2 = KeyPad2;
flag1 |= BIT_2;
Timer1 = KeyStabTime;
}
}
else{
if((KeyTemp2 - KeyPad2 ) > 5){
KeyTemp2 = KeyPad2;
flag1 |= BIT_2;
Timer1 = KeyStabTime;
}
}
//check power key
if(((PortC & BIT_6) == 0)&&((flag3 & BIT_5) != 0)){
flag3 &= ~BIT_5;
flag1 |= BIT_2;
Timer1 = KeyStabTime;
}
if(((PortC & BIT_6) != 0)&&((flag3 & BIT_5) == 0)){
flag3 |= BIT_5;
flag1 |= BIT_2;
Timer1 = KeyStabTime;
}
}while(Timer1 != 0);
//change key
if((flag1 & BIT_2) != 0x00){
flag1 &= ~BIT_2;
if((flag3 & BIT_2) != 0x00){
printf("KEY1 = %x\r\n",(unsigned short)KeyTemp1);
printf("KEY2 = %x\r\n",(unsigned short)KeyTemp2);
}
for(i=0; i<5; i++){
if(KeyTemp1 > KeyTab[i])
j = KeyTemp1 - KeyTab[i];
else
j = KeyTab[i] - KeyTemp1;
if(j < 16){
j = i;
break;
}
}
for(i=0; i<5; i++){
if(KeyTemp2 > KeyTab[i])
k = KeyTemp2 - KeyTab[i];
else
k = KeyTab[i] - KeyTemp2;
if(k < 16){
k = i;
break;
}
}
KeyBuffer = k << 4;
KeyBuffer |= j;
*/
Temp=PortA;
Timer1=10;
while(Timer1);
Temp&=PortA;
Timer1=10;
while(Timer1);
KeyBuffer=(~Temp)&0x1F;
switch(KeyBuffer){
case 0x10:
KeyBuffer=PowerKey;
break;
case 0x08:
KeyBuffer=RightKey;
break;
case 0x04:
KeyBuffer=LeftKey;
break;
case 0x02:
KeyBuffer=DownKey;
break;
case 0x01:
KeyBuffer=UpKey;
break;
default:
KeyBuffer=0xff;
break;
}
if(KeyBuffer==KeyTemp1){flag1 &=~BIT_2;KeyTemp1=KeyBuffer;KeyBuffer=0xff;}
else {flag1 |= BIT_2; KeyTemp1=KeyBuffer;}
if((flag1 & BIT_2) != 0x00){/*
if((flag3 & BIT_5) == 0){
if(KeyBuffer == DownKey){
flag3 |= BIT_0;
flag2 &= ~BIT_5;
Write24C16(0xcd,0x01);
if((flag3 & BIT_2) != 0x00)
printf("Entry Factory mode\r\n");
}
else{
flag3 &= ~BIT_0;
k = Read24C16(0xe1);
k = ColorTab[k];
if(k == 0)
flag2 &= ~BIT_5;
else
flag2 |= BIT_5;
Write24C16(0xcd,0x00);
if((flag3 & BIT_2) != 0x00)
printf("Release Factory mode\r\n");
}
flag2 &= 0xf3; //clear display flag
KeyBuffer = PowerKey;
}*/
if((flag3 & BIT_2) != 0x00)
printf("KeyBuffer = %x\r\n",(unsigned short)KeyBuffer);
// set repeat timer
Repeat = KeyBuffer;
RepeatTimer = KeyHoldTime;
}
else{
if((RepeatTimer == 0)&&((OSD_Type > 0x00)||(OSD_Type < 0x04))){
switch(Repeat){
case LeftKey:
KeyBuffer = Repeat;
RepeatTimer = KeyRepeatTime;
break;
case RightKey:
KeyBuffer = Repeat;
RepeatTimer = KeyRepeatTime;
break;
}
}
}
}
void CheckKey(void)
{
//unsigned char k;
ScanKeyPad();
//out of range
//power saving
if((PowerStatus & BIT_7) == 0){
if(KeyBuffer == RightKey){
ModePoint = 0xff;
}
if(KeyBuffer == LeftKey){
ModePoint--;
}
if(KeyBuffer != PowerKey){
KeyBuffer = 0xff;
}
}
#if PanelPowerActive == High
else if(((PortC & BIT_7) == 0)||((flag3 & BIT_1) != 0)){
#else
else if(((PortC & BIT_7) != 0)||((flag3 & BIT_1) != 0)){
#endif
if((KeyBuffer != PowerKey)&&(KeyBuffer != SourceKey)){
KeyBuffer = 0xff;
}
}
//
switch(KeyBuffer){
case PowerKey: //POWER
KeyBuffer = 0xff;
if((PowerStatus & BIT_7) == 0){
PowerStatus |= BIT_7; //normal
Write24C16(0xcc,PowerStatus);
flag1 &= ~BIT_0;
if((flag1 & BIT_3) == 0){
flag1 |= BIT_3;
ForceToBackground(0); //Set fource to background
PoSvTimer = 500;
}
if(ModePoint == 0xfc){
LED_RedOn();
InitEEPROM();
LED_RedOff();
LoadModeIndependentSettings();
LoadADC_Gain();
SetBrightness();
sRGB();
SetSharpness();
}
ScalerPowerUp();
DVI_On();
SourceSelect();
}
else{
OSD_OFF();
PowerStatus &= ~BIT_7; //power off
Write24C16(0xcc,PowerStatus);
if((flag3 & BIT_0) != 0){
Write24C16(0xcd,0x00); //disable burn in mode
flag3 &= ~BIT_0;
}
PowerSaving();
DIG_Off();
DIV_PWND();
LED_RedOff();
LED_GrnOff();
}
break;
case DownKey: //MENNU
if(PowerStatus == 0x80){
NodeToggle=0;
MainMenu();
}
else
VideoMenu();
Timer2 = (unsigned short)OSD_Timer * 100;
break;
case LeftKey: //LEFT
if(NodeToggle==1){
if(PowerStatus == 0x80)
ValueDown();
else
VideoValueDown();
}
else{
if(OSD_Type == 1){
if(PowerStatus == 0x80)
SelectItem();
else
VideoSelectItem();
}
}
Timer2 = (unsigned short)OSD_Timer * 100;
break;
case RightKey: //RIGHT
if(NodeToggle==1){
if(PowerStatus == 0x80)
ValueUp();
else
VideoValueUp();
}
else{
if(OSD_Type == 1){
if(PowerStatus == 0x80)
SelectItem();
else
VideoSelectItem();
}
}
Timer2 = (unsigned short)OSD_Timer * 100;
break;
case UpKey: //Select
if((PowerStatus == 0x80)&&(SyncMode != 3)&&((flag1 & BIT_1) == 0)){
if(OSD_Type == 0){
ShowAutoAdj();
AutoTune();
OSD_OFF();
}
}
if(OSD_Type == 1){
NodeToggle=~NodeToggle;
/*if(PowerStatus == 0x80)
SelectItem();
else
VideoSelectItem();
Timer2 = (unsigned short)OSD_Timer * 100; ljj*/
}
else if((OSD_Type == 6)||(OSD_Type == 3)){
OSD_OFF();
}
KeyBuffer = 0xff;
break;
case SourceKey:
if((DeviceFlag & BIT_0) != 0){ // video version
if(++PowerStatus > 0x82){
PowerStatus = 0x80;
}
Write24C16(0xcc,PowerStatus);
SourceSelect();
}
KeyBuffer = 0xff;
break;
}
}
void LED_GrnOn(void)
{
unsigned char port;
port = PortD;
port |= RDPD_REG;
port |= BIT_1;
PortD= port;
}
void LED_GrnOff(void)
{
unsigned char port;
port = PortD;
port |= RDPD_REG;
port &= ~BIT_1;
PortD= port;
}
void LED_RedOn(void)
{
unsigned char port;
port = PortD;
port |= RDPD_REG;
port |= BIT_0;
PortD= port;
}
void LED_RedOff(void)
{
unsigned char port;
port = PortD;
port |= RDPD_REG;
port &= ~BIT_0;
PortD= port;
}
void BackLightOn(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port &= ~BIT_6;
PortC = port;
MuteTimer = 0;
printf("on\n");
}
void BackLightOff(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port |= BIT_6;
PortC = port;
printf("off\n");
}
#if PanelPowerActive == High
void PanelPowerOn(void)
{
unsigned char port;
/*
//+3V3
port = PortC;
port |= RDPC_REG;
port |= BIT_1;
PortC = port;
Sleep(5);
//+12V
port |= BIT_7;
PortC = port;*/
//+5v
port = PortC;
port |= RDPC_REG;
port |= BIT_7;
PortC= port;
Sleep(5);
}
void PanelPowerOff(void)
{
unsigned char port;
/*
//+12V
port = PortC;
port |= RDPC_REG;
port &= ~BIT_7;
PortC = port;
//+3V3
port &= ~BIT_1;
PortC = port;*/
//+5V
port = PortC;
port |= RDPC_REG;
port &= ~BIT_7;
PortC= port;
}
#else
void PanelPowerOff(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port |= BIT_7;
//port |= 0x82;
PortC= port;
}
void PanelPowerOn(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port &= ~BIT_7;
//port &= 0x7d;
PortC= port;
}
#endif
void ResetOff(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port |= BIT_5;
PortC = port;
}
void ResetOn(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port &= ~BIT_5;
PortC = port;
}
void AUDIO_MUTE(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port |= BIT_3;
PortC = port;
}
void AUDIO_On(void)
{
unsigned char port;
port = PortC;
port |= RDPC_REG;
port &= ~BIT_3;
PortC = port;
}
void AMP_STBY(void)
{/*
unsigned char port;
port = PortC;
port |= RDPC_REG;
port |= BIT_5;
PortC = port;*/
}
void AMP_On(void)
{/*
unsigned char port;
port = PortC;
port |= RDPC_REG;
port &= ~BIT_5;
PortC = port;*/
}
void DIG_SEL(void)
{
}
void DIG_Off(void)
{
}
void DVI_On(void)
{
}
void DIV_PWND(void)
{
}
void VideoEnable(void)
{/*
unsigned char port;
port = PortD;
port |= RDPD_REG;
port |= BIT_1;
PortD = port;*/
}
void VideoDisable(void)
{/*
unsigned char port;
port = PortD;
port |= RDPD_REG;
port &= ~BIT_1;
PortD = port;*/
}
void IntGroup1(void) interrupt 2 using 3
{
unsigned char i,DataBuf;
// P2 = 0xF0;
if((INT_SRC & INTIIC0_IRQ) != 0){
i = INTIIC0_FLG;
if(i & INTA){
DataBuf = IIC0_DATA;
INTIIC0_FLG = (INTA | INTRX);
if((DataBuf & 0xFE) == NOVATEK_Addr){
if(IIC0_CON & SRW){ // Slave Addr || 0x01 ==> Read
IIC0_DATA = CmdTxBuffer[0];
/*
IIC0_DATA = CmdTxBuffer[CmdTxPtr1++];
if(CmdTxPtr1 > 63)
CmdTxPtr1 = 0;
*/
}
else{ // Slave Addr ==> Write
// CmdPtr1 = 0;
// CmdPtr2 = 0;
}
}
flag3 |= BIT_6;
}
else if(i & INTTX){
if(CmdTxPtr1 != CmdTxPtr2){
i = CmdTxBuffer[CmdTxPtr1++];
checksum ^= i;
IIC0_DATA = i;
}
else{
IIC0_DATA = checksum;
}
INTIIC0_FLG = INTTX;
/*
IIC0_DATA = CmdTxBuffer[CmdTxPtr1++];
if(CmdTxPtr1 > 63)
CmdTxPtr1 = 0;
*/
}
else if(i & INTRX){
CmdRxBuffer[CmdRxPtr1++] = IIC0_DATA;
if(CmdRxPtr1 > 63)
CmdRxPtr1 = 2;
INTIIC0_FLG = INTRX;
}
else if(i & INTNAK){
INTIIC0_FLG = INTNAK;
}
else if(i & INTSTOP){
INTIIC0_FLG = INTSTOP;
flag3 |= BIT_7;
flag3 &= ~BIT_6;
}
}
}
/*
void CheckDDC2Bi(void)
{
unsigned char cmd;//,i,j;
if((flag3 & BIT_7) != 0){
CmdTxBuffer[0] = 0;
while(CmdRxPtr1 != CmdRxPtr2){
cmd = CmdRxBuffer[CmdRxPtr2++];
if(CmdRxPtr2 > 63)
CmdRxPtr2 = 0;
CheckCmd(cmd);
}
flag3 &= ~BIT_7;
}
}
*/
void CheckDDC2Bi(void)
{
unsigned char cmd;
if((flag3 & BIT_7) != 0){
checksum = 0;
while(CmdRxPtr1 != CmdRxPtr2){
cmd = CmdRxBuffer[CmdRxPtr2++];
checksum ^= cmd;
if(CmdRxPtr2 > 15)
CmdRxPtr2 = 2;
// printf("%x ",(unsigned short)cmd);
}
// printf("\r\n");
CmdTxPtr1 = 0;
CmdTxPtr2 = 0;
CmdRxPtr1 = 0;
CmdRxPtr2 = 0;
// Check2BiCmd();
flag3 &= ~BIT_7;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -