0x2

LED点阵屏

  • LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已

  • LED点阵屏与数码管一样,有共阴共阳两种接法,不同的接法对应的电路结构不同

  • LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

LED点阵屏分类

  • 按颜色:单色、双色(可显示三种颜色)、全彩

  • 按像素:8-8、16-16等

74HC595

  • 74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。

相当于一把手枪,SER填入子弹,SERCLK控制子弹装填(移位),多余的子弹从QH'口溢出,RCLK清空弹夹。同时,还可以将多个74HC595串联,拓展IO口。

要注意J24模块GND端,用文字取模软件生成代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
\*							main.c							*\
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
unsigned char code Animation[]= //动画数组 code关键词表示将此数组存储在flash中
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFE,0x90,0x98,0x64,0x02,0x00,0x02,
0x0C,0x30,0xD0,0x30,0x0C,0x02,0x00,0xFE,
0x80,0x70,0x1C,0x02,0xFE,0x00,0xFE,0x82,
0x82,0x44,0x38,0x00,0x7C,0x82,0x82,0x82,
0x7C,0x00,0xFE,0x02,0x02,0x02,0x00,0xFE,
0x90,0x90,0x80,0x00,0xFE,0x02,0x02,0x02,
0x00,0xFC,0x02,0x02,0x02,0xFC,0x00,0x7C,
0x82,0x82,0x82,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void main()
{
unsigned char i=0,Offset = 0 ,Count = 0;
MatrixLED_Init(); //初始化

while(1)
{
for (i = 0; i<8; i++)
MatrixLED_ShowColumn(i,Animation[i+Offset]);
Count++;
//Delay(100);不用Delay因为显示一次图像要逐列执行八次MatrixLED_ShowColumn,LED产生闪烁
if(Count>10)
{
Count = 0;
Offset++;
if(Offset>72) //避免数组越界
Offset = 0;
}
}
}
\* main.c *\




\* MatrixLED.c *\
#include <REGX52.H>
#include "Delay.h"


sbit RCK = P3^5 ; //RCLK,取P3第5位
sbit SCK = P3^6; //SRCLK,取P3第6位
sbit SER = P3^4 ; //SER,取P3第4位


#define MATRIX_LED_PORT P0 //LED显示寄存器

void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i); //从高位向低位写入
SCK=1; //上升延移位
SCK=0; //软件复位
}
RCK=1; //锁存
RCK=0; //软件复位
}

void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data); // 写入并锁存
MATRIX_LED_PORT=~(0x80>>Column); // 选择列写入
Delay(1);
MATRIX_LED_PORT=0xFF;
}

void MatrixLED_Init() //初始化
{
SCK=0;
RCK=0;
}
\* MatrixLED.c *\

DS1302实时时钟

  • DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能
  • RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片
  • DS1302 涓流充电计时芯片包含一个实时时钟/日历和 31 字节的静态 RAM.通过简单的串行通信。

  • 与时钟/RAM 通讯只需要三根线: CE, I/O (数据线), and SCLK (串行时钟). 数据输出输入时钟/RAM 一次1字节或者在脉冲串中多达 31 字节.

  • I/O口电平由命令字和数据组成
  • CE:操作使能
  • 根据第一位判断是写入还是读出
  • SCLK:上升沿,I/O口电平被写入。下降沿,DS1302输出数据。
  • 读比写少一个周期
  • 输出为BCD码,每相邻数字只有一位不同
    • DEC=BCD/1610+BCD%16; (2位BCD)
    • BCD=DEC/1016+DEC%10; (2位BCD)

从这开始就不写全部代码了(懒的敲yes!),主要写写思路:

通过定义一个数组来存储时间,修改时间也是通过修改时间数组来实现。通过Timeshow()来更新时间数组,通过TimeSet()来设置时间。通过DS1302_SetTime()将时间数组的更新写入时钟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//通过按键设置mode值,然后就调用对应函数
while(1)
{
KeyNum=Key();//读取键码
if(KeyNum==1)//按键1按下
{
if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切换
else if(MODE==1){MODE=0;DS1302_SetTime();}
}
switch(MODE)//根据不同的功能执行不同的函数
{
case 0:TimeShow();break;
case 1:TimeSet();break;
}
}
}

//每次TimeSetFlashFlag为1就熄灭,TimeSetFlashFlag每隔固定时间取反。
if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1," ");}
else {LCD_ShowNum(1,1,DS1302_Time[0],2);}

蜂鸣器