51单片机+MACX7219驱动8位共阴数码管显示示例

51单片机+MACX7219驱动8位共阴数码管显示示例


📝驱动显示代码

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
#include <reg52.h>
#include <intrins.h>
sbit DIN = P2^0; //数据串出引脚
sbit CS = P2^1; //片选端
sbit CLK = P2^2; //移位时钟端
unsigned char disp_buff[8] = {2,1,10,1,2,10,1,6}; //显示的数字,数值为10的时候,显示“-”
// 延时函数
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0; i < 120; i++);
}
}
//写数据函数
void write\_data(unsigned char addr,unsigned char dat)
{
unsigned char i;
CS = 0; // 先写地址,片选置低,串行数据加载到移位寄存器
for(i = 0; i < 8; i++) //
{
CLK = 0; //时钟上升沿数据移入内部移位寄存器
addr <<= 1; //待发送的地址,每次左移一次,高位在前发送,
DIN = CY; //数据移位后,如果有溢出,则可以从进位位CY中获得溢出的数据位
CLK = 1;
\_nop\_();
\_nop\_();
CLK = 0; //下降沿时数据从DOUT移出
}
for(i = 0; i < 8; i++)
{
CLK = 0; //
dat <<= 1; //发送数据
DIN = CY;
CLK = 1;
\_nop\_();
\_nop\_();
CLK = 0;
}
CS = 1; //CS上升沿,数据锁存
}
//初始化函数
void init\_max7221(void)
{
write\_data(0x09,0xff); //编码模式
write\_data(0x0a,0x07); //亮度控制
write\_data(0x0b,0x07); //扫描数码管的位数
write\_data(0x0c,0x01); //工作模式
}
void main(void)
{
unsigned char i;
init\_max7221(); // 初始化
delayms(2);
for(i = 0; i < 8; i++)
{
write\_data(i+1,disp_buff[i]); // 显示8位
}
while(1);
}


📚驱动代码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1NoIBei1KTnmAsB-snbw6WA 
提取码:6iso

🌼示例二

数码管上显示数字1 - 8 。
在这里插入图片描述

  • 📝代码如下
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <reg51.h>

sbit CLK = P1 ^ 7; //MAX7219时钟信号线
sbit LOAD = P1 ^ 6; //数据加载线
sbit DIN = P1 ^ 5; //数据输入线

//寄存器宏定义
#define DECODE\_MODE 0x09 //译码控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN\_LIMIT 0x0B //扫描界限寄存器
#define SHUT\_DOWN 0x0C //关断模式寄存器
#define DISPLAY\_TEST 0x0F //测试控制寄存器

void Write7219(unsigned char addr, unsigned char wdata); //向MAX7219写数据函数声明
void init\_max7219(); //MAX7219初始化函数声明
//void timer\_ms(unsigned char tim); //毫秒级延时函数声明

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

函数名称:main
函数说明:主函数
入口参数:
出口参数:
其 它:

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

void main()
{
unsigned char i;
init\_max7219(); //MAX7219初始化函数
for (i = 1; i < 9; i++)
{
Write7219(i, i); //数码管显示1~8
}
while (1)
{

}

}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

函数名称:init\_max7219
函数功能:MAX7219初始化
入口参数:
出口参数:
其 它:

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

void init\_max7219()
{
Write7219(SHUT_DOWN, 0x01); //开启正常工作模式(0xX1)
Write7219(DISPLAY_TEST, 0x00); //选择工作模式(0xX0)
Write7219(DECODE_MODE, 0xff); //选用全译码模式
Write7219(SCAN_LIMIT, 0x07); //8只LED全用
Write7219(INTENSITY, 0x04); //设置初始亮度

}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

函数名称:w\_max7219
函数功能:向MAX7219写入数据
入口参数:addr MAX7219内部寄存器地址,wdata 写入内部寄存器的操作数值
出口参数:
其 它:

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

//地址、数据发送子程序

void Write7219(unsigned char address, unsigned char dat)
{
unsigned char i;
LOAD = 0; //拉低片选线,选中器件
//发送地址
for (i = 0; i < 8; i++) //移位循环8次
{
CLK = 0; //清零时钟总线
DIN = (bit)(address & 0x80); //每次取高字节
address <<= 1; //左移一位
CLK = 1; //时钟上升沿,发送地址
}

//发送数据
for (i = 0; i < 8; i++)
{
CLK = 0;
DIN = (bit)(dat & 0x80);
dat <<= 1;
CLK = 1; //时钟上升沿,发送数据
}
LOAD = 1; //发送结束,上升沿锁存数据
}




/\*-------------------------------------------------------------------------------------------

函数名称: TImer\_ms
函数说明: 1ms延时子程序
入口参数: tim为接收主调传来需延时的毫秒数,取值范围1~256,定时时间1~256ms
出口参数:
其 它:

------------------------------------------------------------------------------------------\*/

//void timer\_ms(unsigned char tim)
//{
// unsigned char i;
// while (tim--)
// {
// for (i = 0; i < 200; i++); //延时1ms
// }

//}

  • 📚程序源码和仿真资源
1
2
3
4
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/13AJ-cXNDT4y4fC7nKNP4cg
提取码: iz4s