单片机基础模块——数码管模块

1.原理

单片机基础模块——数码管模块_第1张图片

共阳极数码管:0 - 亮        1 - 灭

共阴极数码管:0 - 灭        1 - 亮

编码推导

该单片机中所用的是共阳极数码管,即0亮1灭
按照 dp -> g -> f -> … ->a 的顺序写出
单片机基础模块——数码管模块_第2张图片

数码管常见字段码

单片机基础模块——数码管模块_第3张图片

2. Seg.c 代码

从原理图可以看到,我们需要对数码管进行位选(选择哪一个数码管进行显示)和段选(选择数码管显示的数据)。(图中为两个74HC573锁存器,在LED模块内有写)
其中abcdefg 和dp 为段选,com1-8 为位选。
单片机基础模块——数码管模块_第4张图片
基本思路同Led灯相同
#include 

unsigned char seg_dula[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x88};//段选数组,默认10为灭
unsigned char seg_wela[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选数组

void Seg_Disp(unsigned char wela,dula,point)//point是小数点的入口参数
{
	//段选消隐
	P0 = 0xff;//将LED全部关闭,0-亮	1-灭
	P2 = P2 & 0x1f | 0xe0;//打开锁存器选中Y7(0xe0-->1110 0000)
	P2 &= 0x1f;//关闭锁存器,打开锁存器瞬间P0的值已经输入,为了让其保持现在的状态并且不影响下一次,需要关闭锁存器

    //位选
	P0 = seg_wela[wela];
	P2 = P2 & 0x1f | 0xc0;//打开锁存器选中Y6(0xc0-->1100 0000)
	P2 &= 0x1f;//关闭锁存器
	
    //段选
	P0 = seg_dula[dula];
	if(point)//如果入口参数为1,则加上小数点
		P0 &= 0x7f;//加小数点:先正常的等于段选再与上小数点(0x7f-->0111 1111)(共阳极&	共阴极|)
	P2 = P2 & 0x1f | 0xe0;//打开锁存器选中Y7(0xe0-->1110 0000)
	P2 &= 0x1f;	//关闭锁存器
}

你可能感兴趣的:(单片机,单片机,嵌入式硬件,51单片机,蓝桥杯)