;------------------------
;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
|
相关备注: |
无 |
|