C51代码映射到arduino的问题
买了一个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;
}
另外注意到一个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。 水乐天写了一个51移植到Arduino的帖子,你参考下,看看有没有启发~
http://www.geek-workshop.com/thread-1876-1-1.html 弘毅 发表于 2012-11-18 18:03 static/image/common/back.gif
水乐天写了一个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[];
*/
/*****************函数声名***********************************/
//voiddelay(unsigned int t);
//voidkeypress(void);
voidwrite_cmd(unsigned char cmd);
voidwrite_reg(unsigned char para1);
voidwrite_dat(unsigned char data_h,unsigned char data_l);
voidTFT_INIT(void);
voiddisplay_rgbw(unsigned char data_h,unsigned char data_l);
//voiddisplay_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,PIC);
k++;k++;
}
}
}
*/
马克~~~~~~~
页:
[1]