原创 12864液晶asm程序+电路+图片 (控制器KS0108)

2010-2-1 09:52 6573 6 6 分类: MCU/ 嵌入式


点击看大图点击看大图/*********************************************************************/
/*文件名称:12864-01-8x8.asm               SIDE: 128 X 64 DOTS        */
/*模 块 名:12864-1 模块                  CONTROLLER: KS0108         */
/*创 建 人:zmlceo                        日期:2008-12-01           */
/*qq:527717539                              日期:2008-12-01        */
/*功能描述:                                                         */
/*其他说明:                                                         */
/*版    本:V1.0                                                     */
/*********************************************************************/
/*
/
/12864   lcd
/
/
/                                                                   */
;****************************************************************************************
;RS     REG     P2.0             DEFINE LCM DATA/INSTRUCTION PIN
;R/W    REG     P2.1             DEFINE LCM READ/WRITE PIN
;E      REG     P2.2             DEFINE LCM CHIP ENABLE PIN
;CS1    REG     P2.3             DEFINE LCM CHIP 1 SELECT PIN  
;CS2    REG     P2.4             DEFINE LCM CHIP 2 SELECT PIN   
;RSTB   REG     P2.5             DEFINE LCM /RESET PIN
;DB0~DB7    REG    P0.0~P0.7     DEFINE LCM DATA BUS PIN                         
;0011 1000
;***********************LCD**************************************************************
E1FLAG  EQU  0X20
SBDATA     EQU   E1FLAG+1 ;存放显示数据
CLMADD    EQU  E1FLAG+2   ;存放列地址
PAGEADD   EQU  E1FLAG+3 ;存放页地址
PAGENUM         EQU  E1FLAG+4        ;存放总页数
CLMSUM    EQU  E1FLAG+5        ;存放总列数
INTSCODE   EQU  E1FLAG+6        ;存放指令代码
TEMP       EQU             E1FLAG+7 ;以下为其它通用寄存器
COUNT      EQU             E1FLAG+8
COUNT1     EQU             COUNT+1
COUNT2     EQU             COUNT+2
;****************************************************************************************


        ORG     0000H    
        AJMP    BEGIN


        ORG     0050H    
 BEGIN: NOP
                  CALL    DELAY
    NOP
        SETB   P2.5           ;复位液晶
        CALL INITIAL_LCD
STAR:
;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
  MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
  MOV      CLMADD,#58H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_1            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                 CALL    DISP_char816_E1
               ;***********************在液晶的右(E2)半屏显示一个8*16点符号子程序************************
         MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
  MOV      CLMADD,#60H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_2            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                  CALL   DISP_char816_E1
  ;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
  MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
  MOV      CLMADD,#68H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_8            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                 CALL    DISP_char816_E1
  ;***********************在液晶的右(E2)半屏显示一个8*16点符号子程序************************
         MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
  MOV      CLMADD,#70H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_6            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                 CALL   DISP_char816_E1
                ;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
   MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
   MOV      CLMADD,#78H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_4            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                 CALL    DISP_char816_E1


 


   ;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
   MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
   MOV      CLMADD,#48H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_L            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                 CALL    DISP_char816_E2
                 ;***********************在液晶的右(E2)半屏显示一个8*16点符号子程序************************
          MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
   MOV      CLMADD,#50H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_C          ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                  CALL   DISP_char816_E2
    ;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
  MOV      PAGEADD,#0BBH  ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
  MOV      CLMADD,#58H  ;显示起始列,列地址 Y Address 设置


          MOV     DPTR,#ADATA816_D            ;取得TABLE地址的高字节
                 MOV     67H,DPH
    MOV     68H,DPL
                 CALL    DISP_char816_E2


stop:              jmp stop


;*******************LCD系统初始化子程序**************************************************
INITIAL_LCD:   
        ;*********初始化子程序(E1边)***********
  CALL    DISOFF1  ;关显示E1
      CALL    CLEAR1   ;清屏
  CALL       LCDSTA1
      CALL       DISP1   ;开显示
        ;*********初始化子程序(E2边)***********
  CALL    DISOFF2  ;关显示E2
      CALL    CLEAR2   ;清屏
  CALL       LCDSTA2
      CALL       DISP2   ;开显示
  RET
;*******************以上为系统初始化子程序***********************************************


 


;*****************读液晶显示器状态子程序(E1边)*****************************************
LCDSTA1:     NOP
BUSY1:         ORL     P0,#0FFH        ;P0 INPUT MODE  ;设置P0口为输入
               SETB     P2.3
  CLR  P2.4  
  SETB  P2.1   
  CLR  P2.0   ;设置CSA=1,CSB=0,RW=1,DI=0


  SETB  P2.2   ;E=1
  MOV      C,P0.7
  CLR  P2.2   ;E=0
                JC       BUSY1
  RET


;*****************读液晶显示器状态子程序(E2边)*****************************************
LCDSTA2:    NOP
BUSY2:         ORL     P0,#0FFH        ;P0 INPUT MODE  ;设置P0口为输入
  CLR   P2.3
  SETB   P2.4
  SETB   P2.1   
  CLR   P2.0   ;设置CSA=0,CSB=1,RW=1,DI=0


  SETB   P2.2   ;E=1
  MOV      C,P0.7
  CLR   P2.2   ;E=0
                JC       BUSY2
  RET


;*******对液晶显示器发指令子程序(指令保存在W寄存器中,E1边)******************************  
SEND1:    NOP
         MOV    INTSCODE,A  ;指令暂存INTSCODE  
  CALL    LCDSTA1          ;判断液晶是否为忙?
  SETB   P2.3
  CLR   P2.4  
  CLR   P2.1   
  CLR   P2.0  ;设置CSA=1,CSB=0,RW=0,DI=0


                MOV         A,INTSCODE
                MOV             P0,A   


  SETB     P2.2  ;E=1
  NOP
  CLR     P2.2  ;E=0
  RET


;*******对液晶显示器发指令子程序(指令保存在W寄存器中,E2边)******************************  
SEND2:   NOP
         MOV    INTSCODE,A  ;指令暂存INTSCODE  
  CALL    LCDSTA2                ;判断液晶是否为忙?
  CLR   P2.3
  SETB   P2.4  
  CLR   P2.1   
  CLR   P2.0  ;设置CSA=0,CSB=1,RW=0,DI=0


                MOV         A,INTSCODE
                MOV             P0,A   


  SETB     P2.2  ;E=1
  NOP
  CLR     P2.2  ;E=0
  RET


;******对液晶显示器写数据子程序(数据保存在W寄存器中,E1 边)*****************************
WRITE1:  NOP
  MOV    SBDATA,A  ;数据暂存SBDATA


         MOV         A,CLMADD             ;设置列地址
   CALL    SEND1
          CALL       LCDSTA1



  SETB   P2.3
         CLR   P2.4
  CLR   P2.1   
  SETB   P2.0  ;设置CSA=1,CSB=0,RW=0,DI=1


                MOV         A,SBDATA
                MOV             P0,A   


  SETB     P2.2  ;E=1
  NOP
  NOP
  CLR     P2.2  ;E=0 
  RET


;******对液晶显示器写数据子程序(数据保存在W寄存器中,E2 边)*****************************
WRITE2:  NOP
  MOV    SBDATA,A  ;数据暂存SBDATA


         MOV         A,CLMADD     ;设置列地址
  CALL    SEND2
          CALL       LCDSTA2


  CLR   P2.3
  SETB   P2.4  
  CLR   P2.1   
  SETB   P2.0   ;设置CSA=0,CSB=1,RW=0,DI=1


                MOV         A,SBDATA
                MOV             P0,A   


  SETB     P2.2  ;E=1
  NOP
  CLR     P2.2   ;E=0 
  RET


;***********液晶显示器开显示(E1边)*****************************************************
DISP1: NOP       ;开E1显示
BUSY3:          MOV      A,#3FH     ;将控制命令放在W中
  CALL    SEND1   ;送出控制命令
  CALL       LCDSTA1   ;判断其是否空闲


                ORL     P0,#0FFH           ;设置P0口为输入
  SETB   P2.3
  CLR   P2.4  
  SETB   P2.1   
  CLR   P2.0  ;设置CSA=1,CSB=0,RW=1,DI=0


  SETB     P2.2  ;E=1
  MOV      C,P0.7                  ;读入状态并查询
  CLR   P2.2  ;E=0
                JC       BUSY3                   ;是否确实打开;如果没有打开,则继续打开


  RET


;***********液晶显示器开显示(E2边)*****************************************************
DISP2: NOP        ;开E1显示
BUSY4:
                MOV      A,#3FH     ;将控制命令放在A中


                CALL    SEND2   ;送出控制命令
  CALL       LCDSTA2   ;判断其是否空闲


                ORL     P0,#0FFH          ;设置P0口为输入
  CLR   P2.3
  SETB   P2.4  
  SETB   P2.1   
  CLR   P2.0  ;设置CSA=0,CSB=1,RW=1,DI=0


  SETB     P2.2  ;E=1
  MOV      C,P0.7
  CLR   P2.2   ;E=0
                JC       BUSY4


  RET


;***********液晶显示器关显示(E1边)*****************************************************
DISOFF1: NOP       ;关E1显示
BUSY5:         MOV      A,#3EH     ;将控制命令放在A中
  CALL    SEND1   ;送出控制命令
      CALL       LCDSTA1   ;判断其是否空闲


                ORL             P0,#0FFH          ;设置P0口为输入
  SETB   P2.3
  CLR   P2.4 
  SETB   P2.1  
  CLR   P2.0   ;设置CSA=1,CSB=0,RW=1,DI=0


  SETB     P2.2  ;E=1
  MOV      C,P0.7                  ;读入液晶的状态时,不需要判断其是否为忙;读入状态并查询
       CLR   P2.2  ;E=0
                JC       BUSY5                   ;判是否关闭;如果没有关闭则继续关
  RET


;***********液晶显示器关显示(E2边)*****************************************************
DISOFF2: NOP      ;关E2显示
BUSY6:         MOV      A,#3EH    ;将控制命令放在A中


  CALL    SEND2   ;送出控制命令
     CALL       LCDSTA2    ;判断其是否空闲
                ORL     P0,#0FFH        ;P0 INPUT MODE  ;设置P0口为输入


  CLR   P2.3
  SETB   P2.4  
  SETB   P2.1   
  CLR   P2.0   ;设置CSA=1,CSB=0,RW=1,DI=0


  SETB     P2.2   ;E=1
  MOV      C,P0.7                  ;读入液晶的状态时,不需要判断其是否为忙;读入状态并查询
  CLR   P2.2   ;E=0
                JC       BUSY6              ;判是否关闭;如果没有关闭则继续关


  RET


;***********液晶显示器清屏子程序(E1边)*************************************************
CLEAR1: NOP       ;E1边清屏
                MOV    PAGEADD,#0B8H               ;设置页地址代码
                MOV    PAGENUM,#08H                ;设置总页数


CLR11:          MOV         A,PAGEADD
  CALL    SEND1
   
                MOV    CLMSUM,#40H     ;设置总列数 ;64列
                MOV    CLMADD,#00H     ;设置起始列



CLR12:   CALL       LCDSTA1
                MOV             A,#00H
  
  CALL    WRITE1   ;写入00H
                DJNZ            CLMSUM,CLR12            ;本页未清完    ;返回继续
                INC             PAGEADD              ;页号增1
                DJNZ             PAGENUM,CLR11          ;八页未清完    ;返回继续
  RET


 


 


;***********液晶显示器清屏子程序(E2边)*************************************************
CLEAR2: NOP       ;E2边清屏
 
                MOV    PAGEADD,#0B8H;设置页地址代码
                MOV    PAGENUM,#08H;设置总页数
CLR21:         MOV         A,PAGEADD


  CALL    SEND2
 
                MOV    CLMSUM,#40H;设置总列数 ;64列
                MOV    CLMADD,#00H;设置起始列


CLR22:   CALL       LCDSTA2
                MOV             A,#00H


  CALL    WRITE2   ;写入00H
   
                DJNZ            CLMSUM,CLR22             ;本页未清完;返回继续
                INC             PAGEADD                  ;页号增1
                DJNZ             PAGENUM,CLR21           ;八页未清完;返回继续


  RET


 


;***********************8*16字符0123456789点阵库*****************************************


ADATA816_0:             ;8*16字符点阵
;--  文字:  0  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H


ADATA816_1:
;--  文字:  1  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,010H,010H,0F8H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,000H,000H


ADATA816_2:
;--  文字:  2  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,070H,008H,008H,008H,088H,070H,000H,000H,030H,028H,024H,022H,021H,030H,000H


ADATA816_3:
;--  文字:  3  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,030H,008H,088H,088H,048H,030H,000H,000H,018H,020H,020H,020H,011H,00EH,000H


ADATA816_4:
;--  文字:  4  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,000H,0C0H,020H,010H,0F8H,000H,000H,000H,007H,004H,024H,024H,03FH,024H,000H


ADATA816_5:
;--  文字:  5  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,0F8H,008H,088H,088H,008H,008H,000H,000H,019H,021H,020H,020H,011H,00EH,000H


ADATA816_6:
;--  文字:  6  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,0E0H,010H,088H,088H,018H,000H,000H,000H,00FH,011H,020H,020H,011H,00EH,000H


ADATA816_7:
;--  文字:  7  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,038H,008H,008H,0C8H,038H,008H,000H,000H,000H,000H,03FH,000H,000H,000H,000H


ADATA816_8:
;--  文字:  8  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,070H,088H,008H,008H,088H,070H,000H,000H,01CH,022H,021H,021H,022H,01CH,000H


ADATA816_9:
;--  文字:  9  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,000H,031H,022H,022H,011H,00FH,000H
;***********************8*16字符0123456789点阵库*****************************************


ADATA816_L:
;--  文字:  L  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  008H,0F8H,008H,000H,000H,000H,000H,000H,020H,03FH,020H,020H,020H,020H,030H,000H


ADATA816_C:
;--  文字:  C  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  0C0H,030H,008H,008H,008H,008H,038H,000H,007H,018H,020H,020H,020H,010H,008H,000H


ADATA816_D:
;--  文字:  D  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
DB  008H,0F8H,008H,008H,008H,010H,0E0H,000H,020H,03FH,020H,020H,020H,010H,00FH,000H


END


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条