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
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!