以从0开始做4位8段共阴数码管3461AS驱动
1)问题产生
在上一篇“ 以PWM控制直流电机为例建一个简单的51工程框架”中已向大家介绍了一个封装好的8位8段数码管的驱动(如下图中FUNC文件夹下led8.c文件)。
但是该驱动电路是要有一定的硬件基础的(如下图):如2片74HC573。而我这里只有几个4位8段共阴数码管又没有74HC573,所以就得寻求用51直接驱动的方案了!
2)失败尝试
失败操作:直接在相应的引脚间加5伏电压来测试该数码管是否正常
结果:烧坏了2个3461AS
分析:被第二张图骗了,以为3461AS可以承受01电平产生的压差,而真实情况如下图:在P0口有10K的排阻,然后测量一下电压终于恍然大悟!
3)最终方案
在第二步到第三步之间还找到一个例子:他采用3-8译码器然后串联电阻进行保护。
因为有3-8译码器的例子我的直驱的想法得到进一步的验证,于是综合上面的分析给出了下面的方案:
4)使用方法
同样的我把关于3461AS封装起来(如下)
在要使用该功能的文件中首先包含头文件,然后引用DuanMa数组、TempData数组以及用于显示的Display函数。
然后在想要显示数据前把数据存储在TempData中(TempData[0]表示要显示的第一个数字,这里把共阴8段数码管显示从0~F的值存储在DuanMa数组中。因此要让第一个数字显示2则只要TempData[0]=DuanMa[2])。当在TempData中设置好要显示的信息后就可以调用Display函数进行刷新数码管显示(Display的第一个参数表示从第几个数码管开始显示,例如FirstBit=0表示从第一个数码管开始显示num位数据)
注:要保证Display有比较快的刷新频率
[51单片机] 以从0开始做4位8段共阴数码管3461AS驱动谈细节决定高质量DIY
35 4X8_Display驱动/4X8_Display/1.Opt
@@ -0,0 +1,35 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+ cExt (*.c)
+ aExt (*.s*; *.src; *.a*)
+ oExt (*.obj)
+ lExt (*.lib)
+ tExt (*.txt; *.h; *.inc)
+ pExt (*.plm)
+ CppX (*.cpp)
+ DaveTm { 0,0,0,0,0,0,0,0 }
+
+Target (Target 1), 0x0000 // Tools: 'MCS-51'
+GRPOPT 1,(Source Group 1),0,0,0
+
+OPTFFF 1,1,1,0,0,0,0,0,<.main.c><main.c>
+OPTFFF 1,2,1,0,0,0,0,0,<.display_4X8.c><display_4X8.c>
+
+
+TARGOPT 1, (Target 1)
+ CLK51=24000000
+ OPTTT 0,1,1,0
+ OPTHX 0,65535,0,0,0
+ OPTLX 120,65,8,<.>
+ OPTOX 16
+ OPTLT 1,1,1,0,1,1,0,1,0,0,0,0
+ OPTXL 1,1,1,1,1,1,1,0,0
+ OPTFL 0,0,1
+ OPTDL (S8051.DLL)()(DP51.DLL)(-p52)(S8051.DLL)()(TP51.DLL)(-p52)
+ OPTDBG 44029,0,()()()()()()()()()() ()()()()
+ OPTDF 0x0
+ OPTLE <>
+ OPTLC <>
+EndOpt
+
115 4X8_Display驱动/4X8_Display/1.Uv2
@@ -0,0 +1,115 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+Target (Target 1), 0x0000 // Tools: 'MCS-51'
+
+Group (Source Group 1)
+
+File 1,1,<.main.c><main.c> 0x0
+File 1,1,<.display_4X8.c><display_4X8.c> 0x0
+
+
+Options 1,0,0 // Target 'Target 1'
+ Device (AT89C52)
+ Vendor (Atmel)
+ Cpu (IRAM(0 - 0xFF) IROM(0 - 0x1FFF) CLOCK(24000000))
+ FlashUt ()
+ StupF ("LIBSTARTUP.A51" ("Standard 8051 Startup Code"))
+ FlashDR ()
+ Rgf (AT89X52.H)
+ Mem ()
+ C ()
+ A ()
+ RL ()
+ OH ()
+ UseEnv=0
+ EnvBin ()
+ EnvInc ()
+ EnvLib ()
+ EnvReg (Atmel)
+ OrgReg (Atmel)
+ TgStat=0
+ OutDir (.)
+ OutName (1)
+ GenApp=1
+ GenLib=0
+ GenHex=1
+ Debug=1
+ Browse=1
+ LstDir (.)
+ HexSel=0
+ MG32K=0
+ TGMORE=0
+ RunUsr 0 0 <>
+ RunUsr 1 0 <>
+ BrunUsr 0 0 <>
+ BrunUsr 1 0 <>
+ SVCSID <>
+ MODEL5=0
+ RTOS5=0
+ ROMSZ5=2
+ DHOLD5=0
+ XHOLD5=0
+ T51FL=80
+ CBANKS5=0
+ XBANKS5=0
+ RCB51 { 0,0,0,0,0,0,0,1,0 }
+ RXB51 { 0,0,0,0,0,0,0,0,0 }
+ OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IRO51 { 1,0,0,0,0,0,32,0,0 }
+ IRA51 { 0,0,0,0,0,0,1,0,0 }
+ XRA51 { 0,0,0,0,0,0,0,0,0 }
+ XRA512 { 0,0,0,0,0,0,0,0,0 }
+ C51FL=21630224
+ C51VA=0
+ C51MSC ()
+ C51DEF ()
+ C51UDF ()
+ INCC5 ()
+ AX51FL=4
+ AX51MSC ()
+ AX51SET ()
+ AX51RST ()
+ INCA5 ()
+ PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IncBld=1
+ AlwaysBuild=0
+ GenAsm=0
+ AsmAsm=0
+ PublicsOnly=0
+ StopCode=3
+ CustArgs ()
+ LibMods ()
+ BankNo=65535
+ LX51FL=292
+ LX51OVL ()
+ LX51MSC ()
+ LX51DWN ()
+ LX51LFI ()
+ LX51ASN ()
+ LX51RES ()
+ LX51CCL ()
+ LX51UCL ()
+ LX51CSC ()
+ LX51UCS ()
+ LX51COB ()
+ LX51XDB ()
+ LX51PDB ()
+ LX51BIB ()
+ LX51DAB ()
+ LX51IDB ()
+ LX51PRC ()
+ LX51STK ()
+ LX51COS ()
+ LX51XDS ()
+ LX51BIS ()
+ LX51DAS ()
+ LX51IDS ()
+ OPTDL (S8051.DLL)()(DP51.DLL)(-p52)(S8051.DLL)()(TP51.DLL)(-p52)
+ OPTDBG 44029,0,()()()()()()()()()() ()()()()
+ FLASH1 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ FLASH2 ()
+ FLASH3 ()
+EndOpt
+
12 4X8_Display驱动/4X8_Display/1.plg
@@ -0,0 +1,12 @@
+<html>
+<body>
+<pre>
+<h1>Vision2 Build Log</h1>
+<h2>Project:</h2>
+C:UsersLiTaoDesktop514X8_Display1.uv2
+Project File Date: 04/24/2015
+
+<h2>Output:</h2>
+</pre>
+</body>
+</html>
25 4X8_Display驱动/4X8_Display/display_4X8.c
@@ -0,0 +1,25 @@
+#include"display_4X8.h"
+
+unsigned char code DuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F
+unsigned char code WeiMa[]={0xbf,0xdf,0xef,0xf7};//分别对应相应的数码管点亮,即位码
+unsigned char TempData[4]; //存储显示值的全局变量
+
+//------------------------------------------------
+//4位8段共阴数码管显示函数
+//第一个参数为0表示从第一个数码管开始显示num个数
+//提前要显示的数要存在TempData中(TempData[0]表示要显示的第一个数)
+//------------------------------------------------
+void Display(unsigned char FirstBit,unsigned char Num)
+{
+ static unsigned char i=0;
+
+ DataPort=0x00; //清空数据,防止有交替重影
+ DataControl=0x00;
+
+ DataPort=TempData[i]; //取显示数据,段码
+ DataControl=WeiMa[i+FirstBit];
+
+ i++;
+ if(i==Num)
+ i=0;
+}
责任编辑:Davia
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。