1.共阳数码管原理实现
这是共阳数码管,所谓共阳的意思就是共阳极,每一个LED共用一个阳极,当控制LED的阴极为低电平时被点亮,如下图:
这里com1到com8为共阳口,例:
当com1设置为高电平时(黄色),第一个位置的8个led被激活,此时操作这八个灯的亮灭就能显示一个字符。
(6条消息) 共阳和共阴数码管详细段码(带图)_OMGMac的博客-CSDN博客_共阴极数码管段码
此博客归纳了一些断码(显示不同字符时8个LED灯的亮灭)
(6条消息) 共阳和共阴数码管详细段码(带图)_OMGMac的博客-CSDN博客_共阴极数码管段码
此博客归纳了一些断码
下面是共阳数码管接口的位置:
根据前面的学习,我们知道要首先给M74HC573M1R上电,具体方式请看笔记1、2、3。
2.代码实现
这里我们用到一个unsigned char code类型
这个类型是单片机变成里面独有的,code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,对应的还有data是存入RAM的意思。 程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理。
这么做是为了节约片上的RAM,一般低端的单片机,片上的data空间只有几十个字节,所以只能存在程序空间中。 因为定义的数据是常量,放在DATA或XDATA区中浪费了. 放在RAM区也需要在ROM里占用同样的大小,否则上电时,RAM里指定数据从何而来?反之,放在ROM的数据,只占ROM容量,如果不需要修改,当然放ROM了。故被定位在CODE(就是程序存储器)区内。
#include <reg52.h> //头文件
unsigned char code SMG_duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f}; // 数码管的断码表
void Delay(unsigned long int t) //延时函数
{
while(t--);
}
void HC138Init(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;//让Y4输出低电平,此时Y4C为高电平
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;//让Y5输出低电平,此时Y5C为高电平
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;//让Y6输出低电平,此时Y6C为高电平
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;//让Y7输出低电平,此时Y7C为高电平
break;
}
}
void showSMG(unsigned char position,unsigned char number) //字符显示函数
{
HC138Init(6); // 选通Y6C
switch(position)
{
case 1://第1个位置
P0 = 0x01;
break;
case 2://第2个位置
P0 = 0x02;
break;
case 3://第3个位置
P0 = 0x04;
break;
case 4://第4个位置
P0 = 0x08;
break;
case 5://第5个位置
P0 = 0x10;
break;
case 6://第6个位置
P0 = 0x20;
break;
case 7://第7个位置
P0 = 0x40;
break;
case 8://第8个位置
P0 = 0x80;
break;
}
HC138Init(7); // 选通Y7C
if(number == '0') //下面是显示各个字符
P0 = SMG_duanma[0];
else if(number == '1')
P0 = SMG_duanma[1];
else if(number == '2')
P0 = SMG_duanma[2];
else if(number == '3')
P0 = SMG_duanma[3];
else if(number == '4')
P0 = SMG_duanma[4];
else if(number == '5')
P0 = SMG_duanma[5];
else if(number == '6')
P0 = SMG_duanma[6];
else if(number == '7')
P0 = SMG_duanma[7];
else if(number == '8')
P0 = SMG_duanma[8];
else if(number == '9')
P0 = SMG_duanma[9];
else if(number == 'a')
P0 = SMG_duanma[10];
else if(number == 'b')
P0 = SMG_duanma[11];
else if(number == 'c')
P0 = SMG_duanma[12];
else if(number == 'd')
P0 = SMG_duanma[13];
else if(number == 'e')
P0 = SMG_duanma[14];
else if(number == 'f')
P0 = SMG_duanma[15];
else if(number == '-')
P0 = SMG_duanma[16];
else if(number == '.')
P0 = SMG_duanma[17];
}
void main()
{
//实现每一个位置从'0'显示到'.'
while(1)
{
int m;
for(m = 1;m<=8;m++)
{
showSMG(m,'0');
Delay(60000);
showSMG(m,'1');
Delay(60000);
showSMG(m,'2');
Delay(60000);
showSMG(m,'3');
Delay(60000);
showSMG(m,'4');
Delay(60000);
showSMG(m,'5');
Delay(60000);
showSMG(m,'6');
Delay(60000);
showSMG(m,'7');
Delay(60000);
showSMG(m,'8');
Delay(60000);
showSMG(m,'9');
Delay(60000);
showSMG(m,'a');
Delay(60000);
showSMG(m,'b');
Delay(60000);
showSMG(m,'c');
Delay(60000);
showSMG(m,'d');
Delay(60000);
showSMG(m,'e');
Delay(60000);
showSMG(m,'f');
Delay(60000);
showSMG(m,'-');
Delay(60000);
showSMG(m,'.');
Delay(60000);
}
}
}