單片機模擬 1/2 Bias、1/4 Duty的 LCD 驅動使用方法

工做原理

方式一 
    根據 LCD 的驅動原理可知,LCD 像素點上只能加上 AC 電壓,LCD 顯示器的對比度由 COM腳上的電壓值減去 SEG 腳上的電壓值決定,當這個電壓差大於 LCD 的飽和電壓就能打開像素點,小於 LCD 閾值電壓就能關閉像素點,LCD 型 MCU 已經由內建的 LCD 驅動電路自動產生 LCD 驅動信號,所以只要 I/O 口能仿真輸出該驅動信號,就能完成 LCD 的驅動。 因爲LCD工做的最佳帖頻率一般在25Hz~250Hz,通常設置刷新頻率在 60Hz左右便可
如今考慮如何模擬出 COM 的波形
1/2 Bias 下 COM0~COM3 的 LCD 驅動波形以下: 


    能夠看出 4個COM 的輸出,經過配置 IO口爲高阻便可使其輸出 VDD/2 電位,配置 IO爲推輓輸出便可輸出高低電平。
    所以在一個 COM 週期內,只要每隔一段時間設置 COM0~COM3 輸出對應的電壓便可獲得 COM0~COM3 的波形。具體來講就是第一次 Time Base 中斷時設置 COM0 輸出VDD,其它 COM 輸出 VDD/2;第二次 Time Base 中斷時設置 COM0 輸出 VSS,COM1~COM3輸出 VDD/2,第三次 Time Base 中斷時設置 COM1 輸出 VDD,其它 COM 輸出 VDD/2;第四次 Time Base 中斷時設置 COM1 輸出 VSS,其它 COM 輸出 VDD/2;……;第八次中斷時設置 COM3 輸出 VSS,其它 COM 輸出 VDD/2。 



由於點亮 LCD 像素點須要 COM 與 SEG 有大於飽和電壓的電壓差,也就是 COM 與 SEG 有+VDD 或者-VDD 的電壓差,因此要點亮某個像素點,只要將對應的 SEG 輸出與 COM 相反的電壓便可。好比,當 COM0=VDD,只要 SEG=VSS 就可點亮對應像素點,當 COM0=VSS,只要 SEG=VDD 就可點亮對應像素點。考慮到 LCD 像素點點亮時先加+VDD 再加-VDD 可延長 LCD 的使用壽命,所以這裏同一像素點也採用兩次點亮的方式。


方式二
    由上面所述咱們知道,只要 COM、SEG 的電壓差爲+VDD 或者-VDD 就能夠點亮對應的 LCD筆段即像素點,所以,咱們也能夠不用模擬 COM 的 Timing 便可完成 LCD 的正常驅動。具體實現步驟以下: 
? 第一次中斷時設置 COM0 輸出 High,其它 COM 輸出 VDD/2,再根據要顯示的數據設置各個 SEG 的輸出 
? 第二次中斷時設置 COM1 輸出 High,其它 COM 輸出 VDD/2,再根據要顯示的數據設置各個 SEG 的輸出 
? 第三次中斷時設置 COM2 輸出 High,其它 COM 輸出 VDD/2,再根據要顯示的數據設置各個 SEG 的輸出 
? 第四次中斷時設置 COM3 輸出 High,其它 COM 輸出 VDD/2,再次根據要顯示的數據設置各個 SEG 的輸出 
? 第五次中斷時設置 COM0 輸出 Low,其它 COM 輸出 VDD/2,再根據要顯示的數據設置各個 SEG 的輸出 
? 第六次中斷、第七次中斷、第八次中斷參考上面的方法依次設置 COM一、COM二、COM3輸出 Low 並設置要顯示的數據 
? 循環進行以上的 8 次循環設置便可完成 LCD 的驅動 這種方式下 COM0~COM3 的 Timing 以下: 

    對比以上兩種方法能夠發現,COM 口的掃描頻率也就是帖頻率並無改變,然而從佔用的資源上來講,第二種方式比第一種方式會佔用更少的 ROM 空間。



應用電路




能夠根據實際使用狀況取捨 COM 和增減 SEG,好比 LCD 能夠是 1/2 Duty,那麼只須要保留兩個 COM 便可,SEG 一樣能夠參照範例程序擴展。 
根據上述說明,分 8 次依次設置 COM0~COM3 的輸出,SEG 是輸出 VDD 仍是輸出 VSS 須要根據要顯示的數字判斷,使用第一種驅動方式時 I/O 詳細電位設置請參考下表:



<ignore_js_op> 

這裏也能夠採用掃描的方式




結論
    本範例驅動 4×8 LCD 顯示正常,用戶只須要稍加改造便可套用到所選用的 1/2 Bias 規格的LCD 上。 



我使用的是第一種掃描方式,大體流程圖以下,其中有些地方對的不怎麼齊


post

 
void LCD_Control(void)
{
        static unsigned char state = 0;
    
    if(!Back_Light_Is_Open)                // 背光檢測
    {
        P1CFG1 = _b01101010;        // 配置COM1,COM2,COM3爲高阻
        P3CFG0 = _b01010110;        // 配置COM4爲高阻
        
        return;
    }
    
    LCD_BACK_LIGHT_CONTROL();        // 背光控制
    
    Refresh_Wrod();         // 刷新字幕
    Refresh_Light_Flash();  // 刷新燈光動畫
    Refresh_Fan_Flash();    // 刷新風扇動畫
    Refresh_UV_Lamp_Flash();// 刷新消毒動畫
    Refresh_Down_Flash();   // 刷新降低動畫
    Refresh_Up_Flash();     // 刷新上升動畫
    
        switch(state)
        {   // 01強推,10高阻
                case 0:                // 掃描 COM1
                {
                        COM_L(1);
                        P1CFG1 = _b01100110;        // 配置COM1爲強推,COM2,COM3爲高阻
                        P3CFG0 = _b01010110;        // 配置COM4爲高阻
            
                        COM1_SEG_SET();
                        state = 1;
                }break;
                case 1:                // 掃描 COM1
                {
                        COM_H(1);
            
            COM1_SEG_SET_NOT();
            
                        state = 2;
                }break;
                case 2:                // 掃描 COM2
                {
            COM_L(2);
                        P1CFG1 = _b01101001;        // 配置COM2爲強推,COM1,COM3爲高阻
                        
                        COM2_SEG_SET();
            
                        state = 3;
                }break;
                case 3:                // 掃描 COM2
                {
            COM_H(2);
                        
                        COM2_SEG_SET_NOT();
            
                        state = 4;
                }break;
        case 4:                // 掃描 COM3
                {
            COM_L(3);
                        P1CFG1 = _b01011010;        // 配置COM3爲強推,COM1,COM2爲高阻
                        
                        COM3_SEG_SET();
            
                        state = 5;
                }break;
                case 5:                // 掃描 COM3
                {
            COM_H(3);
                        
                        COM3_SEG_SET_NOT();
            
                        state = 6;
                }break;
        case 6:                // 掃描 COM4
                {
            COM_L(4);
                        P1CFG1 = _b01101010;        // 配置COM1,COM2,COM3爲高阻
                        P3CFG0 = _b01010101;        // 配置COM4爲強推
                        
                        COM4_SEG_SET();
            
                        state = 7;
                }break;
                case 7:                // 掃描 COM4
                {
            COM_H(4);
                        
                        COM4_SEG_SET_NOT();
            
                        state = 0;
                }break;
        default:
        {
            state = 0;
        }break;
        }
}


代碼中 COM4_SEG_SET_NOT(); 是 COM4_SEG_SET(); IO對應段取反所得

COM_L(4); 拉低 COM4口

其餘相似


這裏說明一點,我是先將 IO口電平輸出再配置功能的,由於在實際操做過程當中會發現從高阻態轉換至強推模式時會有 零點幾微秒的脈衝干擾,具體寬度根據單片機速度來決定。
大概是由於單片機在從強推模式轉換至高阻態時 IO配置雖被改變,但輸出寄存器中的數據還會繼續保持,因此纔會有脈衝干擾的吧,先將 IO口輸出電平改變再將 IO口狀態從高阻切換至強推時就不會有脈衝干擾了

<ignore_js_op> 
這是先配置 IO輸出狀態再修改輸出電平的,後來想了下,寄存器中應該是保存了最後一次 IO輸出的電平,因此從高阻態切換至強推後直接將輸出相應的電平,等到再次配置 IO口輸出的電平時這是纔會改變,因此纔會在開始的時候有一個低脈衝動畫

相關文章
相關標籤/搜索