发新帖我要提问
12
返回列表
打印
[应用相关]

stm32 红外接收与学习

[复制链接]
楼主: junpeng324
手机看帖
扫描二维码
随时随地手机跟帖
21
junpeng324|  楼主 | 2018-10-18 13:14 | 只看该作者 回帖奖励 |倒序浏览
需要对LCD 屏幕进行驱动显示

使用特权

评论回复
22
junpeng324|  楼主 | 2018-10-18 13:14 | 只看该作者
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;
         
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{   
        LCD->LCD_REG=regval;//写入要写的寄存器序号         
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{         
        LCD->LCD_RAM=data;                 
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
        vu16 ram;                        //防止被优化
        ram=LCD->LCD_RAM;       
        return ram;         
}               

使用特权

评论回复
23
junpeng324|  楼主 | 2018-10-18 13:15 | 只看该作者
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{       
        LCD->LCD_REG = LCD_Reg;                //写入要写的寄存器序号         
        LCD->LCD_RAM = LCD_RegValue;//写入数据                             
}          
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
u16 LCD_ReadReg(u16 LCD_Reg)
{                                                                                  
        LCD_WR_REG(LCD_Reg);                //写入要读的寄存器序号
        delay_us(5);                  
        return LCD_RD_DATA();                //返回读到的值
}   

使用特权

评论回复
24
junpeng324|  楼主 | 2018-10-18 13:16 | 只看该作者
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
        LCD->LCD_REG=lcddev.wramcmd;          
}         
//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(u16 RGB_Code)
{                                                            
        LCD->LCD_RAM = RGB_Code;//写十六位GRAM
}

使用特权

评论回复
25
junpeng324|  楼主 | 2018-10-18 13:22 | 只看该作者
//从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
//通过该函数转换
//c:GBR格式的颜色值
//返回值:RGB格式的颜色值
u16 LCD_BGR2RGB(u16 c)
{
        u16  r,g,b,rgb;   
        b=(c>>0)&0x1f;
        g=(c>>5)&0x3f;
        r=(c>>11)&0x1f;         
        rgb=(b<<11)+(g<<5)+(r<<0);                 
        return(rgb);
}
//当mdk -O1时间优化时需要设置
//延时i
void opt_delay(u8 i)
{
        while(i--);
}

使用特权

评论回复
26
junpeng324|  楼主 | 2018-10-18 13:23 | 只看该作者
//读取个某点的颜色值         
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
        u16 r=0,g=0,b=0;
        if(x>=lcddev.width||y>=lcddev.height)return 0;        //超过了范围,直接返回                  
        LCD_SetCursor(x,y);            
        if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X2E);//9341/6804/3510/1963 发送读GRAM指令
        else if(lcddev.id==0X5510)LCD_WR_REG(0X2E00);        //5510 发送读GRAM指令
        else LCD_WR_REG(0X22);                                               //其他IC发送读GRAM指令
        if(lcddev.id==0X9320)opt_delay(2);                                //FOR 9320,延时2us            
        r=LCD_RD_DATA();                                                                //dummy Read          
        if(lcddev.id==0X1963)return r;                                        //1963直接读就可以
        opt_delay(2);          
        r=LCD_RD_DATA();                                                                    //实际坐标颜色
        if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)                //9341/NT35310/NT35510要分2次读出
        {
                opt_delay(2);          
                b=LCD_RD_DATA();
                g=r&0XFF;                //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位
                g<<=8;
        }
        if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0XB505||lcddev.id==0XC505)return r;        //这几种IC直接返回颜色值
        else if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));//ILI9341/NT35310/NT35510需要公式转换一下
        else return LCD_BGR2RGB(r);                                                //其他IC
}       

使用特权

评论回复
27
junpeng324|  楼主 | 2018-10-18 13:23 | 只看该作者
//LCD开启显示
void LCD_DisplayOn(void)
{                                          
        if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X29);        //开启显示
        else if(lcddev.id==0X5510)LCD_WR_REG(0X2900);        //开启显示
        else LCD_WriteReg(0X07,0x0173);                                          //开启显示
}         
//LCD关闭显示
void LCD_DisplayOff(void)
{          
        if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X28);        //关闭显示
        else if(lcddev.id==0X5510)LCD_WR_REG(0X2800);        //关闭显示
        else LCD_WriteReg(0X07,0x0);//关闭显示
}   

使用特权

评论回复
28
junpeng324|  楼主 | 2018-10-18 13:24 | 只看该作者
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{         
        if(lcddev.id==0X9341||lcddev.id==0X5310)
        {                    
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);                          
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);                
        }else if(lcddev.id==0X6804)
        {
                if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏时处理
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);
        }else if(lcddev.id==0X1963)
        {                                          
                if(lcddev.dir==0)//x坐标需要变换
                {
                        Xpos=lcddev.width-1-Xpos;
                        LCD_WR_REG(lcddev.setxcmd);
                        LCD_WR_DATA(0);LCD_WR_DATA(0);                
                        LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);                          
                }else
                {
                        LCD_WR_REG(lcddev.setxcmd);
                        LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);                
                        LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);                                                 
                }       
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);                
                LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);                                         
               
        }else if(lcddev.id==0X5510)
        {
                LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(Xpos>>8);                
                LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(Xpos&0XFF);                         
                LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(Ypos>>8);                 
                LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(Ypos&0XFF);                       
        }else
        {
                if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏其实就是调转x,y坐标
                LCD_WriteReg(lcddev.setxcmd, Xpos);
                LCD_WriteReg(lcddev.setycmd, Ypos);
        }         
}        

使用特权

评论回复
29
junpeng324|  楼主 | 2018-10-18 14:46 | 只看该作者
//设置LCD的自动扫描方向
//注意:其他函数可能会受到此函数设置的影响(尤其是9341/6804这两个奇葩),
//所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//dir:0~7,代表8个方向(具体定义见lcd.h)
//9320/9325/9328/4531/4535/1505/b505/5408/9341/5310/5510/1963等IC已经实际测试                     
void LCD_Scan_Dir(u8 dir)
{
        u16 regval=0;
        u16 dirreg=0;
        u16 temp;  
        if((lcddev.dir==1&&lcddev.id!=0X6804&&lcddev.id!=0X1963)||(lcddev.dir==0&&lcddev.id==0X1963))//横屏时,对6804和1963不改变扫描方向!竖屏时1963改变方向
        {                          
                switch(dir)//方向转换
                {
                        case 0:dir=6;break;
                        case 1:dir=7;break;
                        case 2:dir=4;break;
                        case 3:dir=5;break;
                        case 4:dir=1;break;
                        case 5:dir=0;break;
                        case 6:dir=3;break;
                        case 7:dir=2;break;             
                }
        }
        if(lcddev.id==0x9341||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963)//9341/6804/5310/5510/1963,特殊处理
        {
                switch(dir)
                {
                        case L2R_U2D://从左到右,从上到下
                                regval|=(0<<7)|(0<<6)|(0<<5);
                                break;
                        case L2R_D2U://从左到右,从下到上
                                regval|=(1<<7)|(0<<6)|(0<<5);
                                break;
                        case R2L_U2D://从右到左,从上到下
                                regval|=(0<<7)|(1<<6)|(0<<5);
                                break;
                        case R2L_D2U://从右到左,从下到上
                                regval|=(1<<7)|(1<<6)|(0<<5);
                                break;         
                        case U2D_L2R://从上到下,从左到右
                                regval|=(0<<7)|(0<<6)|(1<<5);
                                break;
                        case U2D_R2L://从上到下,从右到左
                                regval|=(0<<7)|(1<<6)|(1<<5);
                                break;
                        case D2U_L2R://从下到上,从左到右
                                regval|=(1<<7)|(0<<6)|(1<<5);
                                break;
                        case D2U_R2L://从下到上,从右到左
                                regval|=(1<<7)|(1<<6)|(1<<5);
                                break;         
                }
                if(lcddev.id==0X5510)dirreg=0X3600;
                else dirreg=0X36;
                if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510)&&(lcddev.id!=0X1963))regval|=0X08;//5310/5510/1963不需要BGR   
                if(lcddev.id==0X6804)regval|=0x02;//6804的BIT6和9341的反了          
                LCD_WriteReg(dirreg,regval);
                if(lcddev.id!=0X1963)//1963不做坐标处理
                {
                        if(regval&0X20)
                        {
                                if(lcddev.width<lcddev.height)//交换X,Y
                                {
                                        temp=lcddev.width;
                                        lcddev.width=lcddev.height;
                                        lcddev.height=temp;
                                }
                        }else  
                        {
                                if(lcddev.width>lcddev.height)//交换X,Y
                                {
                                        temp=lcddev.width;
                                        lcddev.width=lcddev.height;
                                        lcddev.height=temp;
                                }
                        }  
                }
                if(lcddev.id==0X5510)
                {
                        LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(0);
                        LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(0);
                        LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA((lcddev.width-1)>>8);
                        LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA((lcddev.width-1)&0XFF);
                        LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(0);
                        LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(0);
                        LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA((lcddev.height-1)>>8);
                        LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA((lcddev.height-1)&0XFF);
                }else
                {
                        LCD_WR_REG(lcddev.setxcmd);
                        LCD_WR_DATA(0);LCD_WR_DATA(0);
                        LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
                        LCD_WR_REG(lcddev.setycmd);
                        LCD_WR_DATA(0);LCD_WR_DATA(0);
                        LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);  
                }
          }else
        {
                switch(dir)
                {
                        case L2R_U2D://从左到右,从上到下
                                regval|=(1<<5)|(1<<4)|(0<<3);
                                break;
                        case L2R_D2U://从左到右,从下到上
                                regval|=(0<<5)|(1<<4)|(0<<3);
                                break;
                        case R2L_U2D://从右到左,从上到下
                                regval|=(1<<5)|(0<<4)|(0<<3);
                                break;
                        case R2L_D2U://从右到左,从下到上
                                regval|=(0<<5)|(0<<4)|(0<<3);
                                break;         
                        case U2D_L2R://从上到下,从左到右
                                regval|=(1<<5)|(1<<4)|(1<<3);
                                break;
                        case U2D_R2L://从上到下,从右到左
                                regval|=(1<<5)|(0<<4)|(1<<3);
                                break;
                        case D2U_L2R://从下到上,从左到右
                                regval|=(0<<5)|(1<<4)|(1<<3);
                                break;
                        case D2U_R2L://从下到上,从右到左
                                regval|=(0<<5)|(0<<4)|(1<<3);
                                break;         
                }
                dirreg=0X03;
                regval|=1<<12;
                LCD_WriteReg(dirreg,regval);
        }
}     

使用特权

评论回复
30
junpeng324|  楼主 | 2018-10-18 14:50 | 只看该作者
//画点
//x,y:坐标
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(u16 x,u16 y)
{
        LCD_SetCursor(x,y);                //设置光标位置
        LCD_WriteRAM_Prepare();        //开始写入GRAM
        LCD->LCD_RAM=POINT_COLOR;
}

使用特权

评论回复
31
junpeng324|  楼主 | 2018-10-18 16:10 | 只看该作者
//快速画点
//x,y:坐标
//color:颜色
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{          
        if(lcddev.id==0X9341||lcddev.id==0X5310)
        {
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                           
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                           
        }else if(lcddev.id==0X5510)
        {
                LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);  
                LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);          
                LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);  
                LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF);
        }else if(lcddev.id==0X1963)
        {
                if(lcddev.dir==0)x=lcddev.width-1-x;
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                
        }else if(lcddev.id==0X6804)
        {                    
                if(lcddev.dir==1)x=lcddev.width-1-x;//横屏时处理
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                         
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                
        }else
        {
                if(lcddev.dir==1)x=lcddev.width-1-x;//横屏其实就是调转x,y坐标
                LCD_WriteReg(lcddev.setxcmd,x);
                LCD_WriteReg(lcddev.setycmd,y);
        }                         
        LCD->LCD_REG=lcddev.wramcmd;
        LCD->LCD_RAM=color;
}         

使用特权

评论回复
32
junpeng324|  楼主 | 2018-10-18 16:10 | 只看该作者
//SSD1963 背光设置
//pwm:背光等级,0~100.越大越亮.
void LCD_SSD_BackLightSet(u8 pwm)
{       
        LCD_WR_REG(0xBE);        //配置PWM输出
        LCD_WR_DATA(0x05);        //1设置PWM频率
        LCD_WR_DATA(pwm*2.55);//2设置PWM占空比
        LCD_WR_DATA(0x01);        //3设置C
        LCD_WR_DATA(0xFF);        //4设置D
        LCD_WR_DATA(0x00);        //5设置E
        LCD_WR_DATA(0x00);        //6设置F
}

使用特权

评论回复
33
junpeng324|  楼主 | 2018-10-18 17:02 | 只看该作者
//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(u8 dir)
{
        if(dir==0)                        //竖屏
        {
                lcddev.dir=0;        //竖屏
                lcddev.width=240;
                lcddev.height=320;
                if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310)
                {
                        lcddev.wramcmd=0X2C;
                         lcddev.setxcmd=0X2A;
                        lcddev.setycmd=0X2B;           
                        if(lcddev.id==0X6804||lcddev.id==0X5310)
                        {
                                lcddev.width=320;
                                lcddev.height=480;
                        }
                }else if(lcddev.id==0x5510)
                {
                        lcddev.wramcmd=0X2C00;
                         lcddev.setxcmd=0X2A00;
                        lcddev.setycmd=0X2B00;
                        lcddev.width=480;
                        lcddev.height=800;
                }else if(lcddev.id==0X1963)
                {
                        lcddev.wramcmd=0X2C;        //设置写入GRAM的指令
                        lcddev.setxcmd=0X2B;        //设置写X坐标指令
                        lcddev.setycmd=0X2A;        //设置写Y坐标指令
                        lcddev.width=480;                //设置宽度480
                        lcddev.height=800;                //设置高度800  
                }else
                {
                        lcddev.wramcmd=0X22;
                         lcddev.setxcmd=0X20;
                        lcddev.setycmd=0X21;  
                }
        }else                                 //横屏
        {                                         
                lcddev.dir=1;        //横屏
                lcddev.width=320;
                lcddev.height=240;
                if(lcddev.id==0X9341||lcddev.id==0X5310)
                {
                        lcddev.wramcmd=0X2C;
                         lcddev.setxcmd=0X2A;
                        lcddev.setycmd=0X2B;           
                }else if(lcddev.id==0X6804)         
                {
                        lcddev.wramcmd=0X2C;
                         lcddev.setxcmd=0X2B;
                        lcddev.setycmd=0X2A;
                }else if(lcddev.id==0x5510)
                {
                        lcddev.wramcmd=0X2C00;
                         lcddev.setxcmd=0X2A00;
                        lcddev.setycmd=0X2B00;
                        lcddev.width=800;
                        lcddev.height=480;
                }else if(lcddev.id==0X1963)
                {
                        lcddev.wramcmd=0X2C;        //设置写入GRAM的指令
                        lcddev.setxcmd=0X2A;        //设置写X坐标指令
                        lcddev.setycmd=0X2B;        //设置写Y坐标指令
                        lcddev.width=800;                //设置宽度800
                        lcddev.height=480;                //设置高度480  
                }else
                {
                        lcddev.wramcmd=0X22;
                         lcddev.setxcmd=0X21;
                        lcddev.setycmd=0X20;  
                }
                if(lcddev.id==0X6804||lcddev.id==0X5310)
                {          
                        lcddev.width=480;
                        lcddev.height=320;                        
                }
        }
        LCD_Scan_Dir(DFT_SCAN_DIR);        //默认扫描方向
}         

使用特权

评论回复
34
junpeng324|  楼主 | 2018-10-18 17:03 | 只看该作者
//设置窗口,并自动设置画点坐标到窗口左上角(sx,sy).
//sx,sy:窗口起始坐标(左上角)
//width,height:窗口宽度和高度,必须大于0!!
//窗体大小:width*height.
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{   
        u8 hsareg,heareg,vsareg,veareg;
        u16 hsaval,heaval,vsaval,veaval;
        u16 twidth,theight;
        twidth=sx+width-1;
        theight=sy+height-1;
        if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X6804||(lcddev.dir==1&&lcddev.id==0X1963))
        {
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(sx>>8);
                LCD_WR_DATA(sx&0XFF);         
                LCD_WR_DATA(twidth>>8);
                LCD_WR_DATA(twidth&0XFF);  
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(sy>>8);
                LCD_WR_DATA(sy&0XFF);
                LCD_WR_DATA(theight>>8);
                LCD_WR_DATA(theight&0XFF);
        }else if(lcddev.id==0X1963)//1963竖屏特殊处理
        {
                sx=lcddev.width-width-sx;
                height=sy+height-1;
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(sx>>8);
                LCD_WR_DATA(sx&0XFF);         
                LCD_WR_DATA((sx+width-1)>>8);
                LCD_WR_DATA((sx+width-1)&0XFF);  
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(sy>>8);
                LCD_WR_DATA(sy&0XFF);
                LCD_WR_DATA(height>>8);
                LCD_WR_DATA(height&0XFF);                
        }else if(lcddev.id==0X5510)
        {
                LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(sx>>8);  
                LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(sx&0XFF);          
                LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA(twidth>>8);   
                LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA(twidth&0XFF);   
                LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(sy>>8);   
                LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(sy&0XFF);  
                LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA(theight>>8);   
                LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA(theight&0XFF);  
        }else        //其他驱动IC
        {
                if(lcddev.dir==1)//横屏
                {
                        //窗口值
                        hsaval=sy;                               
                        heaval=theight;
                        vsaval=lcddev.width-twidth-1;
                        veaval=lcddev.width-sx-1;                               
                }else
                {
                        hsaval=sx;                               
                        heaval=twidth;
                        vsaval=sy;
                        veaval=theight;
                }
                hsareg=0X50;heareg=0X51;//水平方向窗口寄存器
                vsareg=0X52;veareg=0X53;//垂直方向窗口寄存器                                                                     
                //设置寄存器值
                LCD_WriteReg(hsareg,hsaval);
                LCD_WriteReg(heareg,heaval);
                LCD_WriteReg(vsareg,vsaval);
                LCD_WriteReg(veareg,veaval);               
                LCD_SetCursor(sx,sy);        //设置光标位置
        }
}

使用特权

评论回复
35
junpeng324|  楼主 | 2018-10-18 17:21 | 只看该作者
GPIO_InitTypeDef GPIO_InitStructure;
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
        FSMC_NORSRAMTimingInitTypeDef  writeTiming;
       
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);        //使能FSMC时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,D,E,G以及AFIO复用功能时钟


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //PB0 推挽输出 背光
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        //PORTD复用推挽输出  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;                                 //        //PORTD复用推挽输出  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //复用推挽输出   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
           
        //PORTE复用推挽输出  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                 //        //PORTD复用推挽输出  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //复用推挽输出   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                                                                  

           //        //PORTG12复用推挽输出 A0       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12;         //        //PORTD复用推挽输出  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //复用推挽输出   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);

使用特权

评论回复
36
junpeng324|  楼主 | 2018-10-18 17:21 | 只看该作者

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
  FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //  存储器写使能
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1

使用特权

评论回复
37
junpeng324|  楼主 | 2018-10-18 17:22 | 只看该作者
//清屏函数
//color:要清屏的填充色
void LCD_Clear(u16 color)
{
        u32 index=0;      
        u32 totalpoint=lcddev.width;
        totalpoint*=lcddev.height;                         //得到总点数
        if((lcddev.id==0X6804)&&(lcddev.dir==1))//6804横屏的时候特殊处理  
        {                                                    
                lcddev.dir=0;         
                lcddev.setxcmd=0X2A;
                lcddev.setycmd=0X2B;                                  
                LCD_SetCursor(0x00,0x0000);                //设置光标位置  
                lcddev.dir=1;         
                  lcddev.setxcmd=0X2B;
                lcddev.setycmd=0X2A;           
        }else LCD_SetCursor(0x00,0x0000);        //设置光标位置
        LCD_WriteRAM_Prepare();                     //开始写入GRAM                   
        for(index=0;index<totalpoint;index++)
        {
                LCD->LCD_RAM=color;       
        }
}  

使用特权

评论回复
38
keaibukelian| | 2018-10-22 12:56 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
39
paotangsan| | 2018-10-22 14:40 | 只看该作者
我理解的红外是不是必须无遮挡的啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则