搜索
bottom↓
回复: 11

把波仔的ILI9320程序移植到C8051F020上面,晶振22.1184MHz,相关延时都改了,也查了,就是不

[复制链接]

出0入0汤圆

发表于 2011-11-3 21:03:17 | 显示全部楼层 |阅读模式
#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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-11-3 21:03:39 | 显示全部楼层
#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

sbit  A0         =     P2^1;          //数据/命令切换
sbit  RES        =     P2^4;              //复位
sbit  WRB        =     P2^2;                  //写控制
sbit  RDB        =     P2^3;                  //读控制
sbit  CS         =     P2^0;                  //片选

sbit  BLK                 =                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_PIN  P5


#define DATA_HI_PORT P0
#define DATA_HI_PIN  P0

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

出0入0汤圆

 楼主| 发表于 2011-11-3 21:04:02 | 显示全部楼层
#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);
}

出0入0汤圆

 楼主| 发表于 2011-11-3 21:04:43 | 显示全部楼层
先谢过了,再看数据手册中

出0入0汤圆

 楼主| 发表于 2011-11-3 22:03:57 | 显示全部楼层
搞定了,时序问题

出0入0汤圆

发表于 2012-6-17 13:42:57 | 显示全部楼层
请问一下,是什么地方的时序问题?

出0入0汤圆

发表于 2012-7-20 17:02:23 | 显示全部楼层
楼主,请问ili9320的三原色数据是怎么设置的,16位的数据输入,18位的bus总线,我看你每个原色站5位,还有一位去哪了?
还有他的部分图片显示怎么设置啊

出0入0汤圆

发表于 2012-7-20 19:02:42 | 显示全部楼层
波仔????我!!!

出0入0汤圆

发表于 2012-7-20 20:04:13 | 显示全部楼层
路过,路过。。。

出0入0汤圆

发表于 2012-7-20 20:17:16 | 显示全部楼层

出0入0汤圆

发表于 2012-7-25 21:20:20 | 显示全部楼层
求楼主说出哪里的时序问题,是写控制读写端口吗?、

出0入0汤圆

发表于 2012-7-25 21:31:10 | 显示全部楼层
C8051的速度写彩屏用延时?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 16:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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