zoukankan      html  css  js  c++  java
  • 单片机模拟 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 的输出 
    • 第六次中断、第七次中断、第八次中断参考上面的方法依次设置 COM1、COM2、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 详细电位设置请参考下表:



     

    这里也可以采用扫描的方式




    结论
        本范例驱动 4×8 LCD 显示正常,用户只需要稍加改造即可套用到所选用的 1/2 Bias 规格的LCD 上。 



    我使用的是第一种扫描方式,大致流程图如下,其中有些地方对的不怎么齐



    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口状态从高阻切换至强推时就不会有脉冲干扰了

    先配置 IO状态在进行输出电平的时候
    这是先配置 IO输出状态再修改输出电平的,后来想了下,寄存器中应该是保存了最后一次 IO输出的电平,所以从高阻态切换至强推后直接将输出相应的电平,等到再次配置 IO口输出的电平时这是才会改变,所以才会在开始的时候有一个低脉冲

  • 相关阅读:
    UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)
    UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)
    【Same Tree】cpp
    【Recover Binary Search Tree】cpp
    【Binary Tree Zigzag Level Order Traversal】cpp
    【Binary Tree Level Order Traversal II 】cpp
    【Binary Tree Level Order Traversal】cpp
    【Binary Tree Post order Traversal】cpp
    【Binary Tree Inorder Traversal】cpp
    【Binary Tree Preorder Traversal】cpp
  • 原文地址:https://www.cnblogs.com/alanfeng/p/4990594.html
Copyright © 2011-2022 走看看