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

📄 saa1064.c

📁 SAA1064 7段数码管的驱动程序
💻 C
字号:
#include "reg92x.h" 

#define I2CBus_ACK 0x44
#define I2CBus_NOACK 0x40
#define I2CRestart 0x64
#define I2CStop 0x54
#define SLAW 0x76
#define COM  0x77	//最小电流
#define SUBA 0x00

unsigned char Led_Buff[3];

void I2CStart(void)
{
	//EI2C=1;			//开I2C中断使能
	I2CON=I2CRestart;	//启动I2C总线
	while(SI==0);		//启动中......  启动完毕SI=1						
}

void I2CSend(unsigned char send)
{
	I2DAT=send;		   	//待发送数据装入I2DAT
	I2CON=I2CBus_ACK;  	//清除SI准备发送
	while(SI==0);	   	//发送中......  发送完毕SI=1
}

void SAA1064(void)		//SAA1064芯片驱动
{
	unsigned char i=0; 

	I2CStart();			//启动I2C

	I2CSend(SLAW);		//发送从器件地址
	if(I2STAT!=0x18)	//发送完毕后检验是否有应答
	{
		I2CON=I2CStop;	//如果没有应答就停止I2C总线	
	}

	I2CSend(SUBA);		//发送从器件数据寄存器首地址
	if(I2STAT!=0x28)	//发送完毕后检验是否有应答
	{
		I2CON=I2CStop;	//
	}

	I2CSend(COM);		//发送从器件控制寄存器控制字
	if(I2STAT!=0x28)	//发送完毕后检验是否有应答
	{
		I2CON=I2CStop;	//
	}

	I2CSend(Led_Buff[0]);	//3rd 7 Seg. data
	if(I2STAT!=0x28)
	{
		I2CON=I2CStop;
	}

	I2CSend(Led_Buff[1]);	//2nd 7 Seg. data
	if(I2STAT!=0x28)
	{
		I2CON=I2CStop;
	}

	I2CSend(0);				//Empty
	if(I2STAT!=0x28)
	{
		I2CON=I2CStop;
	}

	I2CSend(Led_Buff[2]);	//1st 7 Seg. data
	if(I2STAT!=0x28)
	{
		I2CON=I2CStop;
	}

	I2CON=I2CStop;			//数据发送完毕释放总线
}

void WatchdogInitial(void)
{/*设置复位时间为1s*/
  WDL=0xE0;
  WDCON=0xC5;
  WFEED1=0xA5;
  WFEED2=0x5A;
}

void PoweronDelay (void)
{/*上电后延时300ms等待电源工作稳定*/
	unsigned int m,n;
	for (m=0;m<=250;m++)
	{
		for(n=0;n<=250;n++)
		{
		}
	}
}

void CpuInitial (void)
{
	PCON=0x80;	//SMOD1=1,SMOD0=0串口波特率单倍,确定UART工作模式;
	PCONA=0;	//电源控制寄存器设置;

	DIVM=0;		//使用片内RC振荡器,fosc=7.3728MHz;

	IEN0=0;		//禁止一切中断 
	IEN1=0;	    	//------------
	PSW=0;		//bank 0

	TMOD=0x11;  	//设置Timer0、Timer1工作方式1
	TCON=0;		//关闭定时计数器
	TH0=0;		//预存数值清零
	TL0=0;
	TH1=0;
	TL1=0;

	IP0H=0x12;	//中断优先级别 UART > timer0 > timer1  其余默认值
	IP0=0x18;

	EA=1;		//开中断管制
}

void CpuioInitial (void)
{
	//P0M1=0xF9;
	P0M1=0x31;
	//P0M2=0xCF; 
	P0M2=0; 

	P1M1=0xFC;
	P1M2=0x1C;

	P3M1=0x03;
	P3M2=0x02;

	P1=0x0F;	//IIC UART 4引脚未用状态不能为0
}

void I2CBaudrateInitial(void)
{
	I2SCLH=0x4B;	//设置波特率25kbps
	I2SCLL=0x4B;	//占空比50%
}

void UartInitial(void)
{/*BaudRate=CCLK/[(BRGR1,BRGR0)+16]*/

	SCON=0xF0;		//工作模式3,从机地址0xFF
	SSTAT=0x20;		//独立的TX/RX中断,无双缓冲

	BRGR1=0x02;
	BRGR0=0xF0;		//9600 bps @ 7.3728MHz

	BRGCON=0x03;	//启动BRG(Baud Rate Generator)
	ESR=1;			//开接收中断ES Rx,只收不发	
}

void Feeddog (void)
{/*循环喂狗*/
	EA=0;
	WFEED1=0xA5;
	WFEED2=0x5A;
	EA=1;
}

void main (void)
{   
	WatchdogInitial();
	PoweronDelay();
	CpuInitial();
	CpuioInitial();
	UartInitial();
	I2CBaudrateInitial();
	
	while(1)
	{
		Distance();
		ExchgtoNum();
		Charto7Seg();
		SAA1064();
		Feeddog();
	}
}

⌨️ 快捷键说明

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