S3F84B8简单入门例程
文章来源: 本站原创   更新时间: 2014-06-23
;------------------------
;S3F94C4
;---------------------
.INCLUDE "S3F94C4.REG"
.INCLUDE "\myfile\sam\mysam.inc"
;---------------------
DIGITA EQU 00H
DIGITB EQU 01H
DIGITC EQU 02H
DIGITD EQU 03H
DIGITE EQU 04H

CNT_H EQU 05H
CNT_M EQU 06H
CNT_L EQU 07H

ERRFLAG EQU 08H
WCNT EQU 09H
;---------------------------------------------
;LED屏显示RAM定义
;共分7个位,仅用了低位
;高位未用,扫描时应全部置0
GRID_CODE_ADD .EQU 60H
 
GRID1L EQU 60H
GRID1H EQU 61H
GRID2L EQU 62H
GRID2H EQU 63H
GRID3L EQU 64H
GRID3H EQU 65H
GRID4L EQU 66H
GRID4H EQU 67H
GRID5L EQU 68H
GRID5H EQU 69H
GRID6L EQU 6AH
GRID6H EQU 6BH
GRID7L EQU 6CH
GRID7H EQU 6DH
;--------------------
STB_1628 BIT P0.2
CLK_1628 BIT P0.3
DIO_1628 BIT P0.4
;----------------------


;----------------------
        ORG 003CH
        DB 00H
        DB 00H
        DB 0E4H
        DB 03H
;-------------------------
 ;0-9数码显示代码定义
DIGIT_CODE:
        DB 00111111B ;'0'
        DB 00000110B ;'1'
        DB 01011011B ;'2'
        DB 01001111B ;'3'
        DB 01100110B ;'4'
        DB 01101101B ;'5'
        DB 01111101B ;'6'
        DB 00000111B ;'7'
        DB 01111111B ;'8'
        DB 01101111B ;'9'
        DB 01110111B ;'A'
        DB 01111100B ;'b'
        DB 00111001B ;'C'
        DB 01011110B ;'d'
        DB 01111001B ;'E'
        DB 01110001B ;'F'
        DB 01000000B ;'-'
        DB 00000000B ;关闭显示
        DB 00111110B ;'U'
        DB 01110110B ;'H'
        
    
A_CODE .EQU 0AH
D_CODE .EQU 0DH
E_CODE .EQU 0EH
OFF_DISP .EQU 011H ;关闭显示代码
_CODE_ .EQU 010H
U_CODE .EQU 012H ;显示'U'
H_CODE .EQU 013H ;显示H
        
;-------------------------
        ORG 0100H
RESTE:
        DI
        LD SP,#0C0H
        LD BTCON,#0A0H
        LD CLKCON,#00011000B
        
        LD P0CONH,#02H
        LD P0CONL,#10100000B
        
        CALL DELAY_100MS
        
        CALL DISPLAY_INIT
        
        LD R10,#WADD_H
        LD R11,#WADD_L
        LDC R0,@RR10
        INC R11
        LDC R1,@RR10
        INC R11
        LDC R2,@RR10
        
        CP R0,#0FFH
        JR NE,LD_CNT
        CP R1,#0FFH
        JR NE,LD_CNT
        CP R2,#0FFH
        JR NE,LD_CNT
        
        LD CNT_H,#00H
        LD CNT_M,#00H
        LD CNT_L,#00H
        CLR WCNT
        JR MAIN
LD_CNT:
        LD CNT_H,R0
        LD CNT_M,R1
        LD CNT_L,R2
        CLR WCNT
        JR MAIN
;-----------------------------------------
WADD_H .EQU 0DH
WADD_L .EQU 00H
;---------------------------
MAIN:
        CLR ERRFLAG
        LD R10,#WADD_H
        LD R11,#WADD_L
        CALL ERASE_94C4_SECTOR
;-------------------------
CHK_ERA:
        LD R10,#WADD_H
        LD R11,#WADD_L
CHK_LOOP:
        LDCI R0,@RR10
        CP R0,#0FFH
        JP NE,W_ERROR
        CP R11,#80H
        JR ULT,CHK_LOOP
;----------------------------
        ;CALL WRITE_55H
        ;CP ERRFLAG,#00H
        ;JR NE,W_ERROR
        
        ;CALL WRITE_AAH
        ;CP ERRFLAG,#00H
        ;JR NE,W_ERROR
        
        CALL WRITE_CNT
        CP ERRFLAG,#00H
        JR NE,W_ERROR
;---------------------
DISPLAY_CNT:
        CALL COUNT_TOABCDE
        CALL DIGIT_CONVERT
        CALL LED_SCAN

        ADD CNT_L,#01H
        ADC CNT_M,#00H
        ADC CNT_H,#00H
        
        CALL DELAY_1MS
        ;CALL DELAY_50MS
        ;CALL DELAY_50MS
        ;CALL DELAY_50MS
        
        CLR WCNT
        JP MAIN
;---------------------------
W_ERROR:
        INC WCNT
        CP WCNT,#5
        JR ULT,MAIN
        LD WCNT,#5
        LD BTCON,#02H
        JR W_ERROR
;----------------------------------------------
WRITE_CNT:
        CLR ERRFLAG
        
        LD R10,#WADD_H
        LD R11,#WADD_L
        CALL START_94C4_PROG
        
        
        LD R10,#WADD_H
        LD R11,#WADD_L

        LD R0,CNT_H
        LDC @RR10,R0
        INC R11
        DELAY 10
        DELAY 10
        DELAY 10
        
        LD R0,CNT_M
        LDC @RR10,R0
        INC R11
        DELAY 10
        DELAY 10
        DELAY 10
        
        LD R0,CNT_L
        LDC @RR10,R0
        INC R11
        DELAY 10
        DELAY 10
        DELAY 10
        
        CALL END_94C4_PROG
        
        CALL DELAY_1MS
        
        LD R10,#WADD_H
        LD R11,#WADD_L
        LDC R0,@RR10
        CP R0,CNT_H
        JR NE,ER_CNT
        
        INC R11
        LDC R0,@RR10
        CP R0,CNT_M
        JR NE,ER_CNT
        
        INC R11
        LDC R0,@RR10
        CP R0,CNT_L
        JR NE,ER_CNT
        JR CNT_BACK
ER_CNT:
        LD ERRFLAG,#1
CNT_BACK:
        RET
;----------------------------------------------
WRITE_55H:
        CLR ERRFLAG
        
        LD R10,#WADD_H
        LD R11,#WADD_L
        CALL START_94C4_PROG
        
        LD R10,#WADD_H
        LD R11,#WADD_L
W55_LOOP:
        LD R0,#055H
        LDC @RR10,R0
        INC R11
        DELAY 10
        DELAY 10
        DELAY 10
        CP R11,#80H
        JR ULT,W55_LOOP
        
        LD R10,#WADD_H
        LD R11,#WADD_L
R55_LOOP:
        CP R11,#80H
        JR UGE,W55_BACK
        
        LDCI R0,@RR10
        CP R0,#055H
        JR EQ,R55_LOOP
        ;出错
        LD ERRFLAG,#1
;------------------
W55_BACK:
        CALL END_94C4_PROG
        RET
;------------------------------------------------------------------------------
WRITE_AAH:
        CLR ERRFLAG
        
        LD R10,#WADD_H
        LD R11,#WADD_L
        CALL START_94C4_PROG
        
        LD R10,#WADD_H
        LD R11,#WADD_L
WAA_LOOP:
        LD R0,#0AAH
        LDC @RR10,R0
        INC R11
        DELAY 10
        DELAY 10
        DELAY 10
        CP R11,#80H
        JR ULT,WAA_LOOP
        
        LD R10,#WADD_H
        LD R11,#WADD_L
RAA_LOOP:
        CP R11,#80H
        JR UGE,WAA_BACK
        
        LDCI R0,@RR10
        CP R0,#00H ;由于前面已写入了55H,再写入AAH,则应变为00H
        JR EQ,RAA_LOOP
        ;出错
        LD ERRFLAG,#1
;------------------
WAA_BACK:
        CALL END_94C4_PROG
        RET
;--------------------------------------------------------------------------------
;将计数值转化为A,B,C,D,E五位显示数码的过程
COUNT_TOABCDE:
        LD R0,CNT_L
        LD R1,R0
        AND R1,#0FH
        LD DIGITE,R1
        RR R0
        RR R0
        RR R0
        RR R0
        AND R0,#0FH
        LD DIGITD,R0
        
        LD R0,CNT_M
        LD R1,R0
        AND R1,#0FH
        LD DIGITC,R1
        RR R0
        RR R0
        RR R0
        RR R0
        AND R0,#0FH
        LD DIGITB,R0
        
        LD DIGITA,CNT_H
        AND DIGITA,#0FH
              
ABCDE_BACK:
        RET
;--------------------------------------------------------------------------------
;four digit code convert display
;-------------------------------
DIGIT_CONVERT:
       CP DIGITA,#0
       JR NE,LD_DGT
       LD DIGITA,#OFF_DISP
       CP DIGITB,#0
       JR NE,LD_DGT
       LD DIGITB,#OFF_DISP
       CP DIGITC,#0
       JR NE,LD_DGT
       LD DIGITC,#OFF_DISP
       CP DIGITD,#0
       JR NE,LD_DGT
       LD DIGITD,#OFF_DISP

LD_DGT:
       LD R0,#00H
       LD R1,#DIGIT_CODE
       ADD R1,DIGITA
       LDC R10,@RR0 ;get DIGITA hsb into R10
       LD GRID1L,R10
             
       LD R1,#DIGIT_CODE
       ADD R1,DIGITB
       LDC R10,@RR0 ;get DIGITB hsb into R12
       LD GRID2L,R10
       
       LD R1,#DIGIT_CODE
       ADD R1,DIGITC
       LDC R10,@RR0
       LD GRID3L,R10
       
       LD R1,#DIGIT_CODE
       ADD R1,DIGITD
       LDC R10,@RR0
       LD GRID4L,R10
       
       LD R1,#DIGIT_CODE
       ADD R1,DIGITE
       LDC R10,@RR0
       LD GRID5L,R10
           
       ;col=0,now it is no display
;-------------------------------------------------------------------------------
CONVERT_DG_BACK:
       RET
;------------------------------------------------------------
;上电时初始化显示屏显示状态过程
DISPLAY_INIT:
        ;首先设置1628为7位,10段
        LD R0,#00000011B
        CALL SET_1628
        ;首先关闭屏显示,并设置当前消光模式为14/16脉冲宽度
        LD R0,#10000011B
        CALL SET_1628
        ;----------------
        ;点亮所有LED点,进行测试
        ;送设置数据指令
        LD R0,#01000000B ;地址自动增量,写数据到显示寄存器
        CALL SET_1628
        ;送显示数据起始地址
        LD R0,#11000000B ;设置写地址00H
        CALL SET_1628
        ;送出所有显示数据均为0FFH
        LD R1,#14
SEND_LOOPA:
        LD R0,#0FFH
        CALL SENDTO1628
        DEC R1
        JR NZ,SEND_LOOPA
        
        LD R0,#5
WAIT_1S:
        CALL DELAY_100MS
        DEC R0
        JR NZ,WAIT_1S
            
        ;打开显示屏显示
        LD R0,#10001010B ;并设置当前消光模式为14/16脉冲宽度
        CALL SET_1628
        ;送设置数据指令
        LD R0,#01000000B ;地址自动增量,写数据到显示寄存器
        CALL SET_1628
        ;送显示数据起始地址
        LD R0,#11000000B ;设置写地址00H
        CALL SET_1628
        ;送出所有显示数据均为00H
        LD R1,#14
SEND_LOOPB:
        LD R0,#00H
        CALL SENDTO1628
        DEC R1
        JR NZ,SEND_LOOPB
        
        CALL RESET_STB
DISP_INIT_BACK:
        RET
;----------------------------------------------------------------
;LED屏显示扫描过程
LED_SCAN:
        ;将RAM显示数据发送至1628
        ;送设置数据指令
        LD R0,#01000000B ;地址自动增量,写数据到显示寄存器
        CALL SET_1628
        ;送显示数据起始地址
        LD R0,#11000000B ;设置写地址00H
        CALL SET_1628
       
        LD R8,#GRID_CODE_ADD
SEND_NEXT:
        LD R0,@R8
        CALL SENDTO1628
        INC R8
        CP R8,#GRID_CODE_ADD+0DH
        JR ULE,SEND_NEXT
        
        CALL RESET_STB
        RET
;------------------------------------------------------------
;该过程用来发送给1628一个指令,以设置其显示参数
;设置数据置在R0中
SET_1628:
        CALL SET_STB
        ;设置数据在R0中
        CALL SENDTO1628
        RET
;------------------------------------------------------------
;设置1629的STB线,准备发送指令到1628
SET_STB:
        SETBIT STB_1628
        DELAY 4
        CLRBIT STB_1628
        RET
;------------------------------------------------------------
;复位1628的STB线,以停止指令及数据传送
RESET_STB:
        SETBIT STB_1628
        DELAY 4
        RET
;------------------------------------------------------------
        ;ORG 0E00H
;送一个字节数据/指令到1628的过程
;1628的数据在时钟上升沿被锁存
;R0----要送出的数据/指令字节
SENDTO1628:
        PUSH R1
        CLRBIT CLK_1628 ;set clock line is low
        DELAY 4
        CLRBIT DIO_1628 ;set data line is low
        LD R1,#08H
SENDA_1628:
        DELAY 4
        RRC R0 ;right shift R0,bit0 into C
        SETBIT DIO_1628 ;set data line
        JR C,SENDB_1628 ;if C=1,skip
        CLRBIT DIO_1628 ;clear data line
SENDB_1628:
        DELAY 4
        SETBIT CLK_1628 ;send one clock pulse
        DELAY 4
        CLRBIT CLK_1628 ;
        DEC R1
        JR NZ,SENDA_1628
        
SEND1628_BACK:
        POP R1
        RET
;------------------------------------------------------------
        ;ORG 0F00H
;------------------------------------------------------
;擦除芯片内一个SECTOR
;RR10--要擦除的SECTOR地址高低位
;注意: 每个扇区被定义为128个字节
;每个256字节段被分为2个扇区,由FMSECL的值来区分是高位和低位扇区
ERASE_94C4_SECTOR:

        LD FMSECH,R10
        LD FMSECL,R11
        LD FMUSR,#0A5H
        LD FMCON,#0A1H
REPEAT:
        NOP
        NOP
        TM FMCON,#1
        JR NZ,REPEAT
        
        ;CALL DELAY_10MS
        
        LD FMUSR,#00H
        RET
;-------------------------------------------------------
;扇区写功能启动初始化
;RR10---要写入的扇区地址起始
START_94C4_PROG:
        
        LD FMSECH,R10
        LD FMSECL,R11
        LD FMUSR,#0A5H
        LD FMCON,#51H
        
        RET
;-------------------------------------------------------
;编程结束
END_94C4_PROG:
        AND FMCON,#0FEH
        LD FMUSR,#00H
        RET
;---------------------------------------------------------
DELAY_100MS:
        PUSH R15
        
        LD R15,#100
_100MS:
        CALL DELAY_1MS
        DEC R15
        JR NZ,_100MS
        
        POP R15
        RET
;---------------------------------------------------------
DELAY_50MS:
        PUSH R15
        
        LD R15,#50
_50MS:
        CALL DELAY_1MS
        DEC R15
        JR NZ,_50MS
        
        POP R15
        RET
;-----------------------------------------
DELAY_10MS:
        PUSH R15
        
        LD R15,#10
_10MS:
        CALL DELAY_1MS
        DEC R15
        JR NZ,_10MS
        
        POP R15
        RET
;---------------------------------------------------------
DELAY_1MS:
        PUSH R15
        
        LD R15,#100
_1MS:
        DELAY 4
        DELAY 3
        DEC R15
        JR NZ,_1MS
        
        POP R15
        RET
;----------------------------------------------------------
.END
       

     
相关备注:
 
三星单片机开发网首页