一、发光二极管与数码管基础
1、发光二极管
圆头塑封发光二极管的正负极判断
- 长脚为正极,短脚为负极
- 电极小的为正极,电极大的为负极
- 圆弧形边缘的为正极,直线型边缘的为负极
- 以上方法都无法判断,则可以借助万用表进行测量
普通二极管的正向导通电压普遍在1.2V或以上,而一般的指示用发光二极管工作电流在2至20mA内。
2、数码管
数码管的“位”指的是有多少个数码管。
数码管的“段”指的是一个数码管有多少个发光二极管。
位码是决定那一个数码管能够被点亮,而段码是决定被选中的数码管点亮一个什么样的数字。
- 数码管的内部结构
共阴与共阴数码管来减少引脚的引出其中A表示共阳的公共端,而K来表示共阴的公共端
共阳和共阴的排列顺序是相同的,其排列如图所示:
共阳数码管清0来显示数码,共阴数码管置1来显示数码;
配置段亮灭状态的值叫做段码,使能多位公共端的值称为位码。
- 共阳数码管的段码和位码的设定
共阳数码管段码0-F的表示形式如下:
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- 共阴数码管的段码和位码的设定
共阴数码管段码0-F的表示形式如下:
u8 Buff[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
二、数码管显示操作
1、共阳数码管显示
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void Digital_Led_Play(void)
{
u8 num;
PC_DDR=0xFF;//配置PC端口为输出模式
PC_CR1=0xFF;//配置PC端口为推挽输出模式
PC_CR2=0x00;//配置PC端口低速率输出
while(1)
{
for(num=0;num<=9;num++)
{
LED=Buff[num];
delay(300);//延时便于观察LED情况
}
}
}
2、共阴数码管显示
u8 Buff[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Digital_Led_Play(void)
{
u8 num;
PC_DDR=0xFF;//配置PC端口为输出模式
PC_CR1=0xFF;//配置PC端口为推挽输出模式
PC_CR2=0x00;//配置PC端口低速率输出
while(1)
{
for(num=0;num<=9;num++)
{
LED=Buff[num];
delay(300);//延时便于观察LED情况
}
}
}
3、串行数码管
原理与如下:
代码如下:
#define DIO PG_ODR_ODR7//串行数据输入
#define RCLK PG_ODR_ODR6//锁存控制信号(上升沿有效)
#define SCLK PG_ODR_ODR5//时钟脉冲信号(上升沿有效)
//共阳数码管段码“0123456789AbCdEF熄灭-”
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//位码数组
u8 wei_table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Digital_Led_Play(void)
{
PG_DDR=0xFF;//配置PG端口为输出模式
PG_CR1=0xFF;//配置PG端口为推挽输出模式
PG_CR2=0x00;//配置PG端口低速率输出
PG_ODR=0x00;//初始化PG端口全部输出低电平
while(1)
{
LED8_Display(3,10);//显示数码"5"
LED8_Display(7,6);//显示数码"6"
}
}
void LED8_Display(u8 x,u8 y)
{
LED_OUT(LED_table[y]);//送出段码
LED_OUT(wei_table[x]);//送出位码
RCLK=0;
RCLK=1;//RCLK产生上升沿
delay(1);
}
void LED_OUT(u8 outdata)
{
u8 i;
for(i=0;i<8;i++)//循环8次
{
if (outdata & 0x80)//逐一取出最高位
DIO=1;//送出“1”
else
DIO=0;//送出“0”
outdata<<=1;//执行左移一位操作
SCLK=0;
SCLK=1;//SCLK产生上升沿
}
}