$ title (BC728X Test Program, AT89C2051 @ 11.0592MHz) $ DB BIT_COUNT DATA 07FH TIMER DATA 07EH TIMER1 DATA 07DH TEMP DATA 07CH DATA_IN DATA 021H DATA_OUT DATA 020H CLK BIT P3.5 ;定义I/O口 DAT BIT P3.7 ; KEY BIT P3.3 ; ORG 000H JMP START ;************************************************************* ;* 上电初始化 ;************************************************************* ORG 100H START: MOV SP,#2FH ;设置堆栈 MOV TIMER,#50 START_DELAY: MOV TIMER1,#255 ;延时以确保BC728X完成复位 START_DELAY1: DJNZ TIMER1,START_DELAY1 DJNZ TIMER,START_DELAY MOV DATA_OUT,#12H ;BC728X初始化 CALL SEND MOV DATA_OUT,#80H ;设定为164模式, 不反相 CALL SEND ;************************************************************* ;* 主程序 ;************************************************************* MAIN: JB KEY,MAIN ;等待按键 MOV DATA_OUT,#93H ;读键值锁存器指令(地址13H) CALL SEND CALL RECEIVE ;读出数据 MOV DATA_OUT,#15H ;HEX译码指令 CALL SEND MOV TEMP,DATA_IN ANL TEMP,#0F0H ;键码高4位在第1位显示 MOV A,TEMP SWAP A ORL A,#10H MOV DATA_OUT,A CALL SEND MOV DATA_OUT,#15H ;HEX译码指令 CALL SEND MOV A,DATA_IN ANL A,#0FH ;取键码的低4位 MOV DATA_OUT,A ;在第0位显示 CALL SEND JMP MAIN ;*********************************************************** ;* 向BC728X发送一个字节子程序,待发送数据存于DATA_OUT ;************************************************************ SEND: CLR CLK ;在CLK输出一脉冲 SETB CLK WAIT1: JB DAT,WAIT1 ;等待DAT变为低电平 CLR CLK ;再输出一CLK脉冲 SETB CLK WAIT2: JNB DAT,WAIT2 ;等待DAT恢复高电平(输入状态) MOV BIT_COUNT,#8 SEND_LOOP: MOV C,DATA_OUT.7 ;输出BIT7 MOV DAT,C CLR CLK ;输出一CLK脉冲 SETB CLK MOV A,DATA_OUT RL A MOV DATA_OUT,A ;DATA_OUT左移一位 NOP ;短暂延时 NOP NOP DJNZ BIT_COUNT,SEND_LOOP SETB DAT ;恢复DAT为高电平 RET ;************************************************************* ;* 从BC728X接收一个字节子程序,接收到的数据存于DATA_IN ;************************************************************* RECEIVE: CLR CLK ;发出一CLK脉冲 SETB CLK WAIT3: JB DAT,WAIT3 ;等待DAT低电平响应信号 CLR CLK ;再发出一CLK脉冲,准备接收数据 SETB CLK MOV BIT_COUNT,#8 RECV_LOOP: NOP ;短暂延时 NOP NOP NOP NOP NOP NOP NOP MOV A,DATA_IN MOV C,DAT ;读入一位 RLC A MOV DATA_IN,A CLR CLK ;发出CLK脉冲 SETB CLK DJNZ BIT_COUNT,RECV_LOOP RET END