max7219级联程序,proteus软件仿真通过, 实际连接硬件出错,只有第一片显示正常,第二片不显示,请参见附件
//******************************************************************** //* 文件名:1.c //* 文件描述:PIC16F877,max7219级联显示1-8 //* 创建人:byk2005 2007年3月14日 //* 版本号:1.0 //* 修改记录: //*******************************************************************/ //包含单片机内部资源预定义
#include "pic.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define nop asm("NOP") #define sleep asm("sleep") #define din RB7 #define clk_1 RB5=1 #define clk_0 RB5=0 #define load_1 RB6=1 #define load_0 RB6=0 // 声明本模块中所调用的函数类型 //*************************************// void delay1s()//延迟1S { ulong d=177200; while(--d); } //延时5ms void delay5ms() { unsigned int d=500; while(--d); } //MAX7219驱动 void send(uchar data) { uchar i=8; nop; for (i=8;i>0;i--) { clk_0; data<<=1; din=CARRY; clk_1; } } void write(uchar add1,uchar dat1,uchar add2,uchar dat2) { load_0; //当LOAD为低电平时,芯片接收来自DIN的数据,接收完毕, send(add1); send(dat1); nop; clk_0;delay5ms(); nop; clk_1;delay5ms(); //从DIN输入的数据经过16.5个CLK脉冲后移到DOUT引脚上。 //所以发完16个数据后必须加一个脉冲,否则数据传不到第二片 send(add2); send(dat2); load_1; //LOAD回到高电平时,接收的数据将被锁定 }
void init7219() //先设置后面一片的工作方式,再设置前面一片的工作方式 {write(0x09,0xff,0x09,0xff); //设置译码方式,使用bcd译码 write(0x0a,0x08,0x0a,0x08); //设置亮度 write(0x0b,0x07,0x0b,0x07); //设置扫描的位数 write(0x0c,0x01,0x0c,0x01); //设置待机方式 } //*************************************// void test() //设置7219并测试其好坏 { write(0x01,2,0x01,1);//先送位,再送段/先发送给第2片 write(0x02,15,0x02,15); write(0x03,3,0x03,3); write(0x04,4,0x04,4); write(0x05,5,0x05,5); write(0x06,6,0x06,6); write(0x07,7,0x07,7); write(0x08,8,0x08,8); } //*************************************// //系统各I/O口初始化子程序 void initial() { OPTION=0b01000010; //1.6us=TMRO TRISB=0; INTCON=0b00000000; PORTB=0; GIE=0;//总中断使能 PEIE=0; T0IE=0; T0IF=0;INTF=0;
}
// 主函数
void main() {
initial(); //系统初始化 init7219(); delay1s(); //延时 test(); re: write(0x01,2,0x01,1); nop; delay1s(); goto re;
}
相关链接:https://bbs.21ic.com/upfiles/img/20073/200731565121906.rar |