89c52开发板, 如何利用74HC595驱动一个数码管,0到9循环?
推荐回答
#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char #define nop() _nop_();_nop_(); /*************************************************************/ sbit SCLR = P2^3; //移位寄存器清零端,对应 595 的 10脚 sbit SCK = P2^2; //移位寄存器时钟输入,对应595 的 11脚 SCK sbit RCK = P2^1; //存储寄存器时钟输入,对应595 的12 脚 RCK sbit SI = P2^0; //串行数据输入,对应 595的 14 脚 SI /*************************************************************/ uchar code table[]={0xc0,0xf9,0xa4,0xb0, <br> 0x99,0x92,0x82,0xf8, <br> 0x80,0x90,0x88,0x83, <br> 0xc6,0xa1,0x86,0x8e <br> }; //共阳极数码管编码表 void delayms(uint xms) { uchar i; while(xms--) for(i=0;i<114;i++); } /*********************************************************** 74HC595数据输入 ************************************************************/ void WR_74HC595(uchar Data) { uchar i; //////////////移入串行数据 for(i = 0; i < 8; i++) //循环 8次,刚好移完8位 { SCK= 0; //先将移位寄存器控制引脚置为低 SI = (bit)(Data & 0x80); //取数据的最高位 Data <<= 1; //将数据的次高位移到最高位 SCK = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位 } //////////////锁存 RCK = 0; //先将存储寄存器引脚置为低 _nop_(); //延时 RCK = 1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。 _nop_(); //延时 RCK = 0; //先将存储寄存器引脚置为低 } /************************************************************** 主函数 *****************************************************************/ void main(void) { uchar i; SCLR=1; P2= 0X0f; //四位数码管同时选中 P4 ~ P7输出 0 while(1) { for(i=0; i<10; i++) //显示 0-9 { WR_74HC595(table[i]); //传段码 delayms(500); //延迟时间 2ms以内 } } }