;************************************************ ;* HD7279测试/演示程序 * ;* 此程序为PIC16C54单片机与HD7279的接口演示程序 * ;* 本程序与<< HD7279(A)技术手册(第二版) >>中所 * ;* 附的程序完全一致. 因评估板上没有预留PIC16C54 * ;* 的位置, 用户可以将板上的AT89C2051拔掉, 通过 * ;* 板上的外接CPU接口与用户的系统相连 * ;************************************************ TITLE "HD7279 测试" 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'33' ;设定延时时间为约100uS(对于HD7279A, ;外接R=1.5K,C=15PF时,该值为16) MOVWF TIMER DELAY_LOOP DECFSZ TIMER GOTO DELAY_LOOP RETLW 0 SHORT_DELAY MOVLW D'5' ;设定延时时间约为15uS(对于HD7279A, ;外接R=1.5K,C=15PF时,该值为3) MOVWF TIMER SHORT_LP DECFSZ TIMER GOTO SHORT_LP RETLW 0 ;*************************************** ; 发送1个字节到HD7279,高位在前 ;*************************************** 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位 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 ;检查是否8位均发送完毕 GOTO SEND_LOOP ;未发送完,发送下一位 BCF PORTA,DAT RETLW 0 ;************************************** ; 从HD7279接收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位数据 BCF PORTA,CLK ;设CLK为低电平 CALL SHORT_DELAY DECFSZ BIT_COUNT ;检查是否已接收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 0X19 ;延时约25MS MOVWF TIMER START_DELAY MOVLW 0XFF MOVWF TIMER1 START_DELAY1 DECFSZ TIMER1 GOTO START_DELAY1 DECFSZ TIMER GOTO START_DELAY MOVLW B'10100100' ;发复位(清除)指令 BCF PORTA,CS CALL SEND BSF PORTA,CS ;恢复CS为高电平 ;******************************************* ; 主程序 ;******************************************* MAIN BTFSC PORTA,KEY ;检查是否有键按下 GOTO MAIN MOVLW B'00010101' ;有键按下,发读键盘指令 CALL SEND ;发送指令 CALL RECEIVE ;从HD7279读入键码 BSF PORTA,CS ;设CS为高电平 ;**************************************** ; 16进制--BCD码转换 ;***************************************** CLRF TEN GET_DEC MOVLW D'10' SUBWF DATA_IN,W SKPC GOTO OVER MOVWF DATA_IN INCF TEN GOTO GET_DEC ;***************************************** ; 发送按键的BCD码到HD7279 ;***************************************** OVER MOVLW B'10100001' ;发送2次左移指令,使当前显示内容 CALL SEND ;左移,留出空位供显示新数据 MOVLW B'10100001' CALL SEND MOVLW B'10000001' ;下载数据且译码(方式0)指令(第2位) CALL SEND MOVFW TEN ;发送十位数字 CALL SEND MOVLW B'10000000' ;下载数据且译码(方式0)指令(第1位) CALL SEND MOVFW DATA_IN ;发送个位数字 CALL SEND BSF PORTA,CS ;置CS=1 WAIT BTFSS PORTA,KEY ;等待按键放开 GOTO WAIT GOTO MAIN END