📄 bc728x与pic单片机接口程序(汇编).txt
字号:
;
; 引用时如用于16C5X请注意堆栈深度为两级,调
; 用子程序时请注意子程序嵌套层数
;*******************************************
TITLE BC728X REA
LIST P=16C57
INCLUDE P16C5X.INC
;****************************************
; 寄存器定义
;****************************************
BIT_COUNT EQU 0X10
TIMER EQU 0X11
TIMER1 EQU 0X12
DATA_IN EQU 0X13
DATA_OUT EQU 0X14
;****************************************
; I/O 口定义
;****************************************
CLK EQU 0 ;PORTA.0 连接到BC7281的 CLK
DAT EQU 1 ;PORTA.1 连接到BC7281的 DAT
KEY EQU 2 ;PORTA.2 连接到BC7281的 KEY
;********************************
; 上电复位
;********************************
ORG 0X7FF
GOTO START
ORG 0X000
;**********************************************
; 向BC7281发送一个字节,待发数据存于W
;**********************************************
SEND MOVWF DATA_OUT
CLK_OUT BCF PORTA,CLK ;在CLK输出一脉冲
BSF PORTA,CLK
WAIT1 BTFSC PORTA,DAT ;如果DAT未变为低电平,则继续输出脉冲
GOTO CLK_OUT
BCF PORTA,CLK ;如果检测到DAT低电平,则15us内再送一脉冲
BSF PORTA,CLK
WAIT2 BTFSS PORTA,DAT ;等待DAT恢复高电平
GOTO WAIT2
MOVLW 8
MOVWF BIT_COUNT ;设定发送计数器
MOVLW 0XFC
TRIS PORTA ;DAT线设为输出状态
SEND_LOOP BCF PORTA,DAT ;输出一位
BTFSC DATA_OUT,7
BSF PORTA,DAT
BCF PORTA,CLK ;输出一CLK脉冲
BSF PORTA,CLK
RLF DATA_OUT
NOP ;短暂延时
NOP
NOP
NOP
DECFSZ BIT_COUNT
GOTO SEND_LOOP
BSF PORTA,DAT
MOVLW 0XFE ;重设DAT为输入状态
TRIS PORTA
NOP ;指令间短暂间隔
NOP
NOP
RETLW 0
;***********************************************
; 从BC728X读出一个字节,读出的字节在 DATA_IN
;***********************************************
RECEIVE BCF PORTA,CLK ;输出一CLK脉冲
BSF PORTA,CLK
WAIT3 BTFSC PORTA,DAT ;等待DAT低电平
GOTO WAIT3
BCF PORTA,CLK ;再输出一CLK脉冲
BSF PORTA,CLK
MOVLW 8
MOVWF BIT_COUNT ;设定计数器
RECV_LOOP NOP ;短暂延时
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RLF DATA_IN ;DATA_IN左移一位
BCF DATA_IN,0 ;设置bit0
BTFSC PORTA,DAT
BSF DATA_IN,0
BCF PORTA,CLK ;输出CLK脉冲
BSF PORTA,CLK
DECFSZ BIT_COUNT
GOTO RECV_LOOP
NOP
NOP
NOP
NOP
RETLW 0
;*********************************************
; 初始化
;*********************************************
START MOVLW 0XFE
TRIS PORTA ;设置各线状态, CLK为输出,其余为输入
MOVLW 0XFF
MOVWF PORTA ;设置CLK为高电平
MOVLW 0X32
MOVWF TIMER
START_DELAY MOVLW 0XFF ;上电延时以确保BC728X复位
MOVWF TIMER1
START_DELAY1 DECFSZ TIMER1
GOTO START_DELAY1
DECFSZ TIMER
GOTO START_DELAY
MOVLW 0X12 ;BC728X 初始化
CALL SEND
MOVLW 0X80 ;设为164模式,不反相
CALL SEND
;*********************************************
; 主程序
;*********************************************
MAIN BTFSC PORTA,KEY ;等待按键
GOTO MAIN
MOVLW 0X93 ;读键值锁存器指令(地址0x13)
CALL SEND
CALL RECEIVE ;读出键值
MOVLW 0X15 ;HEX译码寄存器
CALL SEND
MOVLW 0X0F
ANDWF DATA_IN,1 ;键值低四位显示在DIG0
CALL SEND
MOVLW 0X15 ;HEX译码寄存器
CALL SEND
MOVLW 0XF0
ANDWF DATA_IN
SWAPF DATA_IN,1 ;取键值高四位,存入W
IORLW 0X10 ;写入DIG1
CALL SEND
GOTO MAIN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -