接着上一篇的数码管笔记
上一篇笔记我们了解了数码管是如何通过锁存器实现静态显示,今天我们来举个例子
假设我们要求第一个数码管显示“8”数字
#include <areg52.h>
sbit duan=P2^6;
sbit wei=P2^7; //分别对两个锁存器进行声明
void main()
{
wei=1 //打开U2锁存器
P0=0xFE; //将位选的信息送进去
wei=0; //关闭U2锁存器
duan=1; //打开U1锁存器
P0=0x7F; //送入段选的信息
duan=0; //关闭U1锁存器
while(1);
}
对于位选,0xFE表示11111110,因为数码管是共阴极,公共端也就是位选端代表阴极,段选端为阳极,电流从段选端,也就是那个abcdefgh口流入,从位选端流出,因此位选端低电平的时候才算是选中。关于段选,0x7F表示01111111,只有段选为高电平的时候,被选中的二极管才会发光。
以后记住了,共阴极数码管,段选要高电平,位选低电平;共阳数码管,段选低电平,位选高电平。
这里关于最后的while还要说明一下,如果没有这个while,单片机是会一直重复这个程序的,也就是说我们会看到数字并非前一刻看到的数字(当然数字是一样的),加了个while后单片机执行到这里就不在下去了,我们看到的数字仍就是前一刻的数字。
从上面我们可以看见,每次选择公共端以及发光二极管的时候,我们都要把相应的二进制数写出来,还要转换成十六进制,这样在输入次数多的情况下未免显得十分繁琐,因此我们不妨在程序的最开始便把所有的数字字母的编码列出来,之后直接引用即可。
unsigned char code table[]={
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
这个编码的定义方法和C语言中的数组定义差不多,就是在数据类型后面多了一个code,表示编码的定义。这里要注意,单片机的C语言定义一个数组是占用内存空间RAM的,而定义一个编码则是占用程序储存空间中,很显然后者能够提高内存空间使用效率的
unsigned char
表明数据类型,table表示这个数组的名称,以后引用数组就打名称。这一窜编码表示0~9、A、b、C、d、E、F,当然我们也可以将数码管玩出很多的图案,这就需要我们自己去写出各自的编码了
调用数组内的编码方式
P0=table[3]
这样就将数组中的第四个编码赋给了P0口,P0=0x4f
。这里强调下,[]中的数字是从0开始计算的,也就是说数字0对应第一个编码,以此类推。
接下来用以上掌握的只是来重新编写一个共阴极数码管静态显示的程序
#include <reg52.h>
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
unsigned char code a[]{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void delay(uint)
void main()
{
wei=1;
P0=0xc0; //0xc0=11000000
wei=0;
while(1)
{
for( unsigned