本节要完成的实验现象:8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
训练重点:
1、弄清楚数码管的段码与显示数值之间关系。
2、共阳数码管的基本控制方法,特别是弄清楚COM端与显示码的关系。
1、电路分析
2、共阳数码管F3461BH(4位8段)
显示内容的编码思路:
3、代码实现
/**************************************************************
实验现象:8个数码管分别单独依次显示0~9的值,然后所有数码管一起
同时显示0~F的值,如此往复
***************************************************************/
#include "reg52.h"
#include "intrins.h"
//1-9;A-F
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void HC138_state(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f)|0x80;
break;
case 5:
P2 = (P2 & 0x1f)|0xa0;
break;
case 6:
P2 = (P2 & 0x1f)|0xc0;
break;
case 7:
P2 = (P2 & 0x1f)|0xe0;
break;
}
}
//延时函数
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//初始化关外设
void InitSystem()
{
HC138_state(5);
P0=0x00; //蜂鸣器,继电器都关闭
}
//数码管显示内容与位置的函数
void SMG_Show_Bit(unsigned char dat,unsigned pos)
{
HC138_state(6); //数码管的位置
P0 = 0x01 << pos;
HC138_state(7); //数码管的内容
P0 = dat;
}
void SMG_Static()
{
//数码管分别单独显示0-9
unsigned char i,j,k;
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
SMG_Show_Bit(SMG_duanma[j],i);
Delay500ms();
}
}
//数码管同时显示0-f
for(k=0;k<16;k++)
{
HC138_state(6); //数码管的位置
P0 = 0xff;
HC138_state(7); //数码管的内容
P0 = SMG_duanma[k];
Delay500ms();
}
}
void main()
{
InitSystem();
while(1)
{
SMG_Static();
}
}
4、代码分析
1.显示内容
//1-9;A-F;-;.一共18个字符
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
2.控制数码管的显示内容与位置的函数
//数码管显示内容与位置的函数
void SMG_Show_Bit(unsigned char dat,unsigned pos)
{
HC138_state(6); //数码管的位置
P0 = 0x01 << pos;
HC138_state(7); //数码管的内容
P0 = dat;
}
其中显示内容dat=SMG_duanma[i];位置pos=0~7,对应板子第0~7位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)