把波仔的ILI9320程序移植到C8051F020上面,晶振22.1184MHz,相关延时都改了,也查了,就是不
#include "LCM.h"#include "C8051F020.H"
void Delay_us(unsigned char Times)
{
unsigned char i;
for (i=0; i<Times; i++)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();
}
}
void Delay_ms(unsigned char Times)
{
unsigned char i;
for (i=0; i<Times; i++)
{
Delay_us(250);
Delay_us(250);
Delay_us(250);
Delay_us(250);
}
}
void Delay_s(unsigned char Times)
{
unsigned char i;
for (i=0; i<Times; i++)
{Delay_ms(250);
Delay_ms(250);
Delay_ms(250);
Delay_ms(250);
}
}
void LCD_WriteReg(unsigned char index,unsigned int val)
{
LCD_CS_L();
LCD_RS_L();
// DATA_OUTPUT();
DATA_LO_PORT = (unsigned char)index;
DATA_HI_PORT = 0;
//DATA_HI_PORT = (unsigned char)(index>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_LO_PORT = (unsigned char)val;
DATA_HI_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_CS_H();
}
unsigned int LCD_ReadReg(unsigned char index)
{
unsigned int ret;
LCD_CS_L();
LCD_RS_L();
// DATA_OUTPUT();
DATA_LO_PORT = (unsigned char)index;
DATA_HI_PORT = 0;
//DATA_HI_PORT = (unsigned char)(index>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
// DATA_INPUT();
ret = DATA_HI_PIN;
ret <<= 8;
ret += DATA_LO_PIN;
LCD_RD_L();
NOP();
NOP();
LCD_RD_H();
LCD_CS_H();
return ret;
}
void LCD_WriteStart()
{
LCD_CS_L();
LCD_RS_L();
// DATA_OUTPUT();
DATA_LO_PORT = 0x22;
DATA_HI_PORT = 0x00;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
}
void LCD_WriteData(unsigned int val)
{
DATA_LO_PORT = (unsigned char)val;
DATA_HI_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
}
void LCD_WriteEnd()
{
LCD_CS_H();
}
void LCD_ReadStart()
{
LCD_CS_L();
LCD_RS_L();
// DATA_OUTPUT();
DATA_LO_PORT = 0x22;
DATA_HI_PORT = 0x00;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
// DATA_INPUT();
LCD_RD_L();//dummy read
NOP();
LCD_RD_H();
NOP();
NOP();
}
unsigned int LCD_ReadData()
{
unsigned int ret;
LCD_RD_L();
NOP();
ret = DATA_HI_PIN;
ret <<= 8;
ret += DATA_LO_PIN;
LCD_RD_H();
NOP();
NOP();
return ret;
}
void LCD_ReadEnd()
{
LCD_CS_H();
}
void delay_Nms(unsigned int n)
{
while(n--)
Delay_ms(1);
}
#define Display_ON() LCD_WriteReg(0x07,0x0173)
#define Display_OFF() LCD_WriteReg(0x07,0x0000)
void LCD_Init()
{
// PORT_INI();
LCD_RST_L();
delay_Nms(10);
LCD_RST_H();
//delay 10ms
delay_Nms(10);
//initializing funciton 1
LCD_WriteReg(0xe5,0x8000);
LCD_WriteReg(0x00,0x0001);
LCD_WriteReg(0x2b,0x0010);
LCD_WriteReg(0x01,0x0100);
LCD_WriteReg(0x02,0x0700);
LCD_WriteReg(0x03,0x1230);
LCD_WriteReg(0x04,0x0000);
LCD_WriteReg(0x08,0x0202);
LCD_WriteReg(0x09,0x0000);
LCD_WriteReg(0x0a,0x0000);
LCD_WriteReg(0x0c,0x0000);
LCD_WriteReg(0x0d,0x0000);
LCD_WriteReg(0x0f,0x0000);
LCD_WriteReg(0x50,0x0000);
LCD_WriteReg(0x51,0x00ef);
LCD_WriteReg(0x52,0x0000);
LCD_WriteReg(0x53,0x013f);
LCD_WriteReg(0x60,0x2700);
LCD_WriteReg(0x61,0x0001);
LCD_WriteReg(0x6a,0x0000);
LCD_WriteReg(0x80,0x0000);
LCD_WriteReg(0x81,0x0000);
LCD_WriteReg(0x82,0x0000);
LCD_WriteReg(0x83,0x0000);
LCD_WriteReg(0x84,0x0000);
LCD_WriteReg(0x85,0x0000);
LCD_WriteReg(0x90,0x0010);
LCD_WriteReg(0x92,0x0000);
LCD_WriteReg(0x93,0x0003);
LCD_WriteReg(0x95,0x0110);
LCD_WriteReg(0x97,0x0000);
LCD_WriteReg(0x98,0x0000);
//power setting function
LCD_WriteReg(0x10,0x0000);
LCD_WriteReg(0x11,0x0000);
LCD_WriteReg(0x12,0x0000);
LCD_WriteReg(0x13,0x0000);
delay_Nms(200);
LCD_WriteReg(0x10,0x17b0);
LCD_WriteReg(0x11,0x0004);
delay_Nms(50);
LCD_WriteReg(0x12,0x013e);
delay_Nms(50);
LCD_WriteReg(0x13,0x1f00);
LCD_WriteReg(0x29,0x000f);
delay_Nms(50);
LCD_WriteReg(0x20,0x0000);
LCD_WriteReg(0x21,0x0000);
//initializing function 2
LCD_WriteReg(0x30,0x0204);
LCD_WriteReg(0x31,0x0001);
LCD_WriteReg(0x32,0x0000);
LCD_WriteReg(0x35,0x0206);
LCD_WriteReg(0x36,0x0600);
LCD_WriteReg(0x37,0x0500);
LCD_WriteReg(0x38,0x0505);
LCD_WriteReg(0x39,0x0407);
LCD_WriteReg(0x3c,0x0500);
LCD_WriteReg(0x3d,0x0503);
//display on
LCD_WriteReg(0x07,0x0173);
//Display_ON();
}
void LCD_SetXY(unsigned int x, unsigned int y)
{
LCD_WriteReg(0x20,x);
LCD_WriteReg(0x21,y);
}
void LCD_SetWindow(unsigned int startX,unsigned int startY,unsigned int endX,unsigned int endY)
{
LCD_SetXY(startX,startY);
LCD_WriteReg(0x50,startX);
LCD_WriteReg(0x52,startY);
LCD_WriteReg(0x51,endX);
LCD_WriteReg(0x53,endY);
}
void LCD_SetWindowToFullScreen()
{
LCD_SetXY(0,0);
LCD_WriteReg(0x50,0x0000);
LCD_WriteReg(0x52,0x0000);
LCD_WriteReg(0x51,0x00ef);
LCD_WriteReg(0x53,0x013f);
}
void LCD_test()
{
unsigned int i,j;
LCD_WriteStart();
for(i=0;i<320;i++)
for(j=0;j<240;j++)
{
if(i>279)LCD_WriteData(0x0000);
else if(i>239)LCD_WriteData(0x001f);
else if(i>199)LCD_WriteData(0x07e0);
else if(i>159)LCD_WriteData(0x07ff);
else if(i>119)LCD_WriteData(0xf800);
else if(i>79)LCD_WriteData(0xf81f);
else if(i>39)LCD_WriteData(0xffe0);
else LCD_WriteData(0xffff);
}
LCD_WriteEnd();
}
void LCD_ClearScreen(unsigned int color)
{
unsigned long n = 240L*320L;
LCD_SetWindowToFullScreen();
LCD_WriteStart();
while(n--)LCD_WriteData(color);
LCD_WriteEnd();
}
unsigned char LCD_DrawPicture(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
unsigned int endX,endY;
unsigned long totalPixels = (unsigned long)sizeX * (unsigned long)sizeY;
endX = startX+sizeX-1;
endY = startY+sizeY-1;
if(endX>239 || endY>319)return 1;
LCD_SetWindow(startX,startY,endX,endY);
LCD_WriteStart();
while(totalPixels--)
LCD_WriteData(/*pgm_read_word*/(pic++));
LCD_WriteEnd();
return 0;
}
unsigned char LCD_DrawPicture2(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
unsigned int i,j;
if((startX+sizeX)>240 || (startY+sizeY)>320)return 1;
for (j = 0; j<sizeY; j++)
{
LCD_SetXY(startX,startY);
LCD_WriteStart();
for(i = 0; i<sizeX; i++)
{
LCD_WriteData(/*pgm_read_word*/(pic++));
}
startY++;//换行
}
LCD_WriteEnd();
return 0;
} #ifndef __LCM_H__
#define __LCM_H__
#include "mytype.h"
#include "c8051f020.h"
#include "intrins.h"
#define NOP() _nop_()
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
sbitA0 = P2^1; //数据/命令切换
sbitRES = P2^4; //复位
sbitWRB = P2^2; //写控制
sbitRDB = P2^3; //读控制
sbitCS = P2^0; //片选
sbitBLK = P2^5; //暂时没用到
#define LCD_CS_H() (CS = 1)
#define LCD_CS_L() (CS = 0)
#define LCD_RS_H() (A0 = 1)
#define LCD_RS_L() (A0 = 0)
#define LCD_WR_H() (WRB = 1)
#define LCD_WR_L() (WRB = 0)
#define LCD_RD_H() (RDB = 1)
#define LCD_RD_L() (RDB = 0)
#define LCD_RST_H() (RES = 1)
#define LCD_RST_L() (RES = 0)
#define DATA_LO_PORT P5
#define DATA_LO_PINP5
#define DATA_HI_PORT P0
#define DATA_HI_PINP0
extern void Delay_us(unsigned char Times);
extern void Delay_ms(unsigned char Times);
extern void Delay_s(unsigned char Times);
extern void LCD_Init(void);
extern void LCD_WriteStart();
extern void LCD_WriteData(unsigned int val);
extern void LCD_WriteEnd();
extern void LCD_ReadStart();
extern unsigned int LCD_ReadData();
extern void LCD_ReadEnd();
extern void LCD_SetXY(unsigned int x, unsigned int y);
extern void LCD_SetWindow(unsigned int startX,unsigned int startY,unsigned int endX,unsigned int endY);
extern void LCD_SetWindowToFullScreen();
extern void LCD_test(void);
extern void LCD_ClearScreen(unsigned int color);
extern unsigned char LCD_DrawPicture(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY);
extern unsigned char LCD_DrawPicture2(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY);
#endif #include "C8051F020.H"
#include "LCM.H"
void PORT_Init (void) /*I/O口初始化*/
{
XBR0=0x00;
XBR1=0x00;
XBR2=0x40;
P0MDOUT = 0xff;
P2MDOUT = 0xff;
}
void OSCILLATOR_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
void main()
{
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
OSCILLATOR_Init( );
PORT_Init();
LCD_Init();
Delay_ms(200);
LCD_test();
Delay_ms(2000);
LCD_ClearScreen(0x0000);
while (1);
} 先谢过了,再看数据手册中 搞定了,时序问题 请问一下,是什么地方的时序问题?
楼主,请问ili9320的三原色数据是怎么设置的,16位的数据输入,18位的bus总线,我看你每个原色站5位,还有一位去哪了?
还有他的部分图片显示怎么设置啊
波仔????我!!! 路过,路过。。。 {:loveliness:}{:loveliness:}{:loveliness:} 求楼主说出哪里的时序问题,是写控制读写端口吗?、
C8051的速度写彩屏用延时?
页:
[1]