OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3141|回复: 1

关于LCD读取数据函数的问题

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2018-8-8
在线时间
18 小时
发表于 2018-9-3 20:08:50 | 显示全部楼层 |阅读模式
5金钱
下面两个函数要读取数据,在把PB口设置成上拉输入后,然后ODR 寄存器输出,一个是高电平,一个是低电平。(蓝色字体那两行)
问题1:不是要读取数据吗,为什么还要输出电平?
问题2:是根据什么来判断要输出高电平还是低电平?


//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{                                                                                  
        u16 t;
        GPIOB->CRL=0X88888888; //PB0-7  上拉输入
        GPIOB->CRH=0X88888888; //PB8-15 上拉输入
        GPIOB->ODR=0X0000;     //全部输出0

        LCD_RS_SET;
        LCD_CS_CLR;
        //读取数据(读寄存器时,并不需要读2次)
        LCD_RD_CLR;
        if(lcddev.id==0X8989)delay_us(2);//FOR 8989,延时2us                                          
        t=DATAIN;  
        LCD_RD_SET;
        LCD_CS_SET;

        GPIOB->CRL=0X33333333; //PB0-7  上拉输出
        GPIOB->CRH=0X33333333; //PB8-15 上拉输出
        GPIOB->ODR=0XFFFF;    //全部输出高
        return t;  
}


//读取个某点的颜色值         
//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
}                 

最佳答案

查看完整内容[请看2#楼]

1. 上下拉输出的时候, ODR代表上拉(1), 或下拉(0). 参考Reference Manual, 或教程. 2. 上下拉方向看您的应用, 您希望在对方没有输出时要得到1, 就上拉, 相反的想要得到0, 就下拉.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-9-3 20:08:51 | 显示全部楼层
1. 上下拉输出的时候, ODR代表上拉(1), 或下拉(0). 参考Reference Manual, 或教程.
2. 上下拉方向看您的应用, 您希望在对方没有输出时要得到1, 就上拉, 相反的想要得到0, 就下拉.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 03:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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