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

📄 wt_lcd.c

📁 ADV7171是目前功能最全面的视频编码芯片
💻 C
字号:
#include <Aduc812.H>
#include <absacc.h>
#include <string.h>

  #define V_SET T0 
  #define V_RET T1 
  #define I2C_ADV7170        0x54

  #define VREF      25

  #define BRIGHT_ADDR 0x80f0
  #define V_CDC_ADDR  0x80f1

unsigned char device;     //EEPROM 设备

unsigned int wr_addr;     //EEPROM 地址
unsigned int rd_addr;     //EEPROM 地址
unsigned int ee_addr;

//    #define DELAY_TIME 60 
    #define DELAY_TIME 120 
    #define TRUE 1
    #define FALSE 0

    #define SCL MCO
    #define SDA MDO
    #define SEN MDE
    #define SDI MDI

//register address
  #define   MODE0_REG          0x00
  #define   MODE1_REG          0x01
  #define   MODE2_REG          0x02
  #define   MODE3_REG          0x03
  #define   MODE4_REG          0x04

  #define   TIMEMODE0_REG      0x07
  #define   TIMEMODE1_REG      0x08

  #define   SUBFREQ0_REG       0x09
  #define   SUBFREQ1_REG       0x0a
  #define   SUBFREQ2_REG       0x0b
  #define   SUBFREQ3_REG       0x0c

  #define   SUBPHASE_REG       0x0d

bit En_Tx_end;
bit En_Rx_end;
bit En_explain;
bit En_rst;
bit En_test;
unsigned char Txbuffer[16];
unsigned char Rxbuffer[8];
unsigned char Txcount,Rxcount;
unsigned int Txtotal;

unsigned char bright;     //
unsigned char v_cdc;      //
unsigned char old_bright;     //
unsigned char old_v_cdc;      //

float  value;      //
unsigned int voltage;      //
unsigned int voltage0;      //
unsigned int voltage1;      //
/****************************************************
*以下为16进制数据 转换 ASCII码
*****************************************************/
char asc_h(unsigned char indata)
{
  char outdata,temp;
  temp=(indata>>4)&0x0f;
  if(temp>9)
    outdata=temp+55;
  else
    outdata=temp+48;
  return outdata;
}

char asc_l(unsigned char indata)
{
  char outdata,temp;
  temp=indata&0x0f;
  if(temp>9)
    outdata=temp+55;
  else
    outdata=temp+48;
  return outdata;
}

/*****************************************
*初始化串口  定时器1作串行时钟 定时器0
*****************************************/
void initSer()
{
// TMOD=0x91;      //T1 GATE:INT1  T0 16 bit cnt 
  TMOD=0x29;       //T0 GATE:INT0  T1 方式2 波特率发生器  
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  SCON=0x50;         /* function 1     */
  PCON=0x80;         //19.2k
}

/**********************************
*初始化定时器2   主工作时钟
**********************************/
void initT2()       
{
   T2CON=0;    
   TH2=0x4c;        //50ms timer 20为1秒
   TL2=0x00;
   RCAP2L=0x4c;
   RCAP2L=0x00;
   TR2=1;
   ET2=1;
}

/**********************************
定时器2中断服务程序
**********************************/
void timer2() interrupt 5 using 0
{                                 
  TF2=0;
  En_test=1;
/*
  if(En_test==1)
  {
    V_SET=0;
    En_test=0; 
  }
  else
  {
    V_SET=1;
    En_test=1; 
  }
  //V_SET=0;
//  V_SET=1;
/*
  t0_cnt++;
  if(t0_cnt>19)
  {
    timer0_1s++;         //1s timer 
    t0_cnt=0;
  }
*/
}

/************************************
*I2C延时
*************************************/
    void DELAY(unsigned int t)
    {
        while(t!=0)
            t--;
    }

/************************************
*I2C操作程序
*************************************/
    void I2C_Start(void)
    {
        SEN=1;
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=0;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
//        DELAY(DELAY_TIME);
    }

/*****************************************
	*I2C操作 
*****************************************/
    void I2C_Stop(void)
    {
        SEN=1;
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

/*****************************************
	*I2C操作  
*****************************************/
    void SEND_0(void)   /* SEND ACK */
    {
        SEN=1;
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

/*****************************************
	*I2C操作 
*****************************************/
    void SEND_1(void)
    {
        SEN=1;
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

    bit Check_Acknowledge(void)
    {
        SDA=1;
        SEN=0;

        SCL=1;
        DELAY(DELAY_TIME/2);
//        F0=SDA;
        F0=SDI;
//        DELAY(DELAY_TIME/2);
        SCL=0;
//        DELAY(DELAY_TIME);
        DELAY(DELAY_TIME);
        F0=SDI;
        if(F0==1)
            return FALSE;
        return TRUE;
    }

/*****************************************
	*I2C操作  
*****************************************/
    void WriteI2CByte(unsigned char b)
    {
        char i;
        SEN=1;
        for(i=0;i<8;i++)
            if((b<<i)&0x80)
                SEND_1();
            else
                SEND_0();
    }

     unsigned char ReadI2CByte(void)
    {
        unsigned char b=0,i;
        SEN=0;
        SCL=0;   

        for(i=0;i<8;i++)
        {
//            SDA=1;    /*释放总线*/
            SCL=1;    /*接受数据*/
            DELAY(10);
//            F0=SDA;
//            F0=SDI;
//            DELAY(10);
            DELAY(10);
            SCL=0;
            F0=SDI;
            if(F0==1)
                {
                    b=b<<1;
                    b=b|0x01;
                }
            else
                b=b<<1;
        }
        return b;
    }


void ADV_Write_One_Word(unsigned char device, unsigned char addr,unsigned char thedata)
{
          bit acktemp=1;
          /*write a byte to mem*/
          I2C_Start();
//          WriteI2CByte(0xa0);               
          WriteI2CByte(device);               
          acktemp=Check_Acknowledge();
//          WriteI2CByte(addr>>8);        
//          acktemp=Check_Acknowledge();

          WriteI2CByte(addr);          
          acktemp=Check_Acknowledge();

          WriteI2CByte(thedata);
          acktemp=Check_Acknowledge();
          I2C_Stop();
          DELAY(200);
}

/*****************************************
*ADV7171  在指定地址读取数据
*****************************************/
char ADV_Read_One_Word(unsigned char device, unsigned char addr)
{         bit acktemp=1;
          unsigned char mydata;
           /*read a byte from mem*/
          I2C_Start();
//          WriteI2CByte(0xa0);
          WriteI2CByte(device);
          acktemp=Check_Acknowledge();

//          WriteI2CByte(addr>>8);
//          acktemp=Check_Acknowledge();

          WriteI2CByte(addr);      // 24c512
          acktemp=Check_Acknowledge();
          I2C_Start();
//          WriteI2CByte(0xa1);
          WriteI2CByte(device+1);
          acktemp=Check_Acknowledge();

          mydata=ReadI2CByte();
          acktemp=Check_Acknowledge();

          I2C_Stop();
          return mydata;
}

/********************************
*基准电源
********************************/
void DACinit()
{
  DACCON=0x1f;    // DAC0 on, 12bit, asynchronous
  DAC0H=0;//0x0e;
  DAC0L=0;//0x13;     // DAC0 2.2V bright signal
  DAC1H=0;//0x04;
  DAC1L=0;//0x00;     // DAC1 to mid-scale
}

void setvoltage()
{
	   if(old_bright!=bright)
	   {
	     old_bright=bright;
		 value=bright*4095.0/250;
         voltage=(int)value;
         voltage0=voltage;
		 DAC0H=voltage>>8;
         DAC0L=voltage;     // DAC0 bright signal
	   }
	   if(old_v_cdc!=v_cdc)
	   {
	     old_v_cdc=v_cdc;
		 value=v_cdc*4095.0/250;
         voltage=(int)value;
         voltage1=voltage;
         DAC1H=voltage>>8;
         DAC1L=voltage;     // DAC0 v_cdc signal
	   }
}

void ADV_init()
{
  ADV_Write_One_Word(device,MODE0_REG,0x00);  
//  ADV_Write_One_Word(device,MODE1_REG,0x80);  //enable output color bar 0x80
  ADV_Write_One_Word(device,MODE1_REG,0x00);  //enable output color bar 0x80
  ADV_Write_One_Word(device,MODE2_REG,0x00);  //720 pixel
  ADV_Write_One_Word(device,MODE3_REG,0x00);  //MR37 defalut color  MR33=0 MR34=0 
  ADV_Write_One_Word(device,MODE4_REG,0x0d);    //RGB sync VSYNC  MR41 MR40=1  MR43 V_SYNC_3H
  ADV_Write_One_Word(device,TIMEMODE0_REG,0x0d);  //master 8 bit TR05=0 TR04=1 74ns delay
  ADV_Write_One_Word(device,TIMEMODE1_REG,0x33);  //Tpclk
  ADV_Write_One_Word(device,SUBFREQ0_REG,0x1f);  // 
  ADV_Write_One_Word(device,SUBFREQ1_REG,0x7c);  // 
  ADV_Write_One_Word(device,SUBFREQ2_REG,0xf0);  // 
  ADV_Write_One_Word(device,SUBFREQ3_REG,0x21);  // 

  ADV_Write_One_Word(device,SUBPHASE_REG,0x00);  //Tpclk
}

/****************************************************
*以下串行中断服务程序
*****************************************************/
void inrs() interrupt 4 using 3
{
  if(RI)
  {
    RI=0;
    Rxbuffer[Rxcount]=SBUF;
	Rxcount++;
    En_explain=1;    
    if(Rxcount>6) Rxcount=0; //接收数据最大为6个  
  }

  if(TI)
  {
    TI=0;
    Txcount++;
    if(Txcount>=Txtotal) 
	{
      Txcount=0;
      En_Tx_end=1;
	}
    else
      SBUF=Txbuffer[Txcount];
  }
}
/****************************************************
*以下为主函数
*****************************************************/
void main (void)  
{
//  int i;
  unsigned char v_data;
  DELAY(50000);
  V_RET=0;
  DELAY(100);
  V_RET=1;
  En_rst=1;

  I2CCON=0xa8;  //I2C控制器

  device=I2C_ADV7170;  //EEPROM 
  ADV_init();

  initSer();
  initT2();	
  DACinit();

  En_test=0;
  Txcount=0;
  Rxcount=0;
  En_explain=0;

  bright=0;
  v_cdc=0;
  old_bright=0;
  old_v_cdc=0;
  ES=1;
  EA=1;

  while (1) 
  {                         /* Loop forever */
//    V_SET=0;
//    V_SET=1;
    if(En_test==1)
    {
       En_test=0;
       bright=XBYTE[BRIGHT_ADDR];
       v_cdc=XBYTE[V_CDC_ADDR];
       setvoltage();
    }
//V_SET=0;
//  V_SET=1;
    if(En_explain)
    {
      if(Rxbuffer[0]=='a') 
      {
         Rxcount=0;
         En_explain=0;   
         v_data=ADV_Read_One_Word(device, MODE0_REG);
         Txbuffer[0]=asc_h(v_data);
         Txbuffer[1]=asc_l(v_data);

         v_data=ADV_Read_One_Word(device, MODE1_REG);
         Txbuffer[2]=asc_h(v_data);
         Txbuffer[3]=asc_l(v_data);

         v_data=ADV_Read_One_Word(device, MODE2_REG);
         Txbuffer[4]=asc_h(v_data);
         Txbuffer[5]=asc_l(v_data);

         v_data=ADV_Read_One_Word(device, MODE3_REG);
         Txbuffer[6]=asc_h(v_data);
         Txbuffer[7]=asc_l(v_data);

         v_data=ADV_Read_One_Word(device, MODE4_REG);
         Txbuffer[8]=asc_h(v_data);
         Txbuffer[9]=asc_l(v_data);

         v_data=ADV_Read_One_Word(device, TIMEMODE0_REG);  //master
         Txbuffer[10]=asc_h(v_data);
         Txbuffer[11]=asc_l(v_data);

         v_data=ADV_Read_One_Word(device, TIMEMODE1_REG);  //Tpclk
         Txbuffer[12]=asc_h(v_data);
         Txbuffer[13]=asc_l(v_data);

         Txtotal=14;
         SBUF=Txbuffer[0];
      }
      else if(Rxbuffer[0]=='b') 
      {
         Rxcount=0;
         En_explain=0;   
         v_data=ADV_Read_One_Word(device, SUBFREQ0_REG);
         Txbuffer[0]=asc_h(v_data);
         Txbuffer[1]=asc_l(v_data);
         v_data=ADV_Read_One_Word(device, SUBFREQ1_REG);
         Txbuffer[2]=asc_h(v_data);
         Txbuffer[3]=asc_l(v_data);
         v_data=ADV_Read_One_Word(device, SUBFREQ2_REG);
         Txbuffer[4]=asc_h(v_data);
         Txbuffer[5]=asc_l(v_data);
         v_data=ADV_Read_One_Word(device, SUBFREQ3_REG);
         Txbuffer[6]=asc_h(v_data);
         Txbuffer[7]=asc_l(v_data);
         v_data=ADV_Read_One_Word(device,SUBPHASE_REG);
         Txbuffer[8]=asc_h(v_data);
         Txbuffer[9]=asc_l(v_data);

         Txtotal=10;
         SBUF=Txbuffer[0];
      }
      else if(Rxbuffer[0]=='r') 
      {
         Rxcount=0;
         En_explain=0;   
/*
         if(En_rst==1)
         { 
           V_RET=0;
           En_rst=0;
           Txbuffer[1]='0';
         }
         else
         { 
           V_RET=1;
           En_rst=1;
           Txbuffer[1]='1';
         } 
*/
         Txbuffer[0]=Rxbuffer[0];
         Txtotal=2;
         SBUF=Txbuffer[0];
      }
      else if(Rxbuffer[0]=='m') 
      {
         Rxcount=0;
         En_explain=0;   
//         XBYTE[BRIGHT_ADDR]=0x55;     
//         XBYTE[V_CDC_ADDR]=0xaa;     
         bright=XBYTE[BRIGHT_ADDR];
         v_cdc=XBYTE[V_CDC_ADDR];
//         setvoltage();

         Txbuffer[0]=asc_h(bright);
         Txbuffer[1]=asc_l(bright);
         Txbuffer[2]=asc_h(v_cdc);
         Txbuffer[3]=asc_l(v_cdc);
         Txtotal=4;
         SBUF=Txbuffer[0];
      }
      else if(Rxbuffer[0]=='s') 
      {
         Rxcount=0;
         En_explain=0;   
         ADV_init();
         Txbuffer[0]=Rxbuffer[0];
         Txtotal=1;
         SBUF=Txbuffer[0];
      }
      else if(Rxbuffer[0]=='v') 
      {
         Rxcount=0;
         En_explain=0;   
         bright=XBYTE[BRIGHT_ADDR];
         v_cdc=XBYTE[V_CDC_ADDR];
		 value=bright*4095.0/250;
		 voltage0=(int)value;
		 value=v_cdc*4095.0/250;
		 voltage1=(int)value;
         Txbuffer[0]=asc_h(bright);
         Txbuffer[1]=asc_l(bright);
         Txbuffer[2]=asc_h(v_cdc);
         Txbuffer[3]=asc_l(v_cdc);
         Txbuffer[4]=asc_h((voltage0>>8));
         Txbuffer[5]=asc_l((voltage0>>8));
         Txbuffer[6]=asc_h(voltage0);
         Txbuffer[7]=asc_l(voltage0);
         Txbuffer[8]=asc_h((voltage1>>8));
         Txbuffer[9]=asc_l((voltage1>>8));
         Txbuffer[10]=asc_h(voltage1);
         Txbuffer[11]=asc_l(voltage1);
         Txtotal=12;
         SBUF=Txbuffer[0];
      }
    }
  }
}

⌨️ 快捷键说明

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