工作原理

方式一 
    根据 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 详细电位设置请参考下表:



<ignore_js_op> 

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




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

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

posted @ 2016-02-24 15:58 莫回头 阅读(5242) 评论(0) 推荐(0) 编辑
摘要: http://blog.csdn.net/zuosifengli/article/details/7398661Android 中多点触摸协议: 参考: http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt1, ... 阅读全文
posted @ 2015-05-17 22:33 莫回头 阅读(607) 评论(0) 推荐(0) 编辑
摘要: 工具》导入和导出设置>重置所有设置>否,仅重置,从而改写我的当前设置>下一步选择VisualC++默认设置。完成。 阅读全文
posted @ 2014-11-17 09:30 莫回头 阅读(1120) 评论(0) 推荐(0) 编辑
摘要: 关于异形焊盘的创建,可参看下面的半圆PAD的制作:1.新建一个PCB文件,然后在里面画一个半圆的Arc,即Place放置(P)》Arc,并且要将其开口处 封闭,即可用Place 放置(P)》Line走线(L)封闭.2.选中整个半圆区域,而后执行Tools工具(T)》Convert转换(V)》Crea... 阅读全文
posted @ 2014-11-11 11:35 莫回头 阅读(1933) 评论(0) 推荐(0) 编辑
摘要: 我也遇到了同样的问题.搞了很久,按下面的操解决了内容转至:http://bbs.zlgmcu.com/dv_rss.asp?s=xh&boardid=43&id=23032&page=1更新了MDK4.6之后的版本后TKStudio无法编译链接的解决办法测试版本MDK4.7,TKStudio 4.6... 阅读全文
posted @ 2014-10-16 11:36 莫回头 阅读(2496) 评论(0) 推荐(0) 编辑
摘要: 1 Cortex-M3/4的Fault简介 Cortex-M3/4的Fault异常是由于非法的存储器访问(比如访问0地址、写只读存储位置等)和非法的程序行为(比如除以0等)等造成的。常见的4种异常及产生异常的情况如下:Bus Fault:在fetch指令、数据读写、fetch中断向量或中断时存... 阅读全文
posted @ 2014-09-16 09:46 莫回头 阅读(1615) 评论(0) 推荐(0) 编辑
摘要: 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序。原理:先要把整页FLASH的内容搬到RAM中,然后在RAM中改动,然后擦除整页FLASH,再把改动后的内容写入原Flash页。下面程序调试通过。/... 阅读全文
posted @ 2014-06-30 09:38 莫回头 阅读(993) 评论(0) 推荐(0) 编辑
摘要: 如果你不是百万富翁,买房也是刚需,那么你需要注意最佳出手的买房信号,地产中国网小编为你介绍七个最佳买房时机。第一个最佳出手买房的信号:媒体上或生活中发现有房企破产、倒闭,合并重组出现的报道,或有房企老板(非中介公司)逃跑或跳楼,员工集体要工资的新闻出现时。市民可等2-3个月再出手。第二个最佳出手买房... 阅读全文
posted @ 2014-04-19 09:48 莫回头 阅读(248) 评论(0) 推荐(0) 编辑
摘要: -e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L filename 如果 filename为符号链接,则为真-r filename 如果 filename可读,则为真 -w filename 如果 filename可写,则为真 -x filename 如果 filename可执行,则为真-s filename 如果文件长度不为0,则为真-h filename 如果文件是软链接,则为真filename1 -nt filename2 如果 filename1比 阅读全文
posted @ 2014-03-26 10:29 莫回头 阅读(1876) 评论(0) 推荐(0) 编辑
摘要: 生活理财起初最常见的方式就是强迫自己每天存一笔钱到存钱筒里,而这个存钱筒最好是透明的,并每天记录下来。透明的存钱筒是为了让你随时查阅理财的成效,记录是让你养成记账的习惯。当你每日的储蓄随着时间的累积,达到一定数量后再转存到存款薄里,如此日积月累,就可以逐渐养成自身存钱理财的习惯。不管你做什么事情,是否养成了良好的习惯,都会决定你的成败。理财投资也是同样道理,在你养成了很好的投资习惯后,你会发现,在市场中稳定盈利原来是这么容易。STEP 1:下定决心开始“自己”理财一般人的观念中都认为“理财”等同于“不花钱”,进而联想到理财会降低消费所得到的乐趣与生活质量。对于喜爱享受消费快感的年轻人来说,心理 阅读全文
posted @ 2014-03-22 10:17 莫回头 阅读(245) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示