访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
在EM78Pxx上模拟8(COM)*8(SEG)LCD驱动
内容导读:

;/*=============================================================================
;             在EM78Pxx上模拟8(COM)*8(SEG)LCD驱动                             
;                                                                             
;                                                                             
;一. LCD扫描原理:                                                             
;正向扫描: COM on=VCC,COM off=1/2VCC,对应SEG=1则输出VSS,为0 则输出VCC.        
;反向扫描: COM on=VSS,COM off=1/2VCC,对应SEG=1则输出VCC,为0 则输出VSS.        
;                                                                             
;二. 电路接法:                                                                
;    所有COM口线都接一个上拉电阻和一个下拉电阻,阻值相同.                      
;    当口线设为输入时,端口电压为1/2VCC.                                       
;    COM I/O口设定高阻输入&正常输出.                                          
;                                                                             
;三. 使用方法:                                                                
;    由程序定时调用.                                                          
;                                                                             
;DATE:2005-02-24 ok                                                           
;=============================================================================*/

#define LCD_scan_bearing  LCD_scan_status.0     ;//扫描方向
#define common_amount 4     ;//common pin  定义COM口的数量  max=8

;//LCD显示代码寄存器
COM_port == 5    ;//PORT5=COM0--COM7
SEG_port == 6    ;//PORT6=SEG0--SEG7

seg0 == 0x10                 ;//静态变量
seg1 == 0x11
seg2 == 0x12
seg3 == 0x13
seg4 == 0x14
seg5 == 0x15
seg6 == 0x16
seg7 == 0x17
LCD_scan_status  == 0x18
LCD_scan_counter == 0x19


LCD_scan_temp    == 0x1a     ;//动态变量
seg_TEMP         == 0x1b
com_temp         == 0x1c

 


            !seg_port=0        ;//seg_port为outport

LCD_drive()
            SEG_temp=0xff
            com_temp=0xff
            LCD_scan_temp=LCD_scan_counter
            _if LCD_scan_temp!=0
            goto ld1
            jbc seg0,0           ;//COM0
            bc  SEG_temp,0
            jbc seg1,0
            bc  SEG_temp,1
            jbc seg2,0
            bc  SEG_temp,2
            jbc seg3,0
            bc  SEG_temp,3
            jbc seg4,0
            bc  SEG_temp,4
            jbc seg5,0
            bc  SEG_temp,5
            jbc seg6,0
            bc  SEG_temp,6
            jbc seg7,0
            bc  SEG_temp,7
            bc  com_temp,0
ld1:
            _if --LCD_scan_temp!=0
            goto ld2
            jbc seg0,1            ;//COM1
            bc  SEG_temp,0
            jbc seg1,1
            bc  SEG_temp,1
            jbc seg2,1
            bc  SEG_temp,2
            jbc seg3,1
            bc  SEG_temp,3
            jbc seg4,1
            bc  SEG_temp,4
            jbc seg5,1
            bc  SEG_temp,5
            jbc seg6,1
            bc  SEG_temp,6
            jbc seg7,1
            bc  SEG_temp,7
            bc  com_temp,1
ld2:
            _if --LCD_scan_temp!=0
            goto ld3
            jbc seg0,2               ;//COM2
            bc  SEG_temp,0
            jbc seg1,2
            bc  SEG_temp,1
            jbc seg2,2
            bc  SEG_temp,2
            jbc seg3,2
            bc  SEG_temp,3
            jbc seg4,2
            bc  SEG_temp,4
            jbc seg5,2
            bc  SEG_temp,5
            jbc seg6,2
            bc  SEG_temp,6
            jbc seg7,2
            bc  SEG_temp,7
            bc  com_temp,2
ld3:
            _if --LCD_scan_temp!=0
            goto ld4
            jbc seg0,3                  ;//COM3
            bc  SEG_temp,0
            jbc seg1,3
            bc  SEG_temp,1
            jbc seg2,3
            bc  SEG_temp,2
            jbc seg3,3
            bc  SEG_temp,3
            jbc seg4,3
            bc  SEG_temp,4
            jbc seg5,3
            bc  SEG_temp,5
            jbc seg6,3
            bc  SEG_temp,6
            jbc seg7,3
            bc  SEG_temp,7
            bc  com_temp,3
ld4:
            _if --LCD_scan_temp!=0
            goto ld5
            jbc seg0,4                  ;//COM4
            bc  SEG_temp,0
            jbc seg1,4
            bc  SEG_temp,1
            jbc seg2,4
            bc  SEG_temp,2
            jbc seg3,4
            bc  SEG_temp,3
            jbc seg4,4
            bc  SEG_temp,4
            jbc seg5,4
            bc  SEG_temp,5
            jbc seg6,4
            bc  SEG_temp,6
            jbc seg7,4
            bc  SEG_temp,7
            bc  com_temp,4
ld5:
            _if --LCD_scan_temp!=0
            goto ld6
            jbc seg0,5                     ;//COM5
            bc  SEG_temp,0
            jbc seg1,5
            bc  SEG_temp,1
            jbc seg2,5
            bc  SEG_temp,2
            jbc seg3,5
            bc  SEG_temp,3
            jbc seg4,5
            bc  SEG_temp,4
            jbc seg5,5
            bc  SEG_temp,5
            jbc seg6,5
            bc  SEG_temp,6
            jbc seg7,5
            bc  SEG_temp,7
            bc  com_temp,5
ld6:
            _if --LCD_scan_temp!=0
            goto ld7
            jbc seg0,6                          ;//COM6
            bc  SEG_temp,0
            jbc seg1,6
            bc  SEG_temp,1
            jbc seg2,6
            bc  SEG_temp,2
            jbc seg3,6
            bc  SEG_temp,3
            jbc seg4,6
            bc  SEG_temp,4
            jbc seg5,6
            bc  SEG_temp,5
            jbc seg6,6
            bc  SEG_temp,6
            jbc seg7,6
            bc  SEG_temp,7
            bc  com_temp,6
ld7:
            _if --LCD_scan_temp!=0
            goto ld8
            jbc seg0,7                          ;//COM7
            bc  SEG_temp,0
            jbc seg1,7
            bc  SEG_temp,1
            jbc seg2,7
            bc  SEG_temp,2
            jbc seg3,7
            bc  SEG_temp,3
            jbc seg4,7
            bc  SEG_temp,4
            jbc seg5,7
            bc  SEG_temp,5
            jbc seg6,7
            bc  SEG_temp,6
            jbc seg7,7
            bc  SEG_temp,7
            bc  com_temp,7
ld8:
            !com_port=com_temp
            if LCD_scan_bearing==0
               com  SEG_temp           ;//反向扫描COM=0 SEG=1
            else
               com  com_temp           ;//正向扫描COM=1 SEG=0
            endif
            seg_port=SEG_temp          ;//write seg
            com_port=com_temp          ;//write com

            if ++LCD_scan_counter>=common_amount   ;//检查同一方向扫描是否完成
               LCD_scan_counter=0
               if LCD_scan_bearing==0       ;//已经完成则改变扫描方向
                  LCD_scan_bearing=1
               else
                  LCD_scan_bearing=0
               endif
            endif
            return

标签:
来源: 作者: 时间:2006/9/25 16:50:53
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐