对于STC89C52来说,使用的是共阳极数码管。在这个部分主要掌握的是:1、数码管段显示的编码,即从0~f数据的十六进制表示2、数码管的静态显示和动态显示。很多时候需要同时使用多个LED数码管,比方说我们这个学期数字逻辑电路课程设计做的数字时钟。这时就需要选择合适的显示驱动方式。
对于静态显示,我感觉我的实践并不是很够,不过可以把我从书上看来的一些思想方法总结一下。主要思想是扩展。静态显示方式有两种实现方式:第一是通过串行接口扩展LED显示,其原理是利用单片机串行接口的模式0,再外接串入/并出的移位寄存器,扩展出多个8位并行I/0接口。第二是通过外部RAM地址空间进行扩展LED显示,其原理是,将单片机外部64KB的RAM空间的一部分作为扩展的I/O接口的地址空间,用其控制LED的显示。
对于动态显示,我亲自做了一个例子,对数字钟钟我的设计有了更加深入的理解。思想是:在时间上做文章,类似于时间片轮转的思想,给每一位数码管一定的时间,利用人的视觉停留效应,给人的感觉是所有的数码管同时显示,所以,你的眼睛有时会骗你,嘿嘿。实现方法有两种:一种是用电路实现,另一种是用程序实现;感觉用电路实现比较抽象,而用程序设置则比较容易思考。
例一:利用电路扫描实现:
原理解析:
显示模块原理:利用74293模八计数器来提供顺序信号,利用74138(3-8译码器)的输出来控制位码,然后利用4块74151(8选一数据选择器)来依次将六组数据送入到7447(7段译码器)的输入端,输出端控制段码。
例二:
利用程序控制,代码如下:
/************************************************ 用动态扫描方式,在8位数码上显示“12345678” ************************************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char //宏定义uchar替换unsigned char型 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, //定义0,1,2……9,a,b,c,d,e,f字符编码数组 0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay(int z); //延时函数声明 /*主函数*/ void main() { int i; P3=0xfe; //开段选,打开第一位数码管 while(1) //进入大循环,开始动态扫描 { for(i=0;i<8;i++) //依次扫描8位数码管 { P0=table[i+1]; //给段选端P0送字型码 delay(5000); P3=_crol_(P3,1); //循环右移(因硬件中数码管的小端在前, //所以调用循环左移函数实现右移) } } } /*定义延时函数*/ void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=50;y>0;y--); }
OK,终于又写完一篇总结了,这实验做得贼快,写总结慢得要死,O(∩_∩)O~,不能急啊,慢慢来。。。。。。