OpenEdv-开源电子网

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

新手请教,i.mx6ull怎么使用LCD

[复制链接]

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-2-25
在线时间
52 小时
发表于 2020-5-27 23:58:34 | 显示全部楼层 |阅读模式
10金钱
怎么在屏幕上输出字符或是画图阿?STM32有一堆函数可以直接用,比如:
void LCD_Init(void);                                                                                                                   //初始化
void LCD_Clear(u16 Color);                                                                                                         //清屏
void LCD_SetCursor(u16 Xpos, u16 Ypos);                                                                                //设置光标
void LCD_DrawPoint(u16 x,u16 y);                                                                                        //画点
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color);                                                                //快速画点
u16  LCD_ReadPoint(u16 x,u16 y);                                                                                         //读点
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);                                                                         //画圆
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);                                                        //画线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);                                                   //画矩形
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);                                                   //填充单色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color);                                //填充指定颜色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);                                                //显示一个字符
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);                                                  //显示一个数字
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);                                //显示 数字
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);                //显示一个字符串,12/16字体


但是i.mx6ull的LCD驱动在内核编译的时候就确定了。我想像stm32那样操作屏幕该怎么弄?刚从stm32转过来,不太适应。我百度了一下,好像要操作什么frambuffer?

比如,我想在屏幕上清屏然后输出一行”Hello",然后画个颜色块什么的这些最基本的。再复杂点,显示一张小图片(保存为.h文件,直接画点)。

最佳答案

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

https://blog.csdn.net/qq_40215005/article/details/96169773 自己记录一下,方便有相同问题的人查看。亲手测试过,可以显示图片(程序仅参考)。 #include #include #include #include #include #include #define FB_DEVICE_NAME "/dev/fb0" #define RED_COLOR565 0X0F100 #define GREEN_COLOR565 0X007E0 #define BLUE_COLOR565 0X0001F #define White_COLOR565 0xFFFFF #define BLACK_COLOR 0x0 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-2-25
在线时间
52 小时
 楼主| 发表于 2020-5-27 23:58:35 | 显示全部楼层
https://blog.csdn.net/qq_40215005/article/details/96169773
自己记录一下,方便有相同问题的人查看。亲手测试过,可以显示图片(程序仅参考)。

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <stdlib.h>

#include <sys/mman.h>
#define FB_DEVICE_NAME "/dev/fb0"
#define RED_COLOR565         0X0F100
#define GREEN_COLOR565        0X007E0
#define BLUE_COLOR565        0X0001F
#define White_COLOR565         0xFFFFF
#define BLACK_COLOR                        0x0

void delay(int a)
{
        int k;

        for(k=0;k<a;k++);
}

typedef struct fb_dev{
        int fd;                                        /*帧缓冲设备硬件描述符 */
        void *pfb;                                 /*指向帧缓冲映射到用户空间的首地址 */
        int xres;                                 /*一帧图像的宽度 */
        int yres;                                /*一帧图像的高度 */
        int size;                                /*一帧图像的大小 */
        int bits_per_pixel;                /*每个像素的大小 */
} fb_dev_t;

int fb_open(fb_dev_t *fbd, char *fbn)        //打开操作(由于帧缓冲是字符设备,应用程序需按文件打开一个帧缓冲设备。打开成功则可以对帧缓冲设备进行读、写等操作
{
        struct fb_var_screeninfo vinfo;                //(struct fb_info结构体的成员)当前缓冲区的可变参数,也就是当前的视屏信息

        if((fbd->fd = open(fbn, O_RDWR)) == -1)        //判断是否打开framebuffer
        {
                printf("Error: Cannot open framebuffer device.\n");
                exit(1);
        }
        ioctl(fbd->fd, FBIOGET_VSCREENINFO, &vinfo);        //ioctl()函数可读取/设置显示设备以及屏幕的参数。如分辨率、显示颜色、屏幕大小等。ioctl()函数是由底层的驱动程序完成的。
        fbd->xres = vinfo.xres;                                                        //屏幕x轴
        fbd->yres = vinfo.yres;                                                         //屏幕y轴
        fbd->bits_per_pixel = vinfo.bits_per_pixel;         //每个像素点占用多少个字节。
        fbd->size = fbd->xres * fbd->yres * 2;//fbd->bits_per_pixel; //计算一帧图像的大小
        printf("%d * %d,%d bits_per_pixel,screensize = %d.\n",fbd->xres,fbd->yres,fbd->bits_per_pixel,fbd->size);
        fbd->pfb = mmap(NULL, fbd->size, PROT_READ | PROT_WRITE, MAP_SHARED, fbd->fd, 0); //mmap函数执行帧缓冲设备具体的内存映射。将文件内容映射到一段内存中,准确的说是虚拟内存,通过对内存的读取和修改。?

        if((int)fbd->pfb == -1)        //判断是否映射成功,失败打印错误信息。
        {
                printf("Error: Failed to map frambuffer device to memory!\n");
                exit(2);
        }
        return 0;
}

int fb_close(fb_dev_t *fbd)                //关闭设备文件
{
        munmap(fbd->pfb,fbd->size);         //解除映射
        close(fbd->fd);
}

int fb_drawrect(fb_dev_t *fbd, int x0, int y0, int w, int h, int color) //画图像到屏幕上。
{
        int x,y;

        for(y=y0; y<y0+h; y++)
        {
                for(x=x0; x<x0+w; x++)
                {
                        *((short *)(fbd->pfb) + y*fbd->xres +x) = color;        //计算一个像素的位置
                }
        }
        return 0;
}


int main(int argc, char **argv)
{
        fb_dev_t *fbd;

        fbd = (fb_dev_t *)malloc(sizeof(fb_dev_t));        //为设备文件分配内存

        fb_open(fbd, FB_DEVICE_NAME);         // 打开帧缓冲设备文件(帧缓冲设备对应的设备文件为/dev/fb*)这里应该加一句,判断一下打开帧缓冲设备是否成功。

        if(fbd->bits_per_pixel == 16)       
        {
                /*while(fbd->bits_per_pixel == 16)*/
               
                printf("Red/Green/Blue/Black Screen!\n");                // 输出屏幕将要显示的颜色
                fb_drawrect(fbd, 0, 0, fbd->xres, fbd->yres/4, RED_COLOR565);        //屏幕颜色显示,将屏幕分割为4个
                fb_drawrect(fbd, 0, fbd->yres/4, fbd->xres, fbd->yres/4,White_COLOR565);
                fb_drawrect(fbd, 0, fbd->yres*2/4, fbd->xres, fbd->yres/4,BLUE_COLOR565);
                fb_drawrect(fbd, 0, fbd->yres*3/4, fbd->xres, fbd->yres/4,BLACK_COLOR);

        }
        else
                printf("16 bits only!");
        fb_close(fbd);
        return 0;
}
回复

使用道具 举报

26

主题

1538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6379
金钱
6379
注册时间
2015-8-25
在线时间
1004 小时
发表于 2020-5-28 08:58:18 | 显示全部楼层
可以直接在应用层用QT实现
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-2-25
在线时间
52 小时
 楼主| 发表于 2020-5-28 16:10:17 | 显示全部楼层
szczyb1314 发表于 2020-5-28 08:58
可以直接在应用层用QT实现

还不会QT呢。只是刚开始学,想在Linux下面写APP来实现裸机LCD实验那样的功能。
回复

使用道具 举报

0

主题

134

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2020-5-8
在线时间
20 小时
发表于 2020-5-28 18:45:23 | 显示全部楼层
Linux下和单片机下已经不同了,不建议用单片机的思维来学习Linux
可以用QT来实现
先把院子前面的教程啃一遍,啃完了,后面写QT来实现,QT不难的
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-2-25
在线时间
52 小时
 楼主| 发表于 2020-5-29 12:07:17 | 显示全部楼层
无忧花开 发表于 2020-5-28 18:45
Linux下和单片机下已经不同了,不建议用单片机的思维来学习Linux
可以用QT来实现
先把院子前面的教程 ...

嗯,从来没研究过QT,只是把例程里的QT跑了一遍,环境已经搭好了,编译也OK。
是不是玩Linux基本都要跑QT?做图形界面。很少有直接写APP来操作LCD了。看来还得研究下QT。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-2-27 01:02:39 | 显示全部楼层
fcatman 发表于 2021-2-26 16:16
https://blog.csdn.net/qq_40215005/article/details/96169773
自己记录一下,方便有相同问题的人查看。亲 ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 22:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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