完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、数码管原理图
开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极);a–dp分别控制数码管每一位的八个段。它们两又分别被锁存器U6和U7控制着。 当com端为高电平,对应的a–dp为低电平时相应段码就会亮。如:com1为高电平,com2–com8为低电平,此时让dp为低电平,a–g为高电平,则第一个数码管只有dp亮,也就是亮一个点。 由于段码有八个,如果一个一个赋值很麻烦,因此一般用十六进制数一次性给段码进行赋值。十六进制数控制的段码显示如下: 二、数码管显示代码 下面举几个例子: 1、让数码管八个位都显示6(数码管静态显示) #include"reg52.h" ***it HC138_A = P2^5;//定义译码器中ABC所在引脚 ***it HC138_B = P2^6; ***it HC138_C = P2^7; void Show_SMG() { HC138_C = 1; //给CBA赋值,打通U6 HC138_B = 1; HC138_A = 0; P0 = 0xff; //com1-8设为高电平 HC138_C = 1; //给CBA赋值,打通U7 HC138_B = 1; HC138_A = 1; P0 = 0x82; //给八个段赋值显示6 } void main() { while(1) { Show_SMG(); } } 2、让数码管八个位从0显示到9(数码管静态显示) 为了方便,我们将所有要用的段码放在一个数组中;将选择锁存器的代码也进行优化,要理解这些的原理都要将十六进制转化为二进制来理解。 #include"reg52.h" unsigned char SMG_Duanma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码 void Delay(unsigned int t) { while(t--); } void SelectHC573(unsigned channel) //选择锁存器 { switch(channel) { case 6: //选择U6锁存器 P2 = P2 & 0x1f | 0xc0; break; case 7: //选择U7锁存器 P2 = P2 & 0x1f | 0xe0; break; } } unsigned char i; void ShowSMG() { SelectHC573(6); P0 = 0xff; //com1-8设为高电平 SelectHC573(7); for(i = 0; i<=9; i++) { P0 = SMG_Duanma; Delay(50000); Delay(50000); } } void main() { while(1) { ShowSMG(); } } 3、让数码管从0显示到99(数码管动态显示) 动态显示原理:让不同位的数码管只亮一小段极小时间,从而造成视觉暂留效果,人眼无法识别这极小段的熄灭时间,从而觉得这些不同位数码管是同时亮的。 上代码: #include"reg52.h" unsigned char SMG_Duanma[12]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码 void Delay(unsigned int t) { while(t--); } void SelectHC573(unsigned char channel) { switch(channel) { case 6: //选择U6锁存器 P2 = P2 & 0x1f | 0xc0; break; case 7: //选择U7锁存器 P2 = P2 & 0x1f | 0xe0; break; } } void ShowSMG_Bit(unsigned char pos, unsigned char value) //pos位显示value { SelectHC573(6); P0 = 0x01 << (pos - 1); SelectHC573(7); P0 = value; Delay(200); //消影 P0 = 0xff; //消影 } unsigned char i, j; void DelaySMG(unsigned int t) { while(t--) { ShowSMG_Bit(1, SMG_Duanma); //第一位显示SMG_Duanma Delay(200); ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j] Delay(200); } } void ShowSMG() { for(i = 0; i<=9; i++) for(j = 0; j <= 9; j++) { ShowSMG_Bit(1, SMG_Duanma); //第一位显示SMG_Duanma DelaySMG(200); ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j] DelaySMG(200); } } void main() { while(1) { ShowSMG(); } } ``` |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:21 , Processed in 1.180785 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号