打印
[资源共享]

c语言595驱动数码管,74hc595驱动数码管程序

[复制链接]
3580|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方QQ 于 2023-7-20 10:21 编辑

数码管的驱动分静态扫描和动态扫描两种,使用最多的是动态扫描,优点是使用较少的MCU的IO口就能驱动较多位数的数码管。数码管动态扫描驱动电路很多,其中最常见的是74HC164驱动数码管,这种电路一般用三极管作位选信号,用74HC164作段选信号,占用的MCU的IO口线随位数增加而增加,一般驱动四位以下数码管。如果要驱动四位以上数码管,用74HC595驱动最经典,只需4根IO口线就能驱动8位数码管,而且不存在消影问题,显示功能也很强大,是很实用的数码管驱动电路之一。

电路设计

在WSF-51DB开发板上,用两片74HC595驱动8位共阴极数码管(由两个4位共阴极数码管组成),一片作位选信号,另一片作段选信号。需要注意的是段选芯片与数码管的连接要使用100-200欧姆电阻作限流,不能太大也不能太小,更不能直接连接。



使用特权

评论回复
沙发
哈根达斯uz|  楼主 | 2023-3-30 18:26 | 只看该作者

使用特权

评论回复
板凳
哈根达斯uz|  楼主 | 2023-3-30 18:26 | 只看该作者
程序设计

/**************************************************************************

*程序名称:74HC595驱动数码管

*程序功能:数码管显示字符

*开发工具:WSF-51DB开发板

* MCU型号:AT89S52-24PU

*时钟频率:12MHZ

*程序作者:吴师傅

**************************************************************************/

#i nclude

unsigned char code segmcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极数码管段码0-f

unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//8位共阴极数码管位码

sbit ser=P2^0; //74HC595串行数据输入

sbit oe=P2^1; //74HC595使能,为0时输出数据,为1时呈高阻态

sbit rclk=P2^2; //74HC595数据锁存

sbit srclk=P2^3;// 74HC595串行时钟

//延时毫秒函数:

void Delayms(unsigned int t)

{

unsigned int x,y;

for(x=t;x>0;x--)

for(y=120;y>0;y--);//延时大约1毫秒

}

//任意位数码管显示一个字符函数:

void DTDisplayChar(unsigned char segmd,unsigned char bitd )//数码管段码和数码管位码

{

unsigned char i;

unsigned int dat;

dat=bitd;

dat=dat位码段码合并为一个int型数据

for(i=0;i位数据从高位依次移入74HC595

{

ser=(dat&0x8000)?1:0; //判断最高位,为真取1,为假取0

srclk=1; //上升沿送数据

srclk=0;

dat左移取下一位

}

rclk=1; //74HC595锁存数据

rclk=0;

}

//主函数:

int main(void)

{

unsigned char j,k;

oe=0; rclk=0;srclk=0;

DTDisplayChar(0xff,0x00);//数码管全亮

Delayms(2000);//延时2秒,检查数码管是否有缺画

while(1)

{

for(j=0;j显示0-f 16个字符

{

DTDisplayChar(segmcode[j],bitcode[j%8]);//从数组取出段码和位码

//要显示小数点只需在断码上或上0x80即可

for(k=0;k每个字符/闪烁5次

{

oe=0;//打开显示

Delayms(200);//延时200毫秒

oe=1;//关闭显示

Delayms(200);

}

}

/* for(j=0;j字符同时显示

{

DTDisplayChar(segmcode[j],bitcode[j]);//从数组取出段码和位码

Delayms(1);

} */

}

return 0;

}

使用特权

评论回复
地板
有何不可0365| | 2024-7-31 14:56 | 只看该作者
这个方法不仅减少了MCU的IO口占用,还能有效地控制多位数码管显示。

使用特权

评论回复
5
yangjiaxu| | 2024-7-31 16:22 | 只看该作者
这个不错,虽然程序不是很复杂,但是要配合电路进行设计,因为这算是串转并的操作了

使用特权

评论回复
6
亚瑟| | 2024-7-31 21:39 | 只看该作者
这样就能节省io

使用特权

评论回复
7
LEDyyds| | 2024-8-14 13:59 | 只看该作者
这种在多位数码管的场景下很实用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

325

帖子

0

粉丝