在以往的设计中,有可能会出现IO口不够用的情况。扩展IO口的方法和芯片很多,但是我往往选择74hc164来扩展输出口。可能是以前做的大多是消费电子的原因,对硬件成本很敏感。
以下是调试好的子程序,复制的程序中即可用,现在网上流传的程序,总会有这样那样的错误,真不知道是有意的还是无意的。
C语言子程序,在holtek的语言环境通过。
作用: 发送一个字节
入口参数: number ;出口参数: 无
调用全局变量: 无
使用前需定义好clk_164 ,ab_164的管脚。
*******************Transmit and Recive ********************/
void Transmit164(unsigned char number) // Transmit a byte;
{unsigned char i="8";
do{i--;
CLK_164=0;
AB_164=(bit)(number&0x80);
number="number"<<1;
CLK_164=1;
}while(i!=0);
}
/******************************************************/
// 用74hc164发送一位。
void Transmit1Bit(unsigned char number) // Transmit a bit from 74hs164
{CLK_164=0;
AB_164=(bit)(number&0x80);
CLK_164=1;
}
/**********************************************************/
下面是汇编写的程序,在pic16系列中编译通过。
;***************************************************************SUB_TRANSMIT发送子程序。
;入口参数:W
;出口参数:无
;所用的参数:Transmit_cnta Transmittb
; 扩展74LS164 LS164_CLK LS164_AB
; #define LS164_CLK XX.X
; #define LS164_AB XX.X
;*****************************************************************
SUB_TRANSMIT BCF STATUS,RP1 ;BANK0
BCF STATUS,RP0
MOVWF Transmit_cnta ;W--》COUNTA,左移一位---》RA2
MOVLW D'8'
MOVWF Transmittb
AGA_LI1 RRF Transmit_cnta,1
BTFSC STATUS,C ;IF C="1" THEN RA2<---1 ELSE 0--->RA2
GOTO SETBRA2
BCF LS164_AB
GOTO XIA_DISPLAY1
SETBRA2 BSF LS164_AB
XIA_DISPLAY1 NOP
BSF LS164_CLK
NOP
BCF LS164_CLK
NOP
DECFSZ Transmittb,1
GOTO AGA_LI1
CLRWDT
RETURN
;*************************************************************************
我希望能有更多的人来共享子程序。让我们的开发不要老做重复性的基层工作。今天就到这吧。
文章评论(0条评论)
登录后参与讨论