#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIN = P1^0; // 数据输入
sbit CLK = P1^1; // 时钟
sbit CS = P1^2; // 片选
// MAX7219寄存器地址
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUTDOWN 0x0C
#define DISPLAY_TEST 0x0F
// 延时函数
void delay(uint ms) {
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
// 向MAX7219写入数据
void MAX7219_Write(uchar address, uchar dat) {
uchar i;
CS = 0; // 使能MAX7219
// 发送地址
for(i = 8; i > 0; i--) {
CLK = 0;
DIN = (address & 0x80) ? 1 : 0; // 发送最高位
address <<= 1;
CLK = 1;
}
// 发送数据
for(i = 8; i > 0; i--) {
CLK = 0;
DIN = (dat & 0x80) ? 1 : 0; // 发送最高位
dat <<= 1;
CLK = 1;
}
CS = 1; // 禁用MAX7219
}
// 初始化MAX7219
void MAX7219_Init() {
MAX7219_Write(SHUTDOWN, 0x01); // 退出关机模式
MAX7219_Write(DISPLAY_TEST, 0x00); // 关闭显示测试
MAX7219_Write(DECODE_MODE, 0x00); // 不使用BCD解码
MAX7219_Write(SCAN_LIMIT, 0x07); // 扫描所有8位
MAX7219_Write(INTENSITY, 0x0F); // 设置亮度为最大
}
// 主函数
void main() {
uchar i;
MAX7219_Init(); // 初始化MAX7219
while(1) {
// 显示0-7的数字
for(i = 1; i <= 8; i++) {
MAX7219_Write(i, i);
delay(500); // 延时500ms
}
}
} |