打印
[应用相关]

stm32 ADC内部芯片温度打印

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
21
hanzhen654|  楼主 | 2018-8-31 23:44 | 只看该作者 回帖奖励 |倒序浏览
//从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);
}       

使用特权

评论回复
22
hanzhen654|  楼主 | 2018-8-31 23:45 | 只看该作者
//当mdk -O1时间优化时需要设置
//延时i
void opt_delay(u8 i)
{
        while(i--);
}

使用特权

评论回复
23
hanzhen654|  楼主 | 2018-8-31 23:45 | 只看该作者
//读取个某点的颜色值         
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
        u16 r,g,b;
        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指令
        GPIOB->CRL=0X88888888;                                                         //PB0-7  上拉输入
        GPIOB->CRH=0X88888888;                                                         //PB8-15 上拉输入
        GPIOB->ODR=0XFFFF;                                                             //全部输出高

        LCD_RS_SET;
        LCD_CS_CLR;            
        //读取数据(读GRAM时,第一次为假读)       
        LCD_RD_CLR;                  
        opt_delay(2);                                                                        //延时               
        r=DATAIN;                                                                                  //实际坐标颜色
        LCD_RD_SET;
        if(lcddev.id==0X1963)
        {
                LCD_CS_SET;
                GPIOB->CRL=0X33333333;                 //PB0-7  上拉输出
                GPIOB->CRH=0X33333333;                 //PB8-15 上拉输出
                GPIOB->ODR=0XFFFF;                    //全部输出高  
                return r;                                        //1963直接读就可以
        }
        //dummy READ
        LCD_RD_CLR;                                          
        opt_delay(2);//延时                                          
        r=DATAIN;          //实际坐标颜色
        LCD_RD_SET;
        if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)        //9341/NT35310/NT35510要分2次读出
        {         
                LCD_RD_CLR;                                          
                opt_delay(2);//延时                          
                b=DATAIN;//读取蓝色值            
                 LCD_RD_SET;
                g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位
                g<<=8;
        }else if(lcddev.id==0X6804)
        {
                LCD_RD_CLR;                                          
                 LCD_RD_SET;
                r=DATAIN;//6804第二次读取的才是真实值
        }         
        LCD_CS_SET;
        GPIOB->CRL=0X33333333;                 //PB0-7  上拉输出
        GPIOB->CRH=0X33333333;                 //PB8-15 上拉输出
        GPIOB->ODR=0XFFFF;                    //全部输出高  
        if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0X8989||lcddev.id==0XB505)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
}       

使用特权

评论回复
24
hanzhen654|  楼主 | 2018-8-31 23:46 | 只看该作者
//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);                                          //开启显示
}         

使用特权

评论回复
25
hanzhen654|  楼主 | 2018-8-31 23:46 | 只看该作者
//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);//关闭显示
}   

使用特权

评论回复
26
hanzhen654|  楼主 | 2018-8-31 23:46 | 只看该作者
//设置光标位置
//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);
        }         
}        

使用特权

评论回复
27
hanzhen654|  楼主 | 2018-8-31 23:47 | 只看该作者
//设置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);
        }
}     

使用特权

评论回复
28
hanzhen654|  楼主 | 2018-8-31 23:48 | 只看该作者
//画点
//x,y:坐标
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(u16 x,u16 y)
{
        LCD_SetCursor(x,y);                //设置光标位置
        LCD_WriteRAM_Prepare();        //开始写入GRAM
        LCD_WR_DATA(POINT_COLOR);
}         

使用特权

评论回复
29
hanzhen654|  楼主 | 2018-8-31 23:48 | 只看该作者
//快速画点
//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_RS_CLR;
        LCD_CS_CLR;
        DATAOUT(lcddev.wramcmd);//写指令  
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;
        LCD_WR_DATA(color);                //写数据
}

使用特权

评论回复
30
hanzhen654|  楼主 | 2018-8-31 23:48 | 只看该作者
//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
}

使用特权

评论回复
31
hanzhen654|  楼主 | 2018-8-31 23:49 | 只看该作者
//设置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);        //默认扫描方向
}         

使用特权

评论回复
32
hanzhen654|  楼主 | 2018-8-31 23:49 | 只看该作者
//设置窗口,并自动设置画点坐标到窗口左上角(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);        //设置光标位置
        }
}

使用特权

评论回复
33
hanzhen654|  楼主 | 2018-8-31 23:51 | 只看该作者
//清屏函数
//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_WR_DATA(color);       
}  

使用特权

评论回复
34
hanzhen654|  楼主 | 2018-8-31 23:52 | 只看该作者
//在指定区域内填充指定颜色
//区域大小:(xend-xsta+1)*(yend-ysta+1)
//xsta
//color:要填充的颜色
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{         
        u16 i,j;
        u16 xlen=0;
        u16 temp;
        if((lcddev.id==0X6804)&&(lcddev.dir==1))        //6804横屏的时候特殊处理  
        {
                temp=sx;
                sx=sy;
                sy=lcddev.width-ex-1;          
                ex=ey;
                ey=lcddev.width-temp-1;
                lcddev.dir=0;         
                lcddev.setxcmd=0X2A;
                lcddev.setycmd=0X2B;                                  
                LCD_Fill(sx,sy,ex,ey,color);  
                lcddev.dir=1;         
                  lcddev.setxcmd=0X2B;
                lcddev.setycmd=0X2A;           
        }else
        {
                xlen=ex-sx+1;         
                for(i=sy;i<=ey;i++)
                {
                         LCD_SetCursor(sx,i);                                      //设置光标位置
                        LCD_WriteRAM_Prepare();                             //开始写入GRAM          
                        for(j=0;j<xlen;j++)LCD_WR_DATA(color);        //设置光标位置             
                }
        }
}  

使用特权

评论回复
35
hanzhen654|  楼主 | 2018-8-31 23:52 | 只看该作者
//在指定区域内填充指定颜色块                         
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
//color:要填充的颜色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
{  
        u16 height,width;
        u16 i,j;
        width=ex-sx+1;                         //得到填充的宽度
        height=ey-sy+1;                        //高度
        for(i=0;i<height;i++)
        {
                LCD_SetCursor(sx,sy+i);           //设置光标位置
                LCD_WriteRAM_Prepare();     //开始写入GRAM
                for(j=0;j<width;j++)LCD_WR_DATA(color[i*width+j]);//写入数据
        }          
}

使用特权

评论回复
36
hanzhen654|  楼主 | 2018-8-31 23:52 | 只看该作者
//画线
//x1,y1:起点坐标
//x2,y2:终点坐标  
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
        u16 t;
        int xerr=0,yerr=0,delta_x,delta_y,distance;
        int incx,incy,uRow,uCol;
        delta_x=x2-x1; //计算坐标增量
        delta_y=y2-y1;
        uRow=x1;
        uCol=y1;
        if(delta_x>0)incx=1; //设置单步方向
        else if(delta_x==0)incx=0;//垂直线
        else {incx=-1;delta_x=-delta_x;}
        if(delta_y>0)incy=1;
        else if(delta_y==0)incy=0;//水平线
        else{incy=-1;delta_y=-delta_y;}
        if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
        else distance=delta_y;
        for(t=0;t<=distance+1;t++ )//画线输出
        {  
                LCD_DrawPoint(uRow,uCol);//画点
                xerr+=delta_x ;
                yerr+=delta_y ;
                if(xerr>distance)
                {
                        xerr-=distance;
                        uRow+=incx;
                }
                if(yerr>distance)
                {
                        yerr-=distance;
                        uCol+=incy;
                }
        }  
}   

使用特权

评论回复
37
hanzhen654|  楼主 | 2018-8-31 23:53 | 只看该作者
//画矩形          
//(x1,y1),(x2,y2):矩形的对角坐标
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
        LCD_DrawLine(x1,y1,x2,y1);
        LCD_DrawLine(x1,y1,x1,y2);
        LCD_DrawLine(x1,y2,x2,y2);
        LCD_DrawLine(x2,y1,x2,y2);
}

使用特权

评论回复
38
hanzhen654|  楼主 | 2018-8-31 23:53 | 只看该作者
//在指定位置画一个指定大小的圆
//(x,y):中心点
//r    :半径
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
{
        int a,b;
        int di;
        a=0;b=r;          
        di=3-(r<<1);             //判断下个点位置的标志
        while(a<=b)
        {
                LCD_DrawPoint(x0+a,y0-b);             //5
                LCD_DrawPoint(x0+b,y0-a);             //0           
                LCD_DrawPoint(x0+b,y0+a);             //4               
                LCD_DrawPoint(x0+a,y0+b);             //6
                LCD_DrawPoint(x0-a,y0+b);             //1      
                LCD_DrawPoint(x0-b,y0+a);            
                LCD_DrawPoint(x0-a,y0-b);             //2            
                  LCD_DrawPoint(x0-b,y0-a);             //7                     
                a++;
                //使用Bresenham算法画圆     
                if(di<0)di +=4*a+6;          
                else
                {
                        di+=10+4*(a-b);   
                        b--;
                }                                                     
        }
}                

使用特权

评论回复
39
hanzhen654|  楼主 | 2018-8-31 23:53 | 只看该作者
//m^n函数
//返回值:m^n次方.
u32 LCD_Pow(u8 m,u8 n)
{
        u32 result=1;         
        while(n--)result*=m;   
        return result;
}                         
//显示数字,高位为0,则不显示
//x,y :起点坐标         
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);         
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{                
        u8 t,temp;
        u8 enshow=0;                                                  
        for(t=0;t<len;t++)
        {
                temp=(num/LCD_Pow(10,len-t-1))%10;
                if(enshow==0&&t<(len-1))
                {
                        if(temp==0)
                        {
                                LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
                                continue;
                        }else enshow=1;
                          
                }
                 LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
        }
}

使用特权

评论回复
40
hanzhen654|  楼主 | 2018-8-31 23:54 | 只看该作者
//显示数字,高位为0,还是显示
//x,y:起点坐标
//num:数值(0~999999999);         
//len:长度(即要显示的位数)
//size:字体大小
//mode:
//[7]:0,不填充;1,填充0.
//[6:1]:保留
//[0]:0,非叠加显示;1,叠加显示.
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
{  
        u8 t,temp;
        u8 enshow=0;                                                  
        for(t=0;t<len;t++)
        {
                temp=(num/LCD_Pow(10,len-t-1))%10;
                if(enshow==0&&t<(len-1))
                {
                        if(temp==0)
                        {
                                if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,'0',size,mode&0X01);  
                                else LCD_ShowChar(x+(size/2)*t,y,' ',size,mode&0X01);  
                                continue;
                        }else enshow=1;
                          
                }
                 LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode&0X01);
        }
}

使用特权

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

本版积分规则