📄 16c54.asm
字号:
;************************************************
;* http://www.sl.com.cn *
;* SL279测试/演示程序 *
;* 此程序为PIC16C54单片机与SL279的接口演示程序 *
;* 程序作者:詹卫前 *
;* SL279 晶振频率12MHZ PIC16C54晶振频率4MHZ *
;************************************************
TITLE "SL279 测试"
LIST P=16C54
INCLUDE P16C5X.INC
BIT_COUNT SET 0x07
DATA_OUT SET 0x08
DATA_IN SET 0x09
TEN SET 0x0A
TIMER SET 0X0B
TIMER1 SET 0X0C
CS EQU 0 ;CS连接于16C54的RA0
CLK EQU 1 ;CLK连接于16C54的RA1
DAT EQU 2 ;DAT连接于16C54的RA2
KEY EQU 3 ;KEY连接于16C54的RA3
ORG 0X1FF
GOTO START
ORG 0
;***************************************
; 延时子程序
;***************************************
LONG_DELAY MOVLW D'29' ;设定延时时间为约90uS
MOVWF TIMER
DELAY_LOOP DECFSZ TIMER,1
GOTO DELAY_LOOP
RETLW 0
SHORT_DELAY MOVLW D'2' ;设定延时时间约为10uS
MOVWF TIMER
SHORT_LP DECFSZ TIMER,1
GOTO SHORT_LP
RETLW 0
;***************************************
; 发送1个字节到SL279,高位在前
;***************************************
SEND MOVWF DATA_OUT ;待发送数据送入DATA_OUT
MOVLW D'8'
MOVWF BIT_COUNT ;设定位计数器=8
BCF PORTA,CS ;设CS为低电平
CALL LONG_DELAY ;长延时
SEND_LOOP BCF STATUS,C
RLF DATA_OUT,1 ;输出1位
BCF PORTA,DAT
BTFSC STATUS,C
BSF PORTA,DAT
BSF PORTA,CLK ;设CLK为高电平
CALL SHORT_DELAY ;短延时
BCF PORTA,CLK ;设CLK为低电平
CALL SHORT_DELAY
DECFSZ BIT_COUNT,1 ;检查是否8位均发送完毕
GOTO SEND_LOOP ;未发送完,发送下一位
BCF PORTA,DAT
RETLW 0
;**************************************
; 从SL279接收1个字节,高位在前
;**************************************
RECEIVE MOVLW D'8'
MOVWF BIT_COUNT ;设定位计数器=8
MOVLW B'11111100' ;设RA2(DATA)口为输入状态
TRIS PORTA
CALL LONG_DELAY ;长延时
RECEIVE_LOOP BSF PORTA,CLK ;置CLK为高电平
CALL SHORT_DELAY ;短延时
BSF STATUS,C
BTFSS PORTA,DAT
BCF STATUS,C
RLF DATA_IN,1 ;读取1位数据
BCF PORTA,CLK ;设CLK为低电平
CALL SHORT_DELAY
DECFSZ BIT_COUNT,1 ;检查是否已接收8位数据
GOTO RECEIVE_LOOP
MOVLW B'11111000'
TRIS PORTA ;重设RA2(DATA)为输出态
RETLW 0
;*******************************************
; 初始化
;*******************************************
START MOVLW B'11111000' ;I/O口初始化
TRIS PORTA
MOVLW B'11111001'
MOVWF PORTA
MOVLW 0X30 ;延时约30MS
MOVWF TIMER
START_DELAY MOVLW 0XFF
MOVWF TIMER1
START_DELAY1 DECFSZ TIMER1,1
GOTO START_DELAY1
DECFSZ TIMER,1
GOTO START_DELAY
MOVLW B'10111111' ;TEST
BCF PORTA,CS
CALL SEND
BSF PORTA,CS
MOVLW 0X20
MOVWF TEN
LP MOVLW 0XFF ;延时约3S
MOVWF TIMER
STARTDELAY MOVLW 0XFF
MOVWF TIMER1
STARTDELAY1 DECFSZ TIMER1,1
GOTO STARTDELAY1
DECFSZ TIMER,1
GOTO STARTDELAY
DECFSZ TEN,1
GOTO LP
MOVLW B'10100100' ;发复位(清除)指令
BCF PORTA,CS
CALL SEND
BSF PORTA,CS ;恢复CS为高电平
MOVLW 0X88
BCF PORTA,CS
CALL SEND
MOVLW 0XFE
CALL SEND
BSF PORTA,CS
MOVLW 0X90 ;SNED "_"
BCF PORTA,CS
CALL SEND
MOVLW 0X08
CALL SEND
BSF PORTA,CS
;*******************************************
; 主程序
;*******************************************
MAIN BTFSC PORTA,KEY ;检查是否有键按下
GOTO MAIN
MOVLW B'00010101' ;有键按下,发读键盘指令
CALL SEND ;发送指令
CALL RECEIVE ;从SL279读入键码
BSF PORTA,CS ;设CS为高电平
;*****************************************
; 发送按键的BCD码到SL279
;*****************************************
OVER MOVLW B'10100001' ;发送2次左移指令,使当前显示内容
CALL SEND ;左移,留出空位供显示新数据
BSF PORTA,CS
MOVLW B'10100001'
CALL SEND
BSF PORTA,CS
MOVLW 0XC8 ;下载数据且译码(方式1)指令(第0位)
CALL SEND
MOVFW DATA_IN
CALL SEND
BSF PORTA,CS
MOVLW 0XF0
ANDWF DATA_IN,1
SWAPF DATA_IN,1
MOVLW 0XC9 ;下载数据且译码(方式1)指令(第1位)
CALL SEND
MOVFW DATA_IN
CALL SEND
BSF PORTA,CS ;置CS=1
WAIT BTFSS PORTA,KEY ;等待按键放开
GOTO WAIT
GOTO MAIN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -