PROTEUS上硬件连接如图,该段程序在51上测试能实现刷屏功能,移植到ARM后则驱动不了,时序也有问题,请问如何解决?

2019-07-18 08:38发布

proteus上硬件连接如图,该段程序在51上测试能实现刷屏功能,移植到ARM后则驱动不了,时序也有问题。
QQ图片20180710141246.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
尘埃落定Z
2019-07-19 03:01
/****************************************************************************
* 文件名:SPIDISP.C
* 功能:使用硬件SPI接口输出显示。(硬件:TFT ILI9341显示)
****************************************************************************/
#include "Config.h"
#include "Target.h"

#define     RED          0XF800
#define     GREEN        0X07E0
#define     BLUE         0X001F
#define     YELLOW       0XFFE0
#define     WHITE        0XFFFF

#define ssel0 (1<<7)
#define LCD_MOSI (1<<6)      
#define LCD_MISO (1<<5)               
#define sck (1<<4)         
#define dc (1<<3)
#define cs (1<<2)



/*---------------延时子程序----------------*/
void  delay_ms(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--)
      for(i=0; i<9000; i++);
}
/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  MSpiInit(void)
{
   S0SPCCR = 0x52;                     // 设置SPI时钟分频82
   S0SPCR = 0x30;                   // 设置SPI接口模式,MSTR=1 主模式,CPOL=1 SCK低有效,
                                   //CPHA=0 SCK第一个时钟沿采样,LSBF=0 位7在先 ,SPIE=0 中断被禁止
}

/****************************************************************************
* 名称:SPI_RW()
* 功能:向SPI总线发送数据。
* 入口参数:data        待发送的数据
* 出口参数:返回值为读取的数据
****************************************************************************/
uint8  SPI_RW(uint8 data)
{
   uint8 temp = S0SPDR;
   S0SPDR = data;
   while( 0==(S0SPSR&0x80) );                // 等待SPIF置位,即等待数据发送完毕
   return(S0SPDR);
}

void LCD_CD_DATA(unsigned char val)
{
        IO0SET=dc;
        IO0CLR=cs;
        SPI_RW(val);
        IO0SET=cs;
}

void LCD_CD_REG(unsigned char reg)
{
        IO0CLR=dc;
        IO0CLR=cs;
        SPI_RW(reg);
        IO0SET=cs;
}

void LCD_Init()
{

        LCD_CD_REG(0xCF);  
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0xC1);
        LCD_CD_DATA(0X30);
        LCD_CD_REG(0xED);  
        LCD_CD_DATA(0x64);
        LCD_CD_DATA(0x03);
        LCD_CD_DATA(0X12);
        LCD_CD_DATA(0X81);
        LCD_CD_REG(0xE8);  
        LCD_CD_DATA(0x85);
        LCD_CD_DATA(0x10);
        LCD_CD_DATA(0x7A);
        LCD_CD_REG(0xCB);  
        LCD_CD_DATA(0x39);
        LCD_CD_DATA(0x2C);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x34);
        LCD_CD_DATA(0x02);
        LCD_CD_REG(0xF7);  
        LCD_CD_DATA(0x20);
        LCD_CD_REG(0xEA);  
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);
        LCD_CD_REG(0xC0);    //Power control
        LCD_CD_DATA(0x1B);   //VRH[5:0]
        LCD_CD_REG(0xC1);    //Power control
        LCD_CD_DATA(0x01);   //SAP[2:0];BT[3:0]
        LCD_CD_REG(0xC5);    //VCM control
        LCD_CD_DATA(0x30);          //3F
        LCD_CD_DATA(0x30);          //3C
        LCD_CD_REG(0xC7);    //VCM control2
        LCD_CD_DATA(0XB7);
        LCD_CD_REG(0x36);    // Memory Access Control
        LCD_CD_DATA(0x48);
        LCD_CD_REG(0x3A);   
        LCD_CD_DATA(0x55);
        LCD_CD_REG(0xB1);   
        LCD_CD_DATA(0x00);   
        LCD_CD_DATA(0x1A);
        LCD_CD_REG(0xB6);    // Display Function Control
        LCD_CD_DATA(0x0A);
        LCD_CD_DATA(0xA2);
        LCD_CD_REG(0xF2);    // 3Gamma Function Disable
        LCD_CD_DATA(0x00);
        LCD_CD_REG(0x26);    //Gamma curve selected
        LCD_CD_DATA(0x01);
        LCD_CD_REG(0xE0);    //Set Gamma
        LCD_CD_DATA(0x0F);
        LCD_CD_DATA(0x2A);
        LCD_CD_DATA(0x28);
        LCD_CD_DATA(0x08);
        LCD_CD_DATA(0x0E);
        LCD_CD_DATA(0x08);
        LCD_CD_DATA(0x54);
        LCD_CD_DATA(0XA9);
        LCD_CD_DATA(0x43);
        LCD_CD_DATA(0x0A);
        LCD_CD_DATA(0x0F);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);                  
        LCD_CD_REG(0XE1);    //Set Gamma
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x15);
        LCD_CD_DATA(0x17);
        LCD_CD_DATA(0x07);
        LCD_CD_DATA(0x11);
        LCD_CD_DATA(0x06);
        LCD_CD_DATA(0x2B);
        LCD_CD_DATA(0x56);
        LCD_CD_DATA(0x3C);
        LCD_CD_DATA(0x05);
        LCD_CD_DATA(0x10);
        LCD_CD_DATA(0x0F);
        LCD_CD_DATA(0x3F);
        LCD_CD_DATA(0x3F);
        LCD_CD_DATA(0x0F);
        LCD_CD_REG(0x2B);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x01);
        LCD_CD_DATA(0x3f);
        LCD_CD_REG(0x2A);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0x00);
        LCD_CD_DATA(0xef);         
        LCD_CD_REG(0x11); //Exit Sleep
        delay_ms(120);
        LCD_CD_REG(0x29); //display on       
}

void LCD_SetArea(unsigned int stx,unsigned int sty,unsigned int endx,unsigned int endy)
{
        LCD_CD_REG(0x2A);  
        LCD_CD_DATA(stx>>8);   
        LCD_CD_DATA(stx&0xff);           
        LCD_CD_DATA(endx>>8);
        LCD_CD_DATA(endx&0xff);       

        LCD_CD_REG(0x2B);
        LCD_CD_DATA(sty>>8);
        LCD_CD_DATA(sty&0xff);       
        LCD_CD_DATA(endy>>8);
        LCD_CD_DATA(endy&0xff);       
}

void LcdWirteColorData(unsigned int color)
{
        IO0SET=dc;
        IO0CLR=cs;
        SPI_RW(color>>8);
        SPI_RW(color);
        IO0SET=cs;
}

void LCD_Clear(unsigned int color)
{  
        unsigned int i,j;
        LCD_SetArea(0,0,239,319);
        LCD_CD_REG(0x2C);
        for(i=0;i<320;i++)
        {
                for(j=0;j<240;j++)
                {
                        LcdWirteColorData(color);
                }
        }
}

void main()
{
        
        TargetResetInit();
        PINSEL0=(PINSEL0&(~(0XFF<<8)))|(0x55<<8);            // 设置连接4线SPI
        PINSEL1 = 0x00000000;                                // 设置PIN1为GPIO
        IO0DIR  = 0xffffffff;
        IO0SET  = ssel0;
        MSpiInit();
        delay_ms(100);
        LCD_Init();
        while(1)
        {

                LCD_Clear(RED);
                delay_ms(300);
                LCD_Clear(BLUE);
                delay_ms(300);
                LCD_Clear(GREEN);
                delay_ms(300);
        }

}

       

一周热门 更多>