MC14489是一个将五个七段数码管和MPU相连的驱动器,它与MPU通过SPI串行外设通讯协议进行通讯。
它有两个状态:显示状态和设置数值状态,当PTE_PTE1==0时,切换到设置状态,当PTE_PTE==1 时,切换到显示状态。
显示字符
数码管显示的值与输入到底是什么关系呢?首先,看它的显示字符表
可见,它有两种显示模式,当我们输入一个十六进制的数字时,若为第一种模式,就直接显示出它,若为第二种模式,则显示对应的字符。
那么怎么切换这两种模式呢?在传递完五个十六进制数字之后,还要传递一个模式选择的8位二进制数,这个数字规定了每一个七段显示器到底用第一个模式还是第二个模式。
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
第五管模式 |
第四管模式 |
第三管模式 |
第二管模式 |
第一管模式 |
1 |
1到5位中,置0代表十六进制模式,置1代表扩展模式。
好了,显示什么字符已经很清楚了,那么小数点怎么操纵呢?
操纵小数点
在传递五个十六进制数字之前,要先传递一个十六进制数。其对应模式如下
0代表全都不亮
1 2 3 4 5 分别代表从右向左第几个小数点灯亮;
6代表最后两个小数点灯亮
7代表全都亮
8代表全都不亮
9 A B C D分别代表从右向左第几个小数点灯亮;
E代表最后两个小数点灯亮
好的,小数点的问题解决了,下面我们来熟悉一下它的工作流程。
点亮数码管8步走
(1) 设置初始化工作
(2) 禁止显示器工作
(3) 将小数点控制数作高位,第一个数码管的值做低位,送至SPDR,并延时
(4) 第2个数码管的值做高位,第3个数码管的值做低位,送至SPDR并延时
(5) 第4个数码管的值做高位,第5个数码管的值做低位,送至SPDR并延时
(6) 令PTE_PTE1=1,切换到显示状态,至此五个管子的数值和小数点输出完毕
(7) 令PTE_PTE1=0,切换到设置状态
(8) 将模式控制数送至SPDR并延时
(9) 令PTE_PTE1=1,切换到显示状态
下面分析一个实例
假程序中有一int型变量ans=0x9b;
SPCR=0x3a;//STEP1初始化设置,见串行接口相关文章,这两句话是死的,照写就行了
SPSCR=0x01;
DDRD=0xff;
DDRE=0xff;
PTE_PTE1=0;//STEP2,从显示工作状态切换到设置状态。
SPDR=0x80;//STEP3,8是小数点控制数,表示全不亮。0是第一个数码管的数值
delay();
SPDR=0xaf;//STEP4 ,a是第二个数码管的数值,由于选择了扩展模式,所以对照本文开头//表格,显示为U;f为第三个数码管的数值。
delay();
SPDR=ans;//STEP5,ans的值为9b,所以分别为第四个和第五个数码管的值
delay();
PTE_PTE1=1;//STEP6,五个数码管的值都设完了,切换工作状态表明传输完毕,这步必须有
PTE_PTE1=0;//STEP7,再次切换到设置状态
SPDR=0b000010001; //STEP8,设置每一数码管工作在十六进制模式还是扩展模式,见第二个表格
delay();
PTE_PTE1=1;//STEP9,切换到显示状态
显示为 。
显示十进制数
如果我想显示的是十进制数,怎么办呢?做一个转换函数即可,假设要显示的为b变量
b=23412;
b1=(int)b/10000;b1r=(int)b%10000;
b2=(int)b1r/1000;b2r=(int)b%1000;
b3=(int)b2r/100;b3r=(int)b%100;
b4=(int)b3r/10;b4r=(int)b%10;
b5=(int)b4r;
PTE_PTE1=0;
SPDR=b1;
delay(5);
SPDR=b2*16+b3;
delay(5);
SPDR=b4*16+b5;
delay(5);
PTE_PTE1=1;
PTE_PTE1=0;
SPDR=0x01;
delay(5);
PTE_PTE1=1;
这个例子要注意,由于八位机的处理能力有限,五位数不能大于32767。否则会发生回滚错误。
相信您读完这篇文章,再也不用去翻它的说明书了,一本看半天也不知道咋回事的书。