本帖最后由 Linkfox.cc@灵狐 于 2018-2-7 18:07 编辑
前两天学习了一下led灯的点亮,个人认为比较简单加上最近事情比较多就没有上传点亮led灯这方面的笔记
关于数码管,其实跟led差不多是一个原理
但上面那句话只适用于单个数码管
而开发板上的数码管一共有8,个8*8=64?
这太多了可就不能用定义引脚来驱动了
参考了开发板的电路图发现驱动数码管有两个数码管锁存器
原理图如下
这两块芯片分别控制着数码管位和数码管中的led
我们可以看到上面的74HC573的12-19脚写着WE1-8控制着数码管的位
下面的74HC573的12-19脚写着A-H控制着单个数码管的段
这两个芯片的11脚分别连着P27和P28
查阅资料可知需要更改位或段都需要将其控制的芯片打开
那么首先我们要定义一下P27和P28
先写一下开头
[mw_shl_code=c,true]#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7; //位选
sbit du = P2^6;//段选
void main()
{
}
[/mw_shl_code]
再次查看开发板手册得知P0控制着数码管
然后打开段选,对P0赋值
[mw_shl_code=c,true]
du = 1;
P0 = 0x06; //定义显示“1”
du = 0;
[/mw_shl_code]
打开位选,对P0赋值
[mw_shl_code=c,true]
we = 1;
P0 =0xFE;//定义第一个数码管
we = 0;
[/mw_shl_code]
代码烧录,运行成功,数码管左1显示“1”
但是在实际应用过程中不能每一个字都算一遍这样太麻烦了
于是我们定义一个数组
[mw_shl_code=c,true]
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"};
[/mw_shl_code]
再定义一下数码管位置
[mw_shl_code=c,true]
uchar code led_en[]={
//从右向左
0xFF, //"0"
0x7F, //"1"
0xBF, //"2"
0xDF, //"3"
0xEF, //"4"
0xF7, //"5"
0xFB, //"6"
0xFD, //"7"
0xFE, //"8"
};
[/mw_shl_code]
数组前面加code定义的原因是C在定义数组时是占用内存空间的,使用code进行编码,在定义编码时直接分配到程序空间,节约内存。
所以代码可以改写成
[mw_shl_code=c,true]
du = 1;
P0 = leddata[1];
du = 0;
delay(5);
we = 1;
P0 = led_en[8];
we = 0;
[/mw_shl_code]
接下来写一个动态显示的过程
[mw_shl_code=c,true]
void delay(uint z)
{ //这个函数是编辑器自带的一个工具生成的,我目前为止还没有搞懂到底怎么延迟出来的
uint x,y;
for(x = z; x > 0; x--)
for(y = 114*7.1; y > 0 ; y--);
}
void main()
{
for(i = 0; i <= 10; i++)
{
du = 1;
P0 = leddata[i-1];
du = 0;
delay(5);
we = 1; ¡
P0 = led_en;
we = 0;
if (i==10){i=0;if (b==1){b=8;}else{b--;}}
delay(100);
}
}[/mw_shl_code]
但在运行过程中发现总会有数码管的残影,检查代码发现在循环时打开段选时候P0的值是上一次循环位选的值,找到问题修改代码,在du=1;前加上
[mw_shl_code=c,true]P0 = 0xFF;[/mw_shl_code]
这样问题就解决了
贴一下完整的代码[mw_shl_code=c,true]#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uint i;
uint b=8;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
};
uchar code led_en[]={
0xFF, //"0"
0x7F, //"1"
0xBF, //"2"
0xDF, //"3"
0xEF, //"4"
0xF7, //"5"
0xFB, //"6"
0xFD, //"7"
0xFE, //"8"
};
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114*7.1; y > 0 ; y--);
}
void main()
{
for(i = 0; i <= 10; i++)
{
P0 = 0xFF;
du = 1;
P0 = leddata[i-1];
du = 0;
delay(5);
we = 1;
P0 = led_en;
we = 0;
if (i==10){i=0;if (b==1){b=8;}else{b--;}}
delay(100);
}
}[/mw_shl_code]
以上内容仅为个人学习总结,如有错误之处和不足请大家多多指教谢谢。
|