发一个在产品中使用的HT1621A的51汇编驱动

2020-02-04 09:29发布

; MCU   89C52

; Fosc  11.0592MHz

;*************************************************************************************

;/*HT1621 4x32 Segment lcd Driver IC                                                 */

;/*    /CS: 片选

;   BZ,/BZ: 声音输出

;      /WR: 写脉冲输入,接一上拉电阻。在/WR信号的上升沿,DATA线上的数据写到HT1621。

;      /RD: 读脉冲输入,接一上拉电阻。在/RD信号的下降沿,HT1621内存的数据被读到

;           DATA线上,主控器可以在下个上升沿时锁存这些数据;

;     DATA: 外接上拉电阻的串行数据输入/输出;

;     /IRQ: 时基或WDT溢出输出,NMOS开漏输出;

;  命令          代码                   数据/命令    功  能

;  DEAD       110,A5A4A3A2A1A0,D0D1D2D3   数据     读RAM数据

;  WRITE      101,A5A4A3A2A1A0,D0D1D2D3   数据     写数据到RAM

;  READ-MODI

;  FY-WRITE   101,A5A4A3A2A1A0,D0D1D2D3   数据     读和写数据

;  SYS DIS    100,0-0000-000X    (00H)    命令0    关闭系统振荡器和LCD偏压发生器

;  SYS EN     100,0-0000-001X    (02H)    命令0    打开系统振荡器

;  LCD OFF    100,0-0000-010X    (04H)    命令0    关闭LCD偏压发生器

;  LCD ON     100,0-0000-011X    (06H)    命令0    打开LCD偏压发生器

;  TIMER DIS  100,0-0000-100X    (08H)    命令0    时基输出失效

;  WDT DIS    100,0-0000-101X    (0AH)    命令0    WDT溢出标志输出失效

;  TIMER ON   100,0-0000-110X    (0CH)    命令0    时基输出使能

;  WDT ON     100,0-0000-111X    (0EH)    命令0    WDT溢出标志输出使能

;  TONE OFF   100,0-0001-000X    (10H)    命令0    关闭声音输出

;  TONE ON    100,0-0001-001X    (12H)    命令0    打开声音输出

;  CLR TIMER  100,0-0001-1XXX    (18H)    命令0    时基发生器清零

;  CLR WDT    100,0-0001-11XX    (1CH)    命令0    清除WDT状态

;  XTAL 32K   100,0-0010-1XXX    (28H)    命令0    系统时钟源,晶振

;  RC  256K   100,0-0011-0XXX    (30H)    命令0    系统时钟源,片内256K RC振荡器

;  EXT 256K   100,0-0011-1XXX    (38H)    命令0    系统时钟源,外部时钟

;  BIAS 1/2   100,0-010a-bX0X    (XXH)    命令0    LCD 1/2偏压选项,

;                                (40H)             ab=00: 2COM

;                                (48H)             ab=01: 3COM

;                                (50H)             ab=10: 4COM

;  BIAS 1/3   100,0-010a-bX1X    (XXH)    命令0    LCD 1/3偏压选项,

;                                (42H)             ab=00: 2COM

;                                (4AH)             ab=01: 3COM

;                                (52H)             ab=10: 4COM

;  TONE  4K   100,0-10XX-XXXX    (80H)    命令0    声音频率,4KHz

;  TONE  2K   100,0-11XX-XXXX    (C0H)    命令0    声音频率,2KHz

;//////////////////////////////////////////////////////////////////////////

;  /IRQ DIS   100,1-00X0-XXXX    (00H)    命令1    使/IRQ输出失效

;  /IRQ EN    100,1-00X1-XXXX    (10H)    命令1    使/IRQ输出有效

;  F1         100,1-01XX-000X    (40H)    命令1    时基/WDT时钟输出1Hz

;  F2         100,1-01XX-001X    (42H)    命令1    时基/WDT时钟输出2Hz

;  F4         100,1-01XX-010X    (44H)    命令1    时基/WDT时钟输出4Hz

;  F8         100,1-01XX-011X    (46H)    命令1    时基/WDT时钟输出8Hz

;  F16        100,1-01XX-100X    (48H)    命令1    时基/WDT时钟输出16Hz

;  F32        100,1-01XX-101X    (4AH)    命令1    时基/WDT时钟输出32Hz

;  F64        100,1-01XX-110X    (4CH)    命令1    时基/WDT时钟输出64Hz

;  F128       100,1-01XX-111X    (4EH)    命令1    时基/WDT时钟输出128Hz

;  TOPT       100,1-1100-000X    (C0H)    命令1    测试模式

;  TNORMOL    100,1-1100-011X    (C6H)    命令1    普通模式

;                                                                           */

;

;/*****************************************************************/

SYS_DIS     DATA    00H

SYS_EN      DATA    02H

LCD_OFF     DATA    04H

LCD_ON      DATA    06H

TIMER_DIS   DATA    08H

WDT_DIS     DATA    0AH

TIMER_ON    DATA    0CH

WDT_ON      DATA    0EH

TONE_OFF    DATA    10H

TONE_ON     DATA    12H

CLR_TIMER   DATA    18H

CLR_WDT     DATA    1CH

XTAL_32K    DATA    28H

RC_256K     DATA    30H

EXT_256K    DATA    38H

BIAS1_2     DATA    50H    ;/*4COM*/

;//BIAS1_2    DATA    48H    /*3COM*/

;//BIAS1_2    DATA    40H    /*2COM*/

BIAS1_3     DATA    52H    ;/*4COM*/

;//BIAS1_3    DATA    4AH    /*3COM*/

;//BIAS1_3    DATA    42H    /*2COM*/

TONE_4K     DATA    80H

TONE_2K     DATA    0C0H

;******************************************************************

DATA_1621      BIT    P1.4

WR_1621        BIT    P1.5

RD_1621        BIT    P1.6

CS_1621        BIT    P1.7

COMM_1621       DATA   07H        ;/命令码寄存器* R7 */

;/******************************************************************/

;初始化HT1621

;/******************************************************************/

INTI_HT1621:

            MOV    COMM_1621,#BIAS1_3   ;/* 设置偏压(1/3)和占空比(1/4)*/

            LCALL  SENDCOMM_1621A

            MOV    COMM_1621,#SYS_EN    ;/* 打开系统振荡器            */

            LCALL  SENDCOMM_1621A

            MOV    COMM_1621,#RC_256K   ;/* 选择片内256KHz振荡器      */

            LCALL  SENDCOMM_1621A

            MOV    COMM_1621,#LCD_ON    ;/* 打开LCD偏压发生器         */

            LCALL  SENDCOMM_1621A

            ;MOV    COMM_1621,#TONE_2K   ;/* 声音频率,2KHz            */

            ;LCALL  SENDCOMM_1621A

            

;/*******************************************************/

;/*********HT1621 命令模式子程序:                ********/

;/*********SENDCOMM_1621A: ID+0                   ********/

;/*********SENDCOMM_1621B: ID+1                   ********/

;/*******************************************************/

SENDCOMM_1621A:

            MOV    A,#80H        ;/* ID 100+0     */

            SJMP   SENDCOMM_1621

SENDCOMM_1621B:

            MOV    A,#90H        ;/* ID 100+1     */

SENDCOMM_1621:

            CLR    CS_1621       ;/* REDAY        */

            MOV    R6,#04H       ;/* SEND ID+0/1  */

            ACALL  SENDBIT_1621



            MOV    R6,#08H       ;/* SEND COMMAND */

            MOV    A,COMM_1621

            ACALL  SENDBIT_1621

            SETB   CS_1621

            SETB   WR_1621

            SETB   DATA_1621

            RETI

;/*******************************************************/

;/*******HT1621 数据模式子程序:                  ********/

;/*******数据首址在R0                            ********/

;/*******向HT1621连续写入N(R7)字节数据           ********/

;/*******HT1621RAM 首地址在寄存器 A 里           ********/

;/*******在调用该子程序前要预置地址和字节数      ********/

;/*******************************************************/

SENDDATA_1621:

            CLR    CS_1621

            SETB   C

            CLR    WR_1621          ;ID第一位

            MOV    DATA_1621,C      ;WR '1' TO 1621

            SETB   WR_1621

            ANL    A,#3FH           ;确保地址有效

            OR     A,#40H           ;ID低2位

            ;MOV    A,#40H          ;'01-000000'ID低2位+地址00

            MOV    R6,#08H

            ACALL  SENDBIT_1621

SENDDATA0:

            MOV    A,@R0            

            MOV    R6,#08H

            ACALL  SENDBIT_1621

            INC    R0               ;数据地址加1

            DJNZ   R7,SENDDATA0

            SETB   CS_1621

            SETB   WR_1621

            SETB   DATA_1621

            RETI

;/*******************************************************/

;/*******向HT1621写入n Bit数据,n=R6<=8          *********/

;/*******************************************************/

SENDBIT_1621:                    ;/* SEND n BIT TO HT1621 */

            RLC    A

            CLR    WR_1621

            MOV    DATA_1621,C

            SETB   WR_1621

            DJNZ   R6,SENDBIT_1621

            RETI

;**********************************************************

            END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。