分为共阴极和共阳极。
要想时显示6,需要AFEDCG均点亮。对应共阴极段码1011 1110
四位一体数码管
让第三位显示1,共阴极连接。
通过位选1101 仅让第三个数码管导通。然后再进行段选0110 0000 使数码管置1
74HC245 双向数据缓冲器,为了提高驱动能力
DIR = VCC 时,把左边数据缓冲送到到右边去
DIR = 低电平时,把右边数据缓冲送到左边
高电平驱动电流有限,低电平驱动能力更强,这也是LED共阳极的原因。
74HC245 驱动能力是从VCC汲取过来的,能让数码管显示亮一点。
C是高位A是低位,CBA = 000时,
Y0有效,Y0是低电平有效
Y0 = 0,Y1~Y7 = 1,
也就是LED1 = 0
让LED6显示6
#include共阴极数码管断码#include // 延时xms void Delay1ms(unsigned int xms) //@11.0592MHz { unsigned char i, j; while (xms) // while里面是延时1ms的代码 { _nop_(); i = 2; j = 199; do { while (--j) ; } while (--i); --xms; } } void test1() { // 位选,让第六个数码管(LED6)导通 也就是Y5=0 P2_4 = 1; P2_3 = 0; P2_2 = 1; // 由于P2口也控制LED的亮灭,因此会产生引脚冲突,LED6数码管点亮的同时,D4也亮了 // 段选 0111 1101 P0 = 0x7D; while (1) { // 动态停机 } }
通过子函数调用实现,某个数码管显示某个数字。
unsigned char NixieTubeTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 对应0~9
void NixieTube(unsigned char location, unsigned char number)
{
// 位选
switch (location)
{
// LED8 是从左往右的第一个数码管
case 1:
P2_4 = 1;
P2_3 = 1;
P2_2 = 1;
break;
case 2:
P2_4 = 1;
P2_3 = 1;
P2_2 = 0;
break;
case 3:
P2_4 = 1;
P2_3 = 0;
P2_2 = 1;
break;
case 4:
P2_4 = 1;
P2_3 = 0;
P2_2 = 0;
break;
case 5:
P2_4 = 0;
P2_3 = 1;
P2_2 = 1;
break;
case 6:
P2_4 = 0;
P2_3 = 1;
P2_2 = 0;
break;
case 7:
P2_4 = 0;
P2_3 = 0;
P2_2 = 1;
break;
case 8:
P2_4 = 0;
P2_3 = 0;
P2_2 = 0;
break;
}
// 段选
P0 = NixieTubeTable[number];
}
void test2()
{
// 第一位显示1,然后变成第二位显示2
NixieTube(1, 1);
Delay1ms(500);
NixieTube(2, 2);
Delay1ms(500);
while (1)
{
}
}
void main()
{
test2();
}
动态数码管
// 动态数码管
void test3()
{
while (1)
{
NixieTube(1, 1);
NixieTube(2, 2);
NixieTube(3, 3);
}
}
void main()
{
test3();
}
利用视觉余晖,让每个数码管都显示,但这样会出现错位,3跑到1的位置上去了等。。。
数码管消影位选 段选 位选 段选 位选 段选 。。。
时间太短了,单片机速度太快,上一位的段选就直接串到下一位段选了。
解决办法:
位选 段选 清零 位选 段选 清零 位选 段选 清零 。。。
#include数码管驱动方式 尾声#include // 延时xms void Delay1ms(unsigned int xms) //@11.0592MHz { unsigned char i, j; while (xms) // while里面是延时1ms的代码 { _nop_(); i = 2; j = 199; do { while (--j) ; } while (--i); --xms; } } unsigned char NixieTubeTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 对应0~9 void NixieTube(unsigned char location, unsigned char number) { // 位选 switch (location) { // LED8 是从左往右的第一个数码管 case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; } // 段选 P0 = NixieTubeTable[number]; Delay1ms(1); // 延时1ms 让数字稳定显示 P0 = 0x00; // 清零 } // 动态数码管 显示学号 void test3() { while (1) { NixieTube(1, 2); NixieTube(2, 0); NixieTube(3, 2); NixieTube(4, 0); NixieTube(5, 1); NixieTube(6, 3); NixieTube(7, 5); NixieTube(8, 7); } } void main() { test3(); }
写文不易,如果有帮助烦请点个赞~
Thanks♪(・ω・)ノ
由于笔者水平有限,在今后的博文中难免会出现错误之处,本人非常希望您如果发现错误,恳请留言批评斧正,希望和大家一起学习,一起进步ヽ( ̄ω ̄( ̄ω ̄〃)ゝ,期待您的留言评论。
附GitHub仓库链接



