导航:首页 > 编程语言 > lcd驱动编程

lcd驱动编程

发布时间:2022-10-24 23:52:59

❶ (C语言问题)LCD驱动舍弃RGB位数的编程问题

主要是一个位的移位转换问题。
举个例子:一个24位颜色RGB(0x50,0x60,0x70)转换为565的16位:
r = R & 0xF8 = (01010000 & 11111000) = 01010000(前5位有效)
g = G & 0xFC = (01100000 & 11111100) = 01100000(前6位有效)
b = B & 0xF8 = (01110000 & 11111000) = 01110000(前5位有效)
color是16位的short int类型,高8位由r的5位和g的前3位组合而成。
high就可以写成这样:high = r | (g<<5)?应该是high = r | (g>>5)吧
high = r | (g>>5) = 01010000 | (01100000>>5) = 01010000 | 00000011 = 01010011
low = (g<<3) | (b>>3) = (01100000<<3) | (01110000>>3) = 0000000 | 0001110 = 00001110
所有把低位和高位合起来就是color=(high << 8) | low=(00000000 01010011<<8) | (00000000 00001110) = (01010011 000000000)|(00000000 00001110) = 01010011 00001110 = 01010 011000 01110(565) (这个结果就是取r的前5位,g的前6位,b的前5位)

在microwindow中888向565转换的宏定义如下:更好理解一些
/* create 16 bit 5/6/5 format pixel from RGB colorval (0x00BBGGRR)*/*///c是一个unsigned long型值,0x00BBGGRR
/* In this format, alpha is ignored. #define COLOR2PIXEL565(c) \
((((c) & 0xf8) << 8) | (((c) & 0xfc00) >> 5) | (((c) & 0xf80000) >> 19))

❷ LCD驱动程序问题

1.清屏 。
参数设置 RS、RW清零 对使能脚E触发(负缘触发)
并将00000001添入D7~D0
下面是个清屏程序
MOV p1,#01H ;清屏
CALL ENABLE
ENABLE:
CLR RS
CLR RW
CLR E
CALL DELAY
SETB E
RET
2.全显
添对每行地址即可
参考程序
RS EQU P3.2 ;液晶接口的定义
RW EQU P3.1
E EQU P3.0
;==========================================================
ORG 0000h
MOV SP ,#70H ;设置堆栈
MOV p1,#08h
CALL ENABLE
MOV p1,#01H ;清屏
CALL ENABLE
MOV p1,#38H ;显示功能
CALL ENABLE
MOV p1,#0FH ;显示开关控制
CALL ENABLE
MOV p1,#06H ;+1
CALL ENABLE
;=========frist line=======================================
LOOP: MOV p1,#80H ;第一行的开始位置
cALL ENABLE
MOV DPTR,#TABLE1 ;显示
MOV R0,#16
CALL WRITE1 ;到TABLE1取码?
CALL DELAY1
;===========second line====================================
MOV p1,#0C0H ;第二行的位置
CALL ENABLE
MOV DPTR,#TABLE2 ;显示
MOV R0,#16
CALL WRITE1 ;到TABLE2 取码
CALL DELAY1
;============thrid line=====================================
MOV p1,#94H ;第三行的位置
CALL ENABLE
MOV DPTR,#TABLE3 ;显示
MOV R0,#16
CALL WRITE1 ;到TABLE3 取码
CALL DELAY1
;=============fourth line===================================
MOV p1,#0D4H ;第四行的位置
CALL ENABLE
MOV DPTR,#TABLE4 ;显示
MOV R0,#16
CALL WRITE1 ;到TABLE4 取码
CALL DELAY1
;=============cursor========================================
MOV p1,#80H ;光标定位0C0H
CALL ENABLE
CALL DELAY1
JMP LOOP
;===========================================================
ENABLE:
CLR RS ;送命令
CLR RW
CLR E
CALL DELAY
SETB E
RET
;====================write====================================
WRITE1: MOV R1,#00H ;显示table中的值
A1: MOV A,R1 ;到table取码
MOVC A,@A+DPTR
call WRITE2 ;显示到lcd
INC R1
CJNE A,#00H,A1 ;是否到00h
RET
WRITE2:
MOV p1,A ;显示
SETB RS
CLR RW
CLR E
CALL DELAY
SETB E
RET
;==================delay 2.5ms=================================
DELAY: MOV R3,#05
D1: MOV R4,#0FAH
DJNZ R4,$
DJNZ R3,D1
RET
;==================delay 2s=====================================
DELAY1: MOV R7,#14H
D10: MOV R6,#0CBH
D11: MOV R5,#0FAH
DJNZ R5,$
DJNZ R6,D11
DJNZ R7,D10
RET
table1: db" CHINA--SHEN ZHEN ",00H
table2: db" SHOU HUA DIAN ZI ",00H
table3: db" ABCDEFGHIJKLMNOP ",00H
table4: db" 0123456789ABCDEF ",00H
table5: db" ",00H
end

❸ lcd 1602驱动程序怎么写

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^1;
sbit RW = P2^2;
sbit E = P2^3;
uchar idata wlcome[16]={"asdfghjklpoiuytr"};
uchar idata lcdtimer[16]={"qwertyuioplkjhgf"};
void delayus(uint a)//微秒延时//
{
while(a--);
}
void delay(uint dell)//毫秒延时//
{
uchar x;
for(dell;dell>0;dell--)
for(x=110;x>0;x--);
}
void wr_com(uchar temp)//写指令//0
{
RS=0;
RW=0;
P0=temp;
E=1;
E=0;
}
void wr_data(uchar num)//写数据//
{
RS=1;
RW=0;
P0=num;
E=1;
E=0;
}
void disp_lcd(uchar addr,uchar *templ)
{
uchar i;
wr_com(addr);
delay(50);
for(i=0;i<16;i++)
{
wr_data(templ[i]);
delay(50);
}
}
void lcd_init()//初始化液晶//
{
wr_com(0x30);
delay(50);
wr_com(0x38);
delay(50);
wr_com(0x01);
delay(50);
wr_com(0x06);
delay(50);
wr_com(0x0c);
delay(50);
}
void main()
{
lcd_init();
while(1)
{
disp_lcd(0x80,wlcome);
disp_lcd(0xc0,lcdtimer);
}

}

❹ 6. linux-LCD 驱动程序概述

入局:应用程序是如何操控LCD显示器的?
      我们知道应用程序的调用接口,无非 open/read/write ...然后通过驱动程序最终作用到硬件设备上。以字符设备为例,对于驱动的开发者,实现了应用程序调用的驱动层中与之相匹配的 drv_open/drv_read/drv_write 函数,为应用层序提供了操作实际硬件设备的通道。那么,对于LCD驱动程序又是如何?先来了解下两个非常重要的概念。

      LCD控制器的功能是控制驱动信号,进而驱动LCD。用户只需要通过读写一系列的寄存器,完成配置和显示驱动。在驱动LCD设计的过程中首要的是配置LCD控制器,而在配置LCD控制器中最重要的一步则是帧缓冲区(Frame Buffer)的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上的。帧缓冲区的大小由屏幕的分辨率和显示色彩数决定。驱动帧缓冲的实现是整个驱动开发过程的重点。
      帧缓冲区是出现在Linux 2.2.xx及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备区。帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。这样软件无须了解任何涉及硬件底层驱动的东西(如硬件寄存器)。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和I/O控制等操作。通过专门的设备节点可对该设备进行访问,如/dev/fb*。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以进行读写操作,而读写操作可以反映到LCD。

      帧缓冲(Frame Buffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Frame Buffer设备驱动来完成的。帧缓冲设备属于字符设备。
      Linux系统Frame Buffer本质上只是提供了对图形设备的硬件抽象,在开发者看来,Frame Buffer是一块显示缓存,向显示缓存中写入特定格式的数据就意味着向屏幕输出内容。

由于有了frambuffer的抽象,使得应用程序通过定义好的接口就可以访问硬件。所以应用程序不需要考虑底层的(寄存器级)的操作。应用程序对设备文件的访问一般在/dev目录,如 /dev/fb*。

内核中的frambuffer在: drivers/video/fbmem.c (fb: frame buffer)

(1) 创建字符设备"fb", FB_MAJOR=29,主设备号为29。
(2)创建类,但并没有创建设备节点,因为需要注册了LCD驱动后,才会有设备节点;

2.1 fb_open函数如下:

(1) registered_fb[fbidx] 这个数组也是fb_info结构体,其中fbidx等于次设备号id,显然这个数组就是保存我们各个lcd驱动的信息;

2.2 fb_read函数如下:

从.open和.read函数中可以发现,都依赖于fb_info帧缓冲信息结构体,它从registered_fb[fbidx]数组中得到,这个数组保存我们各个lcd驱动的信息。由此可见,fbmem.c提供的都是些抽象出来的东西,最终都得依赖registered_fb这个数组。

这个register_framebuffer()除了注册fb_info,还创建了设备节点。

以s3c2410fb.c为例,分析驱动的实现。

既然是总线设备驱动模型,那我们关心的是它的probe函数。

看到这里驱动的写法也大致清晰:



附:
LCD的显示过程与时序:
      1.显示从屏幕左上角第一行的第一个点开始,一个点一个点地在LCD上显示,点与点之间的时间间隔为VCLK(像素时钟信号);当显示到屏幕的最右边就结束这一行(Line),这一行的显示对应时序图上的HSYNC(水平同步信号)
      2. 接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。
      3. 以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成,这一帧的显示时间在时序图上表示为VSYNC(垂直同步信号)。

参考:
https://sites.google.com/a/hongdy.org/www/linux/kernel/lcddriver

❺ 段码LCD液晶屏应该怎么驱动

大家平常在生活之中见到最多的可能就是段码液晶屏了,它有着普通数码管的特征,又有着点阵液晶屏的特征,已经固定的图形,既省成本而且又好看,那么,我们今天来一起试一试!
首先,大家都不要以为使用单片机来驱动,就以为是断码屏直流驱动的了,其实呢,段码屏它是交流驱动的,什么是交流驱动呢?例如矩形波、正弦波等等。大家可能会经常的使用驱动芯片来玩,例如HT1621等等,但是有一些段式屏的IO口是比较少的,或者说是IO口充足的情况之下,也懒得在再去写控制器的驱动了。但是,IO的模拟驱动,段式液晶是有一个前提条件的,就是IO必须要是三态,
为什么?下面我们就一起细细的道来:
第一步:段码液晶屏最重要的参数:占空比、工作电压、偏压比。这三个参数都是非常重要的,都必须要满足。
第二步:驱动的方式:我们根据 LCD 的驱动原理可以知道,LCD的像素点上面只能够加上 AC的电压,LCD显示器的对比度则是由 COM脚上的电压值减去 SEG 脚上的电压值来决定,当这个电压差在大于 LCD 饱和电压时就能够打开像素点,小于 LCD 阈值电压时就能关闭像素点了,LCD 型的MCU 已经由内建的 LCD 驱动电路自动产生出LCD驱动信号了,因此只需要 I/O 口能仿真输出该驱动的信号,就能够完成 LCD 的驱动了。
段码液晶屏主要是有两种引脚,COM和SEG,和数码管比较像,但是,压差必须要是交替变化的,例:第一时刻是正向的3V,那么第二时刻就必须要是反向的3V,注意一点,如果你给段码液晶屏通直流电,那么不用多久这个屏幕就会报废,所以千万要注意。下面我们就来考虑如何模拟COM口的波形,我们以1/4D,1/2B为例子:
段码LCD屏的驱动方法
只要模拟出以上的波形,你的液晶屏就已经成功了一大半。
void display_sub(u8 y) //lcd display subroutine
{
switch(y) //4*com,VDD and -VDD LCD display,so 8 timebase interrupt one sacn period
{
case 1:
{com1_output_high();break;}
case 2:
{com1_output_low();break;}
case 3:
{com2_output_high();break;}
case 4:
{com2_output_low();break;}
case 5:
{com3_output_high();break;}
case 6:
{com3_output_low();break;}
case 7:
{com4_output_high();break;}
case 8:
{com4_output_low();break;}
default:
{LCDPluseStep=0;
get_display_code(AD_Value,KeyScanRetVal);
break;}
}
}
复制代码
如上图代码所示,定时到2ms,让4个COM交替的输出波形就可以了。
文章转载于LCD液晶屏:http://www.hzjingxian.com,转载请注明出处
同时我们还要注意,在COM的输出较高的时候,如果要屏幕亮,那么SEG就要输出低,那么在COM输出低的时候,SEG就要输出高了,保证COM和SEG的压差大于1/2B工作电压就可以正常显示了
下面我们看其中一个com口输出时的函数
static void seg1_output(void) //seg1 output subroutine
{
if(1 == (LCDPluseStep%2)) //com_pulse is odd,com output high (VDD)
{
if(0 == (DisplayCode1&0x10))
{SEG1=1;}
else
{SEG1=0;}
}
else //com_pulse is even,com output low (VSS)
{
if(0 == (DisplayCode1&0x10))
{SEG1=0;}
else
{SEG1=1;}
}
}
复制代码
必须时刻让SEG电平跟COM的电平成反向,那么驱动段式液晶就不会有多大的难度了
段码液晶屏:http://www.hzjingxian.com
文章原创于http://www.hzjingxian.com/zixun/xydt/822.html,转载请注明出处

❻ LCD 段式液晶 驱动编程

从上图 可以看出 这个段码LCD 是一个4路驱动的 也就是有4个COM
LCD驱动分为静态驱动和动态驱动 静态驱动类似于LED的驱动 也就是说有一个COM(公共端)
共阴极或者共阳极 而动态驱动是类似于扫描一个横竖的矩阵 就拿上图为例 这就一个8X4的矩阵
从5到12 一共是8段SEG COM1-COM4是4段COM 如果想点亮其中的一端 就要选中对应的COM
和SEG 举例 比如像让P2这一端亮 我们要给COM2和6赋1 其他段也是一样的
这种段码的LCD 一般都用HT1621 详细的操作方法 可以看下数据手册 按照典型电路连接就可以了
程序主要是初始化和送数函数

ID就是企鹅 可以一起讨论

❼ 本人初次使用HT1621B驱动4位8段LCD,请问高手用单片机怎样控制其中的D0~D3,A0~A5各表示意思谢谢

D0-D3是显示数据,1显示0不显示,A0-A5是芯片内置的RAM地址。

1621B最多带32SEGx4COM,128段。显示数据与显示内容是这样对应的:一个8位二进制数对应2根SEG线上的8个段码,1为显示,0不显。

例如seg0上的内容是ABCD四个段码,SEG1上的内容是EFGH四个段码,背电极COM上,C0连AE2个段码,C1连BF,C2连CG,C3连DH,按此显示逻辑输入“01100011”时,高4位对应SEG1,低4位对应SEG0,将同时显示FGAB四个段码。

(7)lcd驱动编程扩展阅读:

主要特点编辑

1、工作电压2.4~ 5.2V。

2、内嵌256KHz RC 振荡器。

3、可外接32KHz晶片或256KHz频率源输入。

4、 可选1/2或1/3偏压和1/2 1/3 或1/4 的占空比。

5、片内时基频率源。

6、 蜂鸣器可选择两种频率。

7、节电命令可用于减少功耗。

8、内嵌时基发生器和看门狗定时器WDT。

9、 时基或看门狗定时器溢出输出。

10、 八个时基/看门狗定时器时钟源。

11、 一个32*4 的LCD驱动器。

12、 一个内嵌的32*4 位显示RAM 内存。

13、 四线串行接口。

14、 片内LCD 驱动频率源。

15、软件配置特征。

16、 数据模式和命令模式指令。

17、 三种数据访问模式。

18、提供VLCD管脚用于调整LCD操作电压。

❽ uCLinux下LCD驱动程序的编写方法

如果是写驱动程序的话,不同的LCD,驱动方式是不一样的,这里找答案太渺茫了。
你可以自己谷歌一下,看看有没有现成的,这种东西只能自己编。
先学会linux下对lcd的结构,然后再看懂LCD硬件sheet资料,再开始编程吧。

❾ 段码LCD液晶屏应该怎么驱动

段码LCD液晶屏的驱动电压一般为3-5V,段码屏是微功耗产品,电流为10微安左右。

线路图可以参考HT1621B

线路图仅供参考

❿ 单片机编程,写LCD驱动的时候,为什么要假读比如LCD12864或者LCD1602,假读的意义是什么

在给LCD1602写命令字或数据时,要先查询一下,液晶屏是否忙,这时要读其状态位D7,来判断是否忙状态。虽然只要判断一位,但也要读出8位数据来。但这也不叫什么假读的,是真的读的。
看哪有“假读”这一词的?真能发明,又发明假读一词来了。
至于LCD12864,更没有假读一说了。

阅读全文

与lcd驱动编程相关的资料

热点内容
文件系统pdf 浏览:762
原神安卓区服什么意思 浏览:34
贝壳app怎么线上发布 浏览:157
如何挑选安卓系统机顶盒 浏览:53
安卓快充使用有什么注意事项 浏览:909
黑马程序员的云计算网课 浏览:946
endnotestyle文件夹怎么导入 浏览:460
讲解少儿编程演讲会开头 浏览:424
思科交换机基础命令 浏览:497
便签可以设置加密吗 浏览:339
免费漫画app怎么看书 浏览:27
华为笔记本电脑怎么安装抖音app 浏览:412
阿里云国际版试用的服务器怎么搞 浏览:895
java正则表达式工具 浏览:160
oa服务器怎么设置ftp 浏览:10
安卓如何安装obb 浏览:442
QQ聊天记录journal文件夹 浏览:118
苹果公司云服务器地址 浏览:85
加密记事本手机 浏览:437
汽车压缩机变频阀 浏览:95