亲,嗮出来的程序不够全哦,不过既然用MAX7219,那么对它的通信部分则都是一样的
MAX7219 除了电源两根线之外,还需要三根信号线连接至单片机
1、使能,即用来控制MAX7219是否允许写入数据的
2、时钟、每更换一位字节数据则需要输出一个脉冲,作为时钟信号
3、数据、在脉冲有效状态下传送数据,此数据是二进制位传递,非0即1
只要对MAX7219的数据传输摆弄明白,那么久可以随意控制MAX7219驱动的电子元件了,数码管也好,LED点阵也罢,都在掌握之内
MAX7219在进行通信的时候,是需要先送地址再送数据的,就是说要传递一个数据,就要进行两次通信
打个比方,例如想把鞋子收起来,然而鞋柜却很多,那么收起鞋子的步骤只能是 先确定要放在哪里,然后再将鞋子放进去,所以MAX7219的通信原理就是这么简单
话不多说,贴出个经过硬件测试通过的程序出来,供大家参考!
这是一个利用一片MAX7219的八位数码管显示模块,程序中只是为了试验,所以只显示固定数字12-34-56,程序中的星号是各个函数之间区分用的,可以删除
#include
sbit DN=P3^7; sbit CS=P3^6; sbit CL=P3^5;//MAX7219 端口定义
void MaxINT(void); void Max(char Xi,char Yi); void MaxR(char ch);// Max7219
void XSa(void);
/***************************************************************************/
void main(void)//主函数
{
MaxINT(); // MAX7219初始化
while(1)
{
XSa(); //数据显示
}
}
/***************************************************************************/
void XSa(void)//显示时钟数据
{
Max(1,6); Max(2,5); Max(3,0x0a);
Max(4,4); Max(5,3); Max(6,0x0a);
Max(7,2); Max(8,1);
}
/***************************************************************************/
void MaxINT(void)// MAX7219初始化
{
Max(0x0b,0x07);// 设置扫描界限
Max(0x09,0xff);// 设置译码模式
Max(0x0a,0x0a);// 设置亮度
Max(0x0c,0x01);// 设置工作模式
}
/***************************************************************************/
void Max(char Xi,char Yi)// Max7219 数据写入 主函数
{CS=0;MaxR(Xi);MaxR(Yi);CS=1;}
/***************************************************************************/
void MaxR(char ch)// Max7219 数据写入 子函数
{
char m,temp;
for (m=0;m<8;m++)
{
temp=ch&0x80; ch=ch<<1;
if(temp){DN=1;CL=0;CL=1;}
else{DN=0;CL=0;CL=1;}
}
}
错误在哪里?把错误列出来