51单片机_数码管显示
在51单片机的应用中,数码管显示是一项基础且常见的功能。数码管能够显示数字和一些字符,通过内部的发光二极管(LED)来实现。根据公共端的不同,数码管分为共阳极和共阴极两种类型。在共阴极数码管中,所有LED的阴极连接在一起,而阳极则分别通过不同的引脚控制。要点亮特定的LED,只需在相应的阳极引脚上提供高电平信号。
数码管字符编码表(共阴/共阳对照)
字符共阴极段码(HEX)共阳极段码(HEX)说明二进制显示(abcdefg dp)数字00x3F0xC0数字00011 1111 / 1100 000010x060xF9数字10000 0110 / 1111 100120x5B0xA4数字20101 1011 / 1010 010030x4F0xB0数字30100 1111 / 1011 000040x660x99数字40110 0110 / 1001 100150x6D0x92数字50110 1101 / 1001 001060x7D0x82数字60111 1101 / 1000 001070x070xF8数字70000 0111 / 1111 100080x7F0x80数字80111 1111 / 1000 000090x6F0x90数字90110 1111 / 1001 0000大写字母A0x770x88字母A0111 0111 / 1000 1000C0x390xC6字母C0011 1001 / 1100 0110E0x790x86字母E0111 1001 / 1000 0110F0x710x8E字母F0111 0001 / 1000 1110G0x3D0xC2字母G0011 1101 / 1100 0010H0x760x89字母H0111 0110 / 1000 1001I0x060xF9字母I0000 0110 / 1111 1001J0x1E0xE1字母J0001 1110 / 1110 0001L0x380xC7字母L0011 1000 / 1100 0111O0x3F0xC0字母O0011 1111 / 1100 0000P0x730x8C字母P0111 0011 / 1000 1100S0x6D0x92字母S0110 1101 / 1001 0010U0x3E0xC1字母U0011 1110 / 1100 0001Y0x660x99字母Y0110 0110 / 1001 1001小写字母b0x7C0x83小写b0111 1100 / 1000 0011c0x580xA7小写c0101 1000 / 1010 0111d0x5E0xA1小写d0101 1110 / 1010 0001h0x740x8B小写h0111 0100 / 1000 1011n0x540xAB小写n0101 0100 / 1010 1011o0x5C0xA3小写o0101 1100 / 1010 0011r0x500xAF小写r0101 0000 / 1010 1111t0x780x87小写t0111 1000 / 1000 0111u0x1C0xE3小写u0001 1100 / 1110 0011y0x6E0x91小写y0110 1110 / 1001 0001特殊字符-0x400xBF减号/负号0100 0000 / 1011 1111.0x800x7F小数点1000 0000 / 0111 1111_0x080xF7下划线0000 1000 / 1111 0111=0x480xB7等号0100 1000 / 1011 0111空格0x000xFF全灭0000 0000 / 1111 1111全亮0xFF0x00所有段亮1111 1111 / 0000 0000普中51开发板使用的是两个4位的共阴极数码管,详细介绍如下:
74HC138译码器简介
作用:节省单片机I/O口
- //这里结合两张图片一起介绍
- // P2_4 = 1;P2_3 = 1;P2_2 = 1; 控制LED8
- // P2_4 = 1;P2_3 = 1;P2_2 = 0; 控制LED7
- // P2_4 = 1;P2_3 = 0;P2_2 = 1; 控制LED6
- // P2_4 = 1;P2_3 = 0;P2_2 = 0; 控制LED5
- // P2_4 = 0;P2_3 = 1;P2_2 = 1; 控制LED4
- // P2_4 = 0;P2_3 = 1;P2_2 = 0; 控制LED3
- // P2_4 = 0;P2_3 = 0;P2_2 = 1; 控制LED2
- // P2_4 = 0;P2_3 = 0;P2_2 = 0; 控制LED1
复制代码
数码管静态显示
- #include <REGX52.H>
- void Delay(unsigned int xms);
- //数码管段码表
- unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- //数码管显示子函数
- void Nixie(unsigned char Location,Number)
- {
- switch(Location) //位码输出
- {
- 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=NixieTable[Number]; //段码输出
- }
- void main()
- {
- Nixie(1,6); //在数码管的第1位置显示6
- while(1)
- {
-
- }
- }
- // 延时1ms
- void Delay(unsigned int xms) //@12.000MHz
- {
- unsigned char i, j;
- while(xms)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- xms--;
- }
- }
- // 现象:数码管的第1位置显示6
复制代码 让数码管数字动起来:0 ~ 9 循环显示
[code]#include void Delay(unsigned int xms);//数码管段码表unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示子函数void Nixie(unsigned char Location,Number){ switch(Location) //位码输出 { case 1 2_4=1 2_3=1 2_2=1;break; case 2 2_4=1 2_3=1 2_2=0;break; case 3 2_4=1 2_3=0 2_2=1;break; case 4 2_4=1 2_3=0 2_2=0;break; case 5 2_4=0 2_3=1 2_2=1;break; case 6 2_4=0;P2_3=1;P2_2=0;break; case 7 2_4=0;P2_3=0;P2_2=1;break; case 8 2_4=0;P2_3=0;P2_2=0;break; } P0=NixieTable[Number]; //段码输出}void main() { unsigned char i; while(1) { for(i = 0; i |