⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fbtdog.c

📁 本程序,利用51单片机AT89C51来读写多功能芯片X5045的源程序
💻 C
字号:
//AT89C51单片机,12MHZ晶振,X5045,共阳LED数码管

#include "reg51.h"
#include "intrins.h"               	//_nop_();延时函数用

#define LEDag P0  					//LED笔画输出P口,P1.1~7对应a~g
#define WREN=0x06;					//5045操作指令,芯片写允许
#define WRDI=0x04;					//芯片写禁止
#define RDSR=0x05;					//读状态寄存器
#define WRSR=0x01;					//写状态寄存器
#define READ=0x03;					//从所选的地址单元开始,读取数据
#define WRITE=0x02;


sbit LEDA=P1^0; 					//LED片选信号,P3.0~5对应LEd1~6  	
sbit LEDB=P1^1;	
sbit LEDC=P0^0; 

sbit SO=P3^0;						//X5045数据输出
sbit SI=P3^1;						//X5045数据输入 
sbit SCK=P3^5;						//X5045时钟输入
sbit CS=P3^6; 						//X5045片选

/*
unsigned char code WREN=0x06;					//5045操作指令,芯片写允许
unsigned char code WRDI=0x04;					//芯片写禁止
unsigned char code RDSR=0x05;					//读状态寄存器
unsigned char code WRSR=0x01;					//写状态寄存器
unsigned char code READ=0x03;					//从所选的地址单元开始,读取数据
unsigned char code WRITE=0x02;					//向所选的地址单元开始,写入数据
*/									

unsigned char code LEDa_g[15]={0x80,0xf2,0x48,0x60,0x32,0x24,0x4,0xf0,0x0,0x20,0xfe, 0xe2,0x24,0x8c, 0x0};
	     //共阳LED段码表,对应  "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7" "8" "9" "不亮"  "J" "S " "℃" "全亮"

void Delay_ms(unsigned char ms)		// mS 延时,12M晶振时:(11+ms*1002)us,最大延时255ms。
   { unsigned char i;
     while (ms--){ for(i=90;i>0;i--){_nop_();_nop_();_nop_(); } } }

unsigned char ReadX5045_Byte(void)		//由X5045读取一字节
   { unsigned char Data,i;
	 for (i=8;i>0;i--){				   	
		SCK=1;
		SCK=0;
		if(SO) Data++;
//		Data|=(unsigned char)SO;
		Data<<=1; }  		//SCK下降沿,数据由SO输出,MCU在下1个SCK下降沿前读取
	 return Data; }

void WriteX5045_Byte(unsigned char Data)	//向X5045与入一字节
   { unsigned char i;
	 for (i=8;i>0;i--){
	 	SCK=0;
		if(Data&0x80) SI=1;		//SCK上升沿,数据SI被锁存,MCU在下1个SCK上升沿前提供数据
		else SI=0;
		Data<<=1;
		SCK=1; 	}
	 SI=0;  }


void WREN_cmd(void)
   { unsigned char Data;
     SCK=0;					/* Bring SCK low */
	 CS=0;
	 Data=WREN;					/* Bring /CS low */
 	 WriteX5045_Byte(Data);
	 SCK=0;					/* Bring SCK low */
	 CS=1;					/* Bring /CS high */
    }

unsigned char WriteSR(unsigned char Data)
   { unsigned char wip;
	 SCK=0;
	 CS=0;
	 do { wip=RDSR;
	 	  WriteX5045_Byte(wip);		//读X5045寄存器
	 	  wip=ReadX5045_Byte();}		//WIP=1,内部正在写
	 while (wip&0x01);				   	//等待内部写完成
     wip=WREN;
	 WriteX5045_Byte(wip);			   	//写允许置1
//	 WREN_cmd();
	 CS=1;
	 SCK=0;
	 CS=0;
	 wip=WRSR;
	 WriteX5045_Byte(wip);
	 WriteX5045_Byte(Data);
	 SCK=0;
	 CS=1;
     return 1; }
/*
uchar rdsr_cmd (void)
{
 uchar aa;
 SCK=0;
 CS=0;
 aa=RDSR_INST;
 outbyt(aa);
 aa=inputbyt();
 SCK=0;
 CS=1;
 return aa;
}

*/

unsigned char ReadSR()				 	//读X5045寄存器,任何时候都可以读
   { unsigned char Data;
	 CS=0;
	 Data=RDSR;
	 WriteX5045_Byte(Data);				//读X5045寄存器
	 Data=ReadX5045_Byte();		//WIP=1,内部正在写
	 CS=1;
     return Data; }

void DisplaySR(void)
   { unsigned char Data,temp;
     Data=ReadSR();
	 temp=Data&0xf;
	 LEDC=0;LEDB=0;LEDA=1;
 	 LEDag=LEDa_g[temp]|LEDC;
     CS=0;
	 CS=1;	  
	 Delay_ms(250); 
     CS=0;
	 CS=1;
	 temp=Data&0xf0;
	 temp>>=4;
	 LEDC=0;LEDB=1;LEDA=1;
 	 LEDag=LEDa_g[temp]|LEDC; 
	 Delay_ms(250); 
     CS=0;
	 CS=1;	 	 
	  }
/*
unsigned char WriteX5045_EEPROM_Byte(unsigned char Data,unsigned int Addr)
// 向X5045的EEPROM中写入一个字节,Data为写入的数,Address为写入地址 
   { unsigned char wip,Twrite;
	 CS=0;
	 do { WriteX5045_Byte(RDSR);	  	//读X5045寄存器
	 	  wip=ReadX5045_Byte();}		//WIP=1,内部正在写
	 while (wip&0x01);				   	//等待内部写完成
	 WriteX5045_Byte(WREN);			   	//写允许置1
	 CS=1; 								//写时序要求
	 SCK=0;
	 CS=0;
	 Twrite=(((unsigned char)(Addr>>8))<<3)|WRITE;		//计算高位地址,用(addr-0xff)<<3也行。												  //
	 WriteX5045_Byte(Twrite);						//发送写X5045命令及高位地址
	 WriteX5045_Byte((unsigned char)(Addr&0xff));	//发送写X5045低位地址
	 WriteX5045_Byte(Data);							//发送写X5045数据
//	 SCK=0;						 					//WriteX5045_Byte()运行完毕,SCK=1
	 CS=1;
     return 1;
  }


unsigned char ReadX5045_EEPROM_Byte(unsigned int Addr)
// 由X5045的EEPROM中读取一个字节,Address为地址 
   { unsigned char Data,wip;
	 CS=0;
	 do { WriteX5045_Byte(RDSR);		//读X5045寄存器
	 	  wip=ReadX5045_Byte();}		//WIP=1,内部正在写
	 while (wip&0x01);				   	//等待内部写完成
	 WriteX5045_Byte((unsigned char)(Addr>>8)<<3|READ);		//发送读X5045命令及高位地址
	 WriteX5045_Byte(Addr&0xff);							//发送读X5045低位地址
	 Data=ReadX5045_Byte();				//读取X5045数据
//	 SCK=0;						 		//WriteX5045_Byte()运行完毕,SCK=1
	 CS=1;
     return Data;
  }

*/
main()
  {	unsigned char i;
 

    WriteSR(0x0);	
 
		  
	while(1){
	 
	 LEDC=0;LEDB=0;LEDA=0;
	 for (i=0;i<10;i++) {
	 	 LEDag=LEDa_g[i]|LEDC;
		 Delay_ms(150); 
//		 CS=1; 
//	     CS=0;
//		 CS=1; 	 
		 Delay_ms(250); } 

}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -