极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19246|回复: 4

C51代码映射到arduino的问题

[复制链接]
发表于 2012-11-18 00:34:05 | 显示全部楼层 |阅读模式
买了一个1.8的TFT模块,貌似商家只有C51的代码,技术支持也没有接触过arduino,只好自己动手改代码了。好在程序写的相当不错,可读性很好。可惜改写完后不能work,摸索了半天也没有进展,只好在这儿请高手指教,谢了!

下面是一个基础函数的代码,看看有没有什么问题。

// C51的代码, 管脚定义
//        RESET=  P1^0;
//        A0   =  P1^1;
//         SDI  =  P1^2;
//         SCK  =  P1^3;         
//         CS   =  P1^4;

void write_cmd(unsigned char addr1)
{
        unsigned char bit8;

        A0=0;
        CS=0;
        for(bit8=0;bit8<8;bit8++)
        {
                SCK=0;
                if((addr1&0x80)==0x80)
                        SDI=1;
                else               
                        SDI=0;               
                SCK=1;
                addr1=(addr1<<1);  
        }
     CS=1;
}

// ------------------- 华丽的分割线 --------------------//
  
// 改成arduino的版本
unsigned int PIN_RESET=  8;
unsigned int PIN_A0   =  9;
unsigned int PIN_SDI  =  10;
unsigned int PIN_SCK  =  11;         
unsigned int PIN_CS   =  12;

// 当然在setup()里面要设置
        pinMode(PIN_RESET, OUTPUT);
        。。。。。

void write_cmd(unsigned char addr1)
{
        unsigned char bit8;

        digitalWrite(PIN_A0, LOW);        //PIN_A0=0;
        digitalWrite(PIN_CS, LOW);        //PIN_CS=0;
        for(bit8=0;bit8<8;bit8++)
        {
                digitalWrite(PIN_SCK, LOW);        //PIN_SCK=0;
                if((addr1&0x80)==0x80)
                        digitalWrite(PIN_SDI, HIGH);        //PIN_SDI=1;
                else               
                        digitalWrite(PIN_SDI, LOW);                //PIN_SDI=0;               
                       
                digitalWrite(PIN_SCK, HIGH);        //PIN_SCK=1;
                addr1=(addr1<<1);  
        }
       
        digitalWrite(PIN_CS, HIGH);        //PIN_CS=1;
}


回复

使用道具 举报

 楼主| 发表于 2012-11-18 00:42:27 | 显示全部楼层
另外注意到一个delay()函数,【Crystal 】11.0592M/22.1184Mhz下为
void delay(unsigned int t)
{
    unsigned int i,j;

    for(j=0;j<t;j++)
               for(i=0;i<250;i++);
}

这个函数直接用arduino的delay()函数替代,有没有问题呢?我的arduino板子是UNO。
回复 支持 反对

使用道具 举报

发表于 2012-11-18 18:03:51 | 显示全部楼层
水乐天写了一个51移植到Arduino的帖子,你参考下,看看有没有启发~
http://www.geek-workshop.com/thread-1876-1-1.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-19 00:38:06 | 显示全部楼层
弘毅 发表于 2012-11-18 18:03
水乐天写了一个51移植到Arduino的帖子,你参考下,看看有没有启发~
http://www.geek-workshop.com/thread- ...

多谢指点。
又经过一天的调试,发现代码移植应该是对的,可惜由于某种未知原因,TFT仍然无法正常工作。这款TFT1.8只用5根线再加2根电源就可以驱动的,分辨率128x160,30圆左右,觉得蛮适合用arduino来玩的。我这儿贴一下淘宝链接:http://item.taobao.com/item.htm?id=17157919220,希望有同好能调通并分享,造福大家。

我的代码贴在下面,希望有帮助:
/********************************************************
3.3V接线说明:
1.下载本程序到单片机
2.插线(注意单片机的这几个管脚不要有外围电路):
   GND        地
        VCC 3.3V(裸屏必须用3.3V供电)
        PIN_RESET=  8;
        PIN_A0   =  9;
        PIN_SDI  =  10;
        PIN_SCK  =  11;         
        PIN_CS   =  12;
(5V的单片机需要在信号线上串接1K电阻,电源必须保证3.3V)
********************************************************/

/*********************头文件及定义*************************/


/*******************接口定义*******************************/
unsigned int PIN_RESET=  2;
unsigned int PIN_A0   =  3;
unsigned int PIN_SDI  =  4;
unsigned int PIN_SCK  =  5;         
unsigned int PIN_CS   =  6;

unsigned int PIN_LED  =  13;

/*****************数组声名**********************************/
/*
unsigned char map[];
unsigned char num[];
unsigned char palette[];
unsigned char Red[];
unsigned char Green[];
unsigned char Blue[];
unsigned char White[];
unsigned char pflower[];
unsigned char phill[];
*/

/*****************函数声名***********************************/
//void  delay(unsigned int t);
//void  keypress(void);
void  write_cmd(unsigned char cmd);
void  write_reg(unsigned char para1);
void  write_dat(unsigned char data_h,unsigned char data_l);
void  TFT_INIT(void);
void  display_rgbw(unsigned char data_h,unsigned char data_l);
//void  display_pic();   

unsigned char palette[]=
{
        0xf8,0x00,//red
        0x07,0xe0,//green
        0x00,0x1f,//blue
        0xf8,0x1f,//purple
        0xff,0xe0,//yellow
        0x07,0xff,//cyan
        0xff,0xff,//white
        0xfc,0x08,//orange
};

/*****************主函数*************************************/        
void setup()
{      
     // 设置数字口模式
     pinMode(PIN_LED, OUTPUT);
     
     pinMode(PIN_RESET, OUTPUT);
     pinMode(PIN_A0, OUTPUT);
     pinMode(PIN_SDI, OUTPUT);
     pinMode(PIN_SCK, OUTPUT);
     pinMode(PIN_CS, OUTPUT);
                               
     // PIN_RESET
     digitalWrite(PIN_RESET, LOW);   //PIN_RESET=0;                     
     delay(50);
     
     digitalWrite(PIN_RESET, HIGH);        //PIN_RESET=1;                        
     delay(100);
     
     // 初始化
     TFT_INIT();
     delay(100);

     //*
     digitalWrite(PIN_LED, HIGH);    // light the led
     display_rgbw(0x07,0xe0);                //绿色
     delay(2000);
     
     while(true);
     //*/
}

void loop()
{
   display_rgbw(0xf8,0x00);                //全屏红色
   delay(1000);
   
   if (true)
     return;
               
   display_rgbw(0x07,0xe0);                //绿色
   delay(2000);
                       
   display_rgbw(0x00,0x1f);    //蓝色
   delay(2000);
                       
   display_rgbw(0xff,0xff);    //紫色
   delay(2000);

   display_rgbw(0x07,0xff);    //cyan
   delay(2000);                 
       
   display_rgbw(0xff,0xff);    //白色
   delay(2000);
                       
   display_rgbw(0xfc,0x08);    //桔黄色
   delay(2000);
                                                        
   //display_col_colorbar();                        
   //display_eprom(1);  
   //display_eprom(2);           
   //display_eprom(3);                     
   //display_pic();                            //显示图片
   //delay(5000);                        
}

/*
void delay(unsigned int t)
{
    unsigned int i,j;

    for(j=0;j<t;j++)
               for(i=0;i<250;i++);
}
*/

/******************DRIVE IC寄存器寻址 8080 SERIES*******************************/
void write_cmd(unsigned char cmd)
{
   unsigned char bit8;
   
   digitalWrite(PIN_A0, LOW);        //PIN_A0=0;  //发送命令
   digitalWrite(PIN_CS, LOW);        //PIN_CS=0;
   for(bit8=0;bit8<8;bit8++)
   {
     digitalWrite(PIN_SCK, LOW);        //PIN_SCK=0;
     if((cmd&0x80)==0x80)
       digitalWrite(PIN_SDI, HIGH);        //PIN_SDI=1;
     else               
       digitalWrite(PIN_SDI, LOW);                //PIN_SDI=0;               
                       
     digitalWrite(PIN_SCK, HIGH);        //PIN_SCK=1;
     cmd=(cmd<<1);  
   }
          
   digitalWrite(PIN_CS, HIGH);        //PIN_CS=1;
}

/*****************DRIVE IC寄存器写数据 8080 SERIES******************************/
void write_reg(unsigned char para1)
{  
   unsigned char bit8;

   digitalWrite(PIN_A0, HIGH);        //PIN_A0=1;
   digitalWrite(PIN_CS, LOW);        //PIN_CS=0;
   for(bit8=0;bit8<8;bit8++)
   {
     digitalWrite(PIN_SCK, LOW);        //PIN_SCK=0;
     if((para1&0x80)==0x80)
       digitalWrite(PIN_SDI, HIGH);        //PIN_SDI=1;
     else
       digitalWrite(PIN_SDI, LOW);        //PIN_SDI=0;
                       
     digitalWrite(PIN_SCK, HIGH);        //PIN_SCK=1;
     para1=(para1<<1);               
   }
       
   digitalWrite(PIN_CS, HIGH);        //PIN_CS=1;         
}
  
/****************DRIVE IC GDRAM 写数据 16BITS 8080 SERIES*****************************/
void write_dat(unsigned char data_h, unsigned char data_l)
{  
   unsigned char bit8;

   digitalWrite(PIN_A0, HIGH);        //PIN_A0=1;
   digitalWrite(PIN_CS, LOW);        //PIN_CS=0;
   for(bit8=0;bit8<8;bit8++)        //High byte
   {
     digitalWrite(PIN_SCK, LOW);        //PIN_SCK=0;
     if((data_h&0x80)==0x80)
       digitalWrite(PIN_SDI, HIGH);        //PIN_SDI=1;
     else
       digitalWrite(PIN_SDI, LOW);        //PIN_SDI=0;
                       
     digitalWrite(PIN_SCK, HIGH);        //PIN_SCK=1;
     data_h=(data_h<<1);       
   }
       
   digitalWrite(PIN_CS, HIGH);        //PIN_CS=1;
   digitalWrite(PIN_CS, LOW);        //PIN_CS=0;
   for(bit8=0;bit8<8;bit8++)        //Low byte
   {
     digitalWrite(PIN_SCK, LOW);        //PIN_SCK=0;
     if((data_l&0x80)==0x80)
       digitalWrite(PIN_SDI, HIGH);        //PIN_SDI=1;
     else
       digitalWrite(PIN_SDI, LOW);        //PIN_SDI=0;
                       
     digitalWrite(PIN_SCK, HIGH);        //PIN_SCK=1;
     data_l=(data_l<<1);         
   }

   digitalWrite(PIN_CS, HIGH);        //PIN_CS=1;
}

/*****************DRIVE IC INITIALIZATION*******************/          
void TFT_INIT()
{        
     write_cmd(0x11);       //关闭睡眠,振荡器工作(start OSC)
     delay(120);
         
     write_cmd(0x3a);       //Interface Pixel Format
     write_reg(0x55);
     
     //*
     write_cmd(0x26);       //Gamma Set
     write_reg(0x04);
       
     write_cmd(0xf2);       //GAM_R_SEL
     write_reg(0x01);          
     
     write_cmd(0xe0);       //Positive Gamma Correction Setting
     write_reg(0x3f);
     write_reg(0x25);
     write_reg(0x1c);
     write_reg(0x1e);
     write_reg(0x20);
     write_reg(0x12);
     write_reg(0x2a);
     write_reg(0x90);
     write_reg(0x24);
     write_reg(0x11);
     write_reg(0x00);
     write_reg(0x00);
     write_reg(0x00);
     write_reg(0x00);
     write_reg(0x00);
      
     write_cmd(0xe1);              //Negative Gamma Correction Setting
     write_reg(0x20);
     write_reg(0x20);
     write_reg(0x20);
     write_reg(0x20);
     write_reg(0x05);
     write_reg(0x00);
     write_reg(0x15);
     write_reg(0xa7);
     write_reg(0x3d);
     write_reg(0x18);
     write_reg(0x25);
     write_reg(0x2a);
     write_reg(0x2b);
     write_reg(0x2b);  
     write_reg(0x3a);
     //*/
     
     write_cmd(0xb1);              //Frame Rate Control(In normal mode/Full colors)
     write_reg(0x08);
     write_reg(0x08);
     
     write_cmd(0xb4);              //Display Inversion Control
     write_reg(0x07);          
   
     write_cmd(0xc0);              //Power_Control1
     write_reg(0x0a);
     write_reg(0x02);
      
     write_cmd(0xc1);              //Power_Control2
     write_reg(0x02);

     write_cmd(0xc5);              //VCOM_Control 1
     write_reg(0x4f);
     write_reg(0x5a);

     write_cmd(0xc7);              //VCOM Offset Control
     write_reg(0x40);
     
     write_cmd(0x2a);              //配置MCU可操作的LCD内部RAM横坐标起始、结束参数
     write_reg(0x00);              //横坐标起始地址0x0000
     write_reg(0x00);
     write_reg(0x00);              //横坐标结束地址0x007f(127)
     write_reg(0x7f);
   
     write_cmd(0x2b);              //配置MCU可操作的LCD内部RAM纵坐标起始、结束参数
     write_reg(0x00);              //纵坐标起始地址0x0000
     write_reg(0x00);
     write_reg(0x00);              //纵坐标结束地址0x009f(159)
     write_reg(0x9f);
     
     write_cmd(0x36);              //配置MPU和DDRAM对应关系, Memory Access Control
     write_reg(0xc0);              //MX=1,MY=1
     
     write_cmd(0xb7);              //Source Driver Direction Control
     write_reg(0x00);
//  write_cmd(0xb8);              //Gate Driver Direction Control
//  write_reg(0x01);
          
     write_cmd(0x29);              //开启屏幕显示, Display On
     write_cmd(0x2c);              //设置为LCD接收数据/命令模式, Memory Write
}

/*****************显示单色画面*****************************************************/
void display_rgbw(unsigned char data_h,unsigned char data_l)
{
   unsigned int i,j;

   write_cmd(0x2a);              //Horizontal Address Start Position
   write_reg(0x00);
   write_reg(0x00);
   write_reg(0x00);
   write_reg(0x7f);
   
   write_cmd(0x2b);              //Vertival Address end Position
   write_reg(0x00);
   write_reg(0x00);
   write_reg(0x00);
   write_reg(0x9f);
   
   write_cmd(0x2c);              //Memory Write
   for(i=0;i<160;i++)
   {
     for(j=0;j<128;j++)
     {
        write_dat(data_h,data_l);                          
     }
   }       
}       

/****************显示图片(从单片机的DATA区)********************************/       
/*
void display_pic()
{
        unsigned int i,j,k=0;

        write_cmd(0x2a);              //Horizontal Address Start Position
        write_reg(0x00);
        write_reg(0x00);
        write_reg(0x00);
        write_reg(0x7f);                          //0--127水平地址结束
        write_cmd(0x2b);              //Vertival Address end Position
        write_reg(0x00);
        write_reg(0x00);
        write_reg(0x00);
        write_reg(0x9f);                          //0--159,垂直地址结
        write_cmd(0x2c);
        for(i=0;i<160;i++)
        {
                   for(j=0;j<128;j++)
                {                       
                  write_dat(PIC[k],PIC[k+1]);                       
                  k++;  k++;
                }
        }   
  }
*/


                  
回复 支持 反对

使用道具 举报

发表于 2013-5-11 21:48:27 | 显示全部楼层
马克~~~~~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 01:19 , Processed in 0.040177 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表