導航:首頁 > 編程語言 > 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驅動編程相關的資料

熱點內容
加強數字貨幣國際信息編譯能力 瀏覽:584
購買的app會員怎麼退安卓手機 瀏覽:891
程序員的種類及名稱 瀏覽:292
美國程序員薪資 瀏覽:12
黑石通匯證券伺服器什麼時候到期 瀏覽:393
東方財富app里我的關注怎麼看 瀏覽:749
bm3d單反級降噪演算法 瀏覽:457
華為安卓機激活時間怎麼查詢 瀏覽:850
如何用優盤重裝伺服器系統 瀏覽:317
日本結婚三代演算法 瀏覽:920
皓強工具解壓步驟 瀏覽:690
部隊抗洪搶險命令範文 瀏覽:888
歐姆龍plc編程軟體使用教程 瀏覽:594
ai文件pdf 瀏覽:912
騰訊雲伺服器掛載混合雲 瀏覽:758
智能小車用什麼單片機 瀏覽:463
java怎麼給窗口關閉 瀏覽:940
列舉51單片機的定址方式 瀏覽:706
剪輯app怎麼寫長篇文字 瀏覽:400
app專屬流量過月租怎麼不更新 瀏覽:656