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

📄 ksr810.c

📁 PIC单片机上用C语言写的TW88TFT屏控制程序,有注释
💻 C
📖 第 1 页 / 共 5 页
字号:
/*        InitWindow4                             */
/*function : initialize window4 registers         */
/*input : none                                    */
/*output : none                                   */ 
/**************************************************/
void InitWindow4(void)
{
 unsigned char window_val[NB_WINOPTION];
   
  //use Multi-write function
   InitTable(window_val, NB_WINOPTION); 
    window_val[0]  = WIN4;
    window_val[1]  = HSTART4;
    window_val[2]  = VSTART4;
    window_val[3]  = WINW4;
    window_val[4]  = WINH4;
    window_val[5]  = BOR4;
    window_val[6]  = BORH4;
    window_val[7]  = BORV4;
    window_val[8]  = HSPACE4;
    window_val[9]  = VSPACE4;
    window_val[10] = ADDSTART4;
    MWriteI2C(TW88, WINDOW4, window_val, NB_WINOPTION);
   
/*
    WriteI2C(TW88, WINDOW4, WIN4);
    WriteI2C(TW88, W4_HSTART, HSTART4);
    WriteI2C(TW88, W4_VSTART, VSTART4);
    WriteI2C(TW88, W4_WIDTH, WINW4);
    WriteI2C(TW88, W4_HEIGHT, WINH4);
    WriteI2C(TW88, BORDER4, BOR4);
    WriteI2C(TW88, B4_H , BORH4);
    WriteI2C(TW88, B4_V, BORV4);
    WriteI2C(TW88, W4_HSPACE, HSPACE4);
    WriteI2C(TW88, W4_VSPACE, VSPACE4);
    WriteI2C(TW88, W4_ADDSTART, ADDSTART4);
*/ 
}

/**************************************************/
/*        DisplayW4                               */
/*function : Display window4                      */
/*input :  const char *text                       */
/*output : none                                   */ 
/**************************************************/
void DisplayW4(const char *text)
{
    char direction[]=" PICTURE DIRECTION ";
    cnt = 0;
    addstart = ADDSTART4;
    win_size = SIZE4;
    font_op = FONT4;

    INTE=0;           
    
    //write text to display on window4
    putst(direction);
    putst(text);
    INTE=1;
    WriteI2C(TW88, W4_WIDTH, cnt); //set Window1 width 
    WriteI2C(TW88, WINDOW4, WIN4 | 0x01); //enable window4      
}




/**************************************************/
/*        putst                                    */
/*function : put a text in the OSD RAM            */
/*input :  const char *tx                         */
/*output : none                                   */ 
/**************************************************/
void putst(const char *tx)
{
      WriteI2C(TW88, FONT_SELECT, ROM | 0x01); //Select font from rom
                                           //Enable OSD RAM access                                             
       while( (*tx)!=0 )
       {
            putch(addstart+cnt, (*tx));                   
            cnt++;
            tx++;
        }
        WriteI2C(TW88, FONT_SELECT, ROM); //disable OSD RAM access 
}

/**************************************************/
/*        putch                                    */
/*function : put a character in the OSD RAM       */
/*input :  unsigned char add, unsigned char font  */
/*output : none                                   */ 
/**************************************************/
void putch(unsigned char add, unsigned char font)
{
    WriteI2C(TW88, FONT_RAM, add); //font address in the ram 
    //code of the character to display (TW8801 datasheet p15)
    WriteI2C(TW88, FONT_OUT, font); 
    //Attribute of characters (TW8801 datasheet p19)
    WriteI2C(TW88, FONT_OPTION, font_op); //character bleu  
}

/**************************************************/
/*        comp2                                   */
/*function : convert input into complement2 value */
/*input : unsigned char data                      */
/*output : unsigned char                          */ 
/**************************************************/
unsigned char comp2(unsigned char data)
{
    data^=0xff; // complement1 : invert bit
    data++; // comp1(data)+1=comp2(data)
    return(data); 
}

/**************************************************/
/*        Conv10                                  */
/*function : Convert the binary integer (8bits)   */
/*           into a number in base 10             */
/*           and place result in ASCII value      */
/*           in the table "number10"              */
/*           if "sign" = 1 => value is comp2      */
/*input :  unsigned char value,                   */
/*         unsigned char number10*                */
/*output : void                                   */ 
/**************************************************/
void Conv10(unsigned char value, unsigned char *number10)
{
    unsigned char i = 0;
    unsigned char chiffre = 0;
    
    InitTable(number10, NUM10_MAX ); 
   
    while(value>=10)
    {
        value-=10;
        chiffre++;
    }
    number10[i] = chiffre + '0';
    i++;
    number10[i] = value + '0';
}

/**************************************************/
/*       ConvVal                                  */
/*function : convert mode chosen value            */
/*           between 0-63                         */
/*input :  void                                   */  
/*output : unsigned char                          */ 
/**************************************************/
unsigned char ConvVal(void)
{
    unsigned char value = 0; //value to display

     switch(choix)
    {
        case 1 : value = bght;
                 if((value>128)&&(value<=208))
                 {
                     value^=0x80; //value<0 value=128-|value| 
                                  //value>=0 value+=128 

                     value/=2; 
                     value-=8;
                 }
                 else
                 {
                     value^=0x80;
                     value/=5;
                     value+=16;
                 }              

                 break; 
      
        case 2 : value = ctst;
                 if(value<=108)
                 {
                         value^=0x00;
                         value/=3;
                         value-=4;
                 } 
                 else
                 {
                         value^=0x00;
                         value/=4;
                         value+=5;
                 }
                 break;
         
        case 3 : value = color;
                  if(value<=160)
                 {
                         //value^=0x00;
                         value/=5;
                         value-=0;
                 } 
                 else
                 {
                         //value^=0x00;
                         value/=3;
                         value-=21;
                 }
                 break;
                  
                      
        default : break;
    }
    
        
    return(value);
}

/**************************************************/
/*        SetValBar                               */
/*function : set the table of value bar to display*/
/*                                                */
/*input : unsigned char *bar, unsigned char val   */  
/*output : void                                   */ 
/**************************************************/
void SetValBar(unsigned char *bar, unsigned char val)
{
    unsigned char i;
    
    if(val<3)
    { 
        for(i=0;i<BAR_MAX-1;i++)
            bar[i] = 0x01;  // '..'
    }      

    else if(val>59)
    {
             for(i=0;i<BAR_MAX-1;i++)
                 bar[i] = 0x04;  // '||'
    }
    else
    {
          if((val%2)==1)  //if odd
          {       
              val>>=1; //val/=2;
              val-=1;
              bar[val] = 0x02; // '|.'
          }        
          else
          {
              val>>=1; //val/=2;
              val-=1;
              bar[val] = 0x01; // '..' 
          }  
          
          for(i=0;i<val;i++)
              bar[i] = 0x04;  // '||'
          for(i=val+1;i<BAR_MAX-1;i++)
              bar[i] = 0x01;  // '..'
    }
    bar[BAR_MAX-1]=0; //stop
}

////////////////////////////////////////////////////
//            LCD Panel functions                 //
////////////////////////////////////////////////////

/**************************************************/
/*         PanelClock                             */
/*function : initialize Panel clock               */
/*input : none                                    */
/*output : none                                   */ 
/**************************************************/
/*void PanelClock(void)
{
    unsigned int fbdiv; //feed back divider value
    unsigned char factor=2;

    WriteI2C(TW88, PLLCON, PLLCON_VAL);
    WriteI2C(TW88, PLLS, PLLS_VAL);
    WriteI2C(TW88, REFDM, REFDM_VAL);

    // (REFDM+1)*2^PLLS => (REFDM+1)*(2<<(PLLS-1))
    if(!PLLS_VAL)
        factor=1;
    else 
        factor<<=(PLLS_VAL-1);
    
    fbdiv = (REFDM_VAL+1)*factor; 
    
    fbdiv = fbdiv*P_CLK/TWCLK; 
    fbdiv--;
    //set feed back divider registers
    WriteI2C(TW88, FBDN_LO,(fbdiv&0x00ff));
    fbdiv>>=8;
    fbdiv&=0x0F; //fbdn_hi : 4bits 
    WriteI2C(TW88, FBDN_HI,(0x20|fbdiv));
}  
*/

/**************************************************/
/*        BOOT_SHARP                              */
/*function : initialize TW88 register for         */
/*          SHARP VGA panel (default : NTSC )     */    
/*input : none                                    */
/*output : none                                   */ 
/**************************************************/
void BOOT_SHARP(void)
{
    unsigned char multi[DATA_MAX]; //multi write table 
    
    //InitTable(multi, DATA_MAX);
    
    //SDT
    WriteI2C(TW88, 0x1c, 0x0F); //auto, disable shadow
    
    //GAMMA
    WriteI2C(TW88, 0x04, 0x00); //disable luminance gamma
 
    //dynamic allocation
    //unsigned char *multi;
    //multi = malloc(sizeof(unsigned char));  
    //multi = {0x12, 0x15, 0x20, 0xb1, 0xd0, 0xcc, 0x85};
    // MWriteTW88(0x07, multi, 7);
    //free(multi);
    
    //address 0x07-0x0d 
    //CROP_HI, VDELAY_LO, VACTIVE_LO, HDELAY_LO, HACTIVE_LO 
    //CNTRL1, 0x0D
    multi[0] = 0x12; //CROP_HI
    multi[1] = 0x15; //VDELAY_LO
    multi[2] = 0x20; //VACTIVE_LO
    multi[3] = 0xb1; //HDELAY_LO
    multi[4] = 0xd0; //HACTIVE_LO
    multi[5] = 0xcc; //CNTRL1
    multi[6] = 0x85; //0x0D
    MWriteI2C(TW88, 0x07, multi, 7);

    //address 0x20-0x31
    //CLMPG, IAGC, PEAKWT, CLMPL, SYNCT, MISSCNT, 
    //V_CNTRL1, V_CNTRL2, C_KILLER, COMB_FILTER, 
    //LUMA_DELAY&HSYNC, MISC1, MISC2, MISC3, CLMPC2
    multi[0] = 0x60; //CLMPG
    multi[1] = 0x82; //IAGC
    MWriteI2C(TW88, 0x20, multi, 2);

    multi[0] = 0xd0; //PEAKWT
    multi[1] = 0x3c; //CLMPL
    multi[2] = 0x38; //SYNCT
    multi[3] = 0x4a; //MISSCNT
    MWriteI2C(TW88, 0x23, multi, 4);

    multi[0] = 0x00; //V_CNTRL1
    multi[1] = 0x00; //V_CNTRL2
    multi[2] = 0xb0; //C_KILLER
    multi[3] = 0x16; //COMB_FILTER 
    multi[4] = 0x38; //LUMA_DELAY&HSYNC 
    multi[5] = 0x00; //MISC1
    multi[6] = 0x91; //MISC2
    multi[7] = 0xe6; //MISC3
    MWriteI2C(TW88, 0x28, multi, 8);

    WriteI2C(TW88, 0x31,0x14); //CLMPC2

    //0x40-0x44
    //input/output
    multi[0] = 0x00; //input
    multi[1] = 0x40; //output
    MWriteI2C(TW88, 0x40, multi, 2);
    //WriteI2C(TW88, 0x44, 0x18); //input control
    
    //0x5d-0x62
    //zoom
    multi[0] = 0x00; //H-scale up lo 
    multi[1] = 0x76; //V-scale up lo
    multi[2] = 0x00; //H-scale dn lo
    multi[3] = 0x05; //H/V scale up/dn hi
    multi[4] = 0x00; //H-scale up offset
    multi[5] = 0x73; //V-scale up offset
    MWriteI2C(TW88, 0x5d, multi, 6);
    
    //0x64-0x6c
    //color adjust
    /*multi[0] = 0x80; //R contrast
    multi[1] = 0x80; //G contrast
    multi[2] = 0x80; //B contrast
    multi[3] = 0x80; //R brightness
    multi[4] = 0x80; //G brightness
    multi[5] = 0x80; //B brightness
    multi[6] = 0x00; //Sharpness
    multi[7] = 0x00; //zigzag
    multi[8] = 0x00; //zigzag, edge
    MWriteI2C(TW88, 0x64, multi, 9); */   

    //0xa2-0xaf
    //display control

    multi[0] = 0x00; 
    multi[1] = 0x11; //output VSYNC delay from input VSYNC
    multi[2] = 0x0d; //FPVS period lo
    multi[3] = 0x02; //FPVS active pulse width
    multi[4] = 0x21; //FPV back porch width
    multi[5] = 0xe0; //FPV active length lo
    multi[6] = 0x12; //FPV active length hi/FPVS period hi
    multi[7] = 0xcb; //FPHS period lo
    multi[8] = 0x10; //FPHS active pulse width
    multi[9] = 0x30; //FPH back porch width
    multi[10] = 0x80; //FPDE horizontal Active length lo
    multi[11] = 0x22; //FPDE horizontal Active length hi/FPHS period hi
    MWriteI2C(TW88, 0xa2, multi, 12);    
    WriteI2C(TW88, 0xaf, 0x21); //Dithering

    //0xb8-0xbe
    //Misc-input
    multi[0] = 0x14; //input routing
    multi[1] = 0x84; //buffer hold
    MWriteI2C(TW88, 0xb8, multi, 2);

//WriteI2C(I2C(TW88, 0xba, 0x02); 
 /*multi[0] = 0x00; 
    multi[1] = 0x00; 
    multi[2] = 0x00; 
    MWriteI2C(TW88, 0xbc, multi, 3);*/

    //0xf6-0xf7        
    //output interface
    multi[0] = 0x9e; //clock delay, en coast
    multi[1] = 0x01; //!Reverse the bit order on panel data bus
    MWriteI2C(TW88, 0xf6, multi, 2);

    //0xfa-0xfe
    //pll
    multi[0] = 0x32; //pll control 
    multi[1] = 0x03; //pll control 2
    multi[2] = 0x90; //pll control 3
    multi[3] = 0x01; //pll control 4
    multi[4] = 0x36; //pll control 5
    //0xff
    multi[5] = 0xff;
    MWriteI2C(TW88, 0xfa, multi, 6);
}

/**************************************************/
/*        NTSC_VGA_SHARP                          */
/*function : initialize TW88 register for         */
/*          NTSC input and SHARP VGA panel        */    
/*input : none                                    */
/*output : none                                   */ 
/**************************************************/
void NTSC_VGA_SHARP(void)
{
    //address 0x07-0x0d 
    //CROP_HI, VD

⌨️ 快捷键说明

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