完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
成品代码
话不多说,直接看最后可以直接使用的代码。 (如果不需要学习编写代码的思路,看到这里就ok了~) # -*- coding:utf-8 -*- from time import sleep_ms from pyb import Pin, Timer from random import randrange dio = Pin('X10', Pin.OUT_PP) rclk = Pin('X11', Pin.OUT_PP) sclk = Pin('X12', Pin.OUT_PP) num_freq = [0 ,0 ,1 ,500 ,0 ,-1 ] ### 待刷新num *主循环num *刷新频率 显示频率 计时操作 *floatnum中保留的小数位数 ### 显示小数时,num_freq[5]调到0~3 # num_freq[1] = int( '''x''' * pow(10,num_freq[5]) ) ## 只显示整数,num_freq[5] = -1即可 # num_freq[1] = '''x''' LED = (0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90) ### 0 1 2 3 4 5 6 7 8 9 ### 带点即该数代表位置 -128(-0x80) def LED_OUT(x): for i in range(1,9): if x&0x80: dio.high() else: dio.low() x<<=1 #二进制左移,即为 x=x*2 sclk.low() sclk.high() def autoshow(t): global num_freq num_freq[4]+=1 if num_freq[4] >= num_freq[3]//num_freq[2]: num_freq[4]=0 num_freq[0] = num_freq[1] for i in range(0,4): lednum = (num_freq[0]//pow(10,i))%10 if i == num_freq[5]: LED_OUT(LED[lednum]-0x80) else: LED_OUT(LED[lednum]) LED_OUT(0x01*pow(2,i)) rclk.low() rclk.high() def assignment_num(x,y): global num_freq num_freq[5] = y if y>=0 and y<=3: num_freq[1] = int( x * pow(10,num_freq[5]) ) if y==-1: num_freq[1] = int(x) tm5=Timer(5 , freq=num_freq[3] , callback=autoshow) #频率500Hz显示效果好 有4位数字同时显示的视觉效果 # x = 3412.3412 # print(x) # assignment_num(x,1) ''' 如果只是使用,可以不用管其他,直接将其他代码复制好,在主循环需要的地方调用assignment_num(x,y)就好; (x,y)中x是你想要数码管显示的数字(正数),int或float都可以; y是你需要显示的小数位数,可以选择-1或者0,1,2,3 -1则不显示小数点,只显示x的整数部分 0 1 2 3则分别保留0 1 2 3 位小数 (保留0位小数即点亮最右边的小数点,虽然没用,但还是与直接不显示小数点的-1区别开) ''' while True: x = randrange(0,10000)#float x/=pow(10,2) assignment_num(x,2) sleep_ms(1000) print(x) 实验器材&接线 实验器材: pyboard 一个(micropython_v1.1); YX55759-+4位数码管模块(某宝购买,个位数软妹币); 母母线5条。 接线: 如图,模块自上而下分别对应pyb: VCC >> 3V3 SCLK >> X12 RCLK >> X11 DIO >> X10 GND >> GND 代码思路&控制逻辑 模块的电路原理就不多说了,四个数码管放在一起用YX55759把引脚集合在了一起。这些都是模块内部的原理,与我们的程序无关,不如直接来看一下最基本的操作的逻辑吧: from pyb import Pin dio = Pin('X10', Pin.OUT_PP) rclk = Pin('X11', Pin.OUT_PP) sclk = Pin('X12', Pin.OUT_PP) ### 0 dio.high() sclk.low() sclk.high() dio.high() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() ###显示在第1位 dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.low() sclk.low() sclk.high() dio.high() sclk.low() sclk.high() rclk.low() rclk.high() 这是什么鬼?跟大家开了一个小玩笑,这当然不是拿来用的程序,只是看一个顺序,从高低电平的0 1信号看到编写改动代码的思路。 dio的01变化之后总是跟着一个sclk0,sclk1 连续八个可以代表一个八位的2进制数 {1 1 0 0 0 0 0 0}这第一个数是用来控制数码管显示的,这时的11000000代表数码管显示‘0’ {00000001}这是第二个数,显然,他代表着要在4位数码管的第一位显示,即最右边。把1左移,可以让他显示在左边其他位。 最后rclk 0 rclk 1 ,将操作写入,上锁。 于是,我们就可以利用十六进制数的list,把0~9(当然,abcdef也可以)存起来,然后用函数封装起来上述中最繁琐的重复操作: LED = (0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90) ### 0 1 2 3 4 5 6 7 8 9 ###小数点则 -128 def LED_OUT(x): for i in range(1,9): if x&0x80: dio.high() else: dio.low() x<<=1 #二进制左移,即为 x=x*2 sclk.low() sclk.high() 进入函数八次for循环 第一个if else判断该数(2进制形式)第7位是否是1;1则高电平,0则低电平; 接着<<=将二进制数左移,即第6位移到第7位,从7到0一共8位; sclk0 1。 LED_OUT(x)已经是一个可以正常使用的函数了,利用它和前面所介绍的逻辑, 分别将4个数显示顺序放在主循环中,或封装在函数放在主循环中,就可以正常显示了。 LED = (0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90) def LED_OUT(x): for i in range(1,9): if x&0x80: dio.high() else: dio.low() x<<=1 #二进制左移,即为 x=x*2 sclk.low() sclk.high() while True: for i in range(0,4): LED_OUT(LED[6]) LED_OUT(0x01*pow(2,i)) rclk.low() rclk.high() 显示四位数字6666 显然,进入循环的方式是不适合开发的,但是恰恰又是很多演示代码最喜欢的方式。我在文章的开头则给了一种利用定时器的方法。只需要调用一个函数,不占用CPU时间,欢迎大家参考借鉴。 应用 使用定时器之后不会与其他程序冲突,故可以作为一个检测模块的显示器使用。不影响你在项目开发时的其他运行过程,VCC GND之外拿出3个任意IO口即可。 更多的玩法,还请大家多多探索,分享出来~~~ |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 04:12 , Processed in 1.129906 second(s), Total 81, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号