单片机 74ls164 IO 口驱动程序 串入并出 源代码(C语言 附源文件及仿真程序) 因为89c2051总共才有20个引脚 所以在实现复杂功能的单片机应用中 节约针脚的使用显得尤为重要 我最近在做 单片机项目时已开始客户要求的功能少 所以采用 89c2051的p1口直接驱动 两个led数码管(外加两个扫描控制脚 p3_3 p3_4)这样光显示部分就占用了9个脚 开始的几个控制系统还可以满足需要 可是后来 客户要一次加 三个功能 1.水平开关输入 2.缺水开关输入 3.状态报警输出 因为之前做的程序 20个脚正好全部用上 所以这次再加功能 再不更换单片机芯片的情况下 就只能 把显示电路 改为其他方式考虑到成本问题 采用常用的 74ls164驱动led比较实用 (74LS164 是TTL 八位串行入/并行输出移位寄存器) 经过两天的研究 现在终于完成了该项目的程序编写工作再此次编写过程中 我发现 网上讲的大多数都是 74ls164 汇编程序的例子 c语言的 几乎没有 所以在此奉上74ls164的c语言的源代码 其中驱动共阴数码管 和驱动共阳数码管时 程序是不同的 这一点 其他地方 还有书上并未 明确说明 所以在这要重点提一下。 c51源码和 Proteus仿真程序下载请点击下面链接(压缩包包括 共阴、共阳源文件 及仿真文件) #include "reg52.h" #define uint unsigned int #define uchar unsigned char sbit DAT=P1^1; sbit CLK=P1^2; uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0xe7f,0xff,0x00};//0-9,-,全灭 void sendbyte(uchar byte) { uchar num,c; num=tab[byte]; for(c=0;c<8;c++) { CLK=0; DAT=num&0x01; CLK=1; num>>=1; } } void delay_50ms(unsigned int t) { unsigned int j; for(;t>0;t--) for(j=6245;j>0;j--) {;} }
main() { unsigned char h; while(1){ for(h=0;h<10;h++){ delay_50ms(1); sendbyte(h); delay_50ms(10); } h=0; } }
|