|
今天我们来学习ATmega128的IO端口控制数码管显示:
在我们日常工作中,有时需要显示一些简单的数字或者字符,给用户一个清晰的展示,比如时间、温度、转速等等、、、此时,我们就可以考虑使用数码管,今天我们就来学习怎样利用ATmega128来控制数码管显示数字。数码管是一种由多个发光二极管组成的半导体发光器件,说到这里大家就多多少少能明白点数码管的原理了吧?是不是想到了之前我们学习的发光二极管的原理?是的,他们的原理是一样的,而且数码管是单片机应用中最普遍的外围的显示器件。按照数码管中各个发光二极管的连接方式,我们可以分为共阳极数码管和共阴极数码管,常见的数码管可以给大家展示下:
图1 数码管显示界面
图2 数码管一般外形
接下来给大家简单介绍下一位八段的数码管的内部结构:如图3。 由8个发光二极管组成,通过点亮不同的发光二极管组合来显示数字0~9,有的用来显示字符A、F、C等等......或者符号“-”或者小数点。
图3 共阳极和共阴极数码管内部原理图
八段共阳极的数码是由8个发光二极管的阳极连接到电源VCC上,其他引脚用来连接ATmega128的IO端口的输出端,当发光二极管的阳极输入高电平,而对应的IO端口输出了低电平,这时相应位的发光二极管就被点亮,我们可以根据不同字段的发光二极管的不同组合来显示我们想显示的数字或者字符等等。同理,共阴极的数码管的阴极同接到地,阳极分别接到ATmega128的IO端口的输出端, 我们可以通过控制ATmega128的IO端口的输出端输出高低电平来控制相应字段的发光二极管被点亮。了解了数码管的原理,为了大家编程方便,特此奉上八段数码管的字形编码表一份:
图4 共阳极数码管字形编码表
图5 共阳极数码管字形编码表
有了上面的数码管字形编码表,我们就可以根据编码表直接驱动数码管显示相应的字符,当然了,我们也要考虑ATmega128单片机的IO口的驱动能力,以及发光二极管的电流,避免电流过大烧坏数码管:
好啦,废话不多说,设计的电路如下图6:
图6 共阳极数码管电路设计
我们选择了共阳极的数码管连接方式,数码管的公共端连接到VCC上,数码管的8位数据引脚连接到ATmega128的PA端口上,中间通过1KΩ的8位排阻做为限流电阻,用来控制数码管的电流,硬件电路设计好了,接着来编程设计:我们可以将数码管的字形编码先放在一个数组中,等到用的时候我们可以调用,然后用一个延时子程序用来控制数码管显示数字变化的时间间隔,再用一个计数器来指示当前应该显示的数字或者数字在字形编码数组中的位置:
#include<iom128v.h>
unsigned char const SEGtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void Delayms(uint MS)
main()
{
unsigned char i,j;
unsigned char counter=0;
DDRA=0Xff;
PORTA=0xFF;
while(1)
{
delay(50);
if(counter>=15)
{
counter=0;
}
else
{
counter++;
}
PORTA=SEGtable[counter];
}
}
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++);
}
void Delayms(uint MS)是我们在上一节中学习的延时子函数,若大家还有疑问,请返回上一节进行回顾。
好啦,软件硬件我们都搞定了,编译之后就可以下载到板子上面进行验证了......大家验证的效果如何呢?有没有看到从0到9数字循环变化呢?
我就先在这里给大家卖个关子,大家编译完成之后下载到板子上面验证时候发现数码管一直显示一个数字,而非循环显示,这是什么原因呢?大家可以先思考下,下节再给大家解答。感谢大家观看我们下期再见 |
|