51单片机从零到实战(4)——数码管显示

📅 2026/7/18 13:36:43
51单片机从零到实战(4)——数码管显示
第 4 篇数码管——学会显示数字LED 只能表示开/关。数码管能显示 0-9让你的项目开始有信息量了。1. 数码管原理每个数码管内部是 7 个 LED 段a-b-c-d-e-f-g 1 个小数点dpa f b g e c d dp共阴数码管公共端接 GND段引脚给高电平就亮共阳数码管公共端接 VCC段引脚给低电平就亮本专栏用共阴数码管。2. 段码表// 共阴数码管段码a最低位, dp最高位// dp g f e d c b aunsignedcharcode seg_code[]{0x3F,// 0: 0011 11110x06,// 1: 0000 01100x5B,// 2: 0101 10110x4F,// 3: 0100 11110x66,// 4: 0110 01100x6D,// 5: 0110 11010x7D,// 6: 0111 11010x07,// 7: 0000 01110x7F,// 8: 0111 11110x6F,// 9: 0110 1111};// 使用P0 seg_code[5]; → 数码管显示 53. 动态显示——4 位数码管4 个数码管把段选a-g-dp并联位选分别接 4 个 IO 口。同一时刻只有 1 位数码管亮但切换速度 50Hz人眼看就是同时亮。sbit DIG1P2^0;// 第 1 位数码管的位选sbit DIG2P2^1;sbit DIG3P2^2;sbit DIG4P2^3;unsignedchardisp_buf[4]{1,2,3,4};// 显示 1234voiddisplay_scan(void)// 每 2ms 调用一次{staticunsignedcharpos0;// 先关所有位选防止鬼影DIG1DIG2DIG3DIG41;P0seg_code[disp_buf[pos]];// 段码switch(pos){case0:DIG10;break;case1:DIG20;break;case2:DIG30;break;case3:DIG40;break;}pos(pos1)%4;}4. 实战秒表unsignedintseconds0;voidmain(){while(1){// 更新显示缓冲disp_buf[0](seconds/600)%10;// 千位disp_buf[1](seconds/60)%10;// 百位disp_buf[2](seconds/10)%6;// 十位disp_buf[3]seconds%10;// 个位display_scan();// 每 2ms 调用一次delay(1);// 延时 1msstaticunsignedinttick0;if(tick500){// 每 500mstick0;seconds;if(seconds9999)seconds0;}}}5. 小结段码表是数码管驱动的核心存成 code 数组动态显示 快速轮流点亮人眼欺骗切换前先关闭所有位选防止鬼影定时器做动态扫描才是正确做法第 7 篇会讲下一篇C 语言补习——单片机必须掌握的语法下一篇C 语言补习——单片机必须掌握的语法