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

📄 带eeprom的显示调试.c

📁 Keil C51
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		*(pSMG+2) = table_NUM[temp];
		LingFlag = 1;
	}
	else 
		if (LingFlag == 0)
			*(pSMG+2) = 0xff;
		else
			*(pSMG+2) = 0xC0;
	*(pSMG+3) = table_NUM[tempNum];
}

/*-----------------------第一组数码管码指针指向处理函数---------------------

--------------------------------------------------------------------------*/
void ProcSMG(void)
{
//	uchar *pTemp1;
	if (MenuStFlag==1)
	{
		switch (MN[MenuId].ucMenuType)
		{
			case 1:
				pMenuSMG1 = SMGBIT[bittest(MenuTChar, 0)];
				break;
			case 2:
				ProcInt(MenuTInt, MenuSMGNum);
				pMenuSMG1 = MenuSMGNum;
				break;
			default:
				break;
		}	
	}
	else
	{
		pMenuSMG1 = MN[MenuId].pucSMG1;
	}
}


/*------------------------------数码管显示驱动函数------------------------------------
将指针SerIn指向的数码管码传送到数码管上显示出其所代表的字符,interval表示显示周期
-------------------------------------------------------------------------------------*/
void DispDrive(uchar *SerIN, uchar interval)
{
	DA = 0xFF;
	DISCLK = 0;		//第一次移位
	DISDAT = 1;
//	Delay_us(2);
	_nop_();
	_nop_();
	DISCLK = 1;
//	Delay_us(2);
	_nop_();
	_nop_();
	DISCLK = 0;		//第二次移位
	DISDAT = 0;
//	Delay_us(2);
	DA = *SerIN;
	DISCLK = 1;
	Delay_us(interval);
	DISCLK = 0;		//第三次移位
	DISDAT = 0;
//	Delay_us(2);
	DA = *(SerIN + 1);
	DISCLK = 1;
	Delay_us(interval);
	DISCLK = 0;		//第四次移位
	DISDAT = 0;		
//	Delay_us(2);
	DA = *(SerIN + 2);
	DISCLK = 1;
	Delay_us(interval);
	DISCLK = 0;		//第五次移位
	DISDAT = 0;
//	Delay_us(2);
	DA = *(SerIN + 3);
	DISCLK = 1;
	Delay_us(interval);
	DISCLK = 0;		//第六次移位
	DISDAT = 0;
//	Delay_us(2);
	DA = 0xFF;
	DISCLK = 1;		
}


/*---------------------------微秒级延迟函数--------------------
--------------------------------------------------------------*/
void Delay_us (uchar k)
{
	uchar i;
	for (i=0; i<k; i++);
}


void DispSMG(uchar *pSMG)
{
	DispDrive (pSMG, 200);	
}

/*--------------------------按键扫描函数------------------------
将扫描后按键值返回
---------------------------------------------------------------*/
uchar ScanKey(void)
{
	uchar idata n;
	uchar bdata TempKey1;
	uchar bdata TempKey2;
	uchar idata K;
	DA = 0xFF;		  //驱动74HC164芯片
	DISDAT = 1;		  //先将DISDAT置1,使之向流水灯一样
	DISCLK = 0;
	Delay_us(2);
	DISCLK = 1;		  //移入一位
	Delay_us(2);
	DISDAT = 0;		  //再将DISDAT复位
//	KEYIN = 1;
	for (n=0; n<5; n++)
	{
		DISCLK = 0;
		Delay_us(2);
		DISCLK = 1;
		Delay_us(2);
		//if (_testbit_(KEYIN))	 //此条语句与下一条语句效果不同,此条语句不能将KEYIN管脚的电平正确读出,正困惑中??????????
		if (KEYIN)				 //读KEYIN管脚电平,并据此判断
		{
			TempBit = 1;
			if (ucKeyCnts[n] < LCNT)
			{
				ucKeyCnts[n]++;
			}
		}
		else
		{
			TempBit = 0;
			ucKeyCnts[n] = 0;
		}
		TempBitByte <<= 1;
		DISDAT = 0;
	}
	TempBitByte >>= 1;
	for (n=0; n<5; n++)
	{
		if (ucKeyCnts[n] > SCNT)		   //短按防抖
		{
			KeySFlag = bitset(KeySFlag, 4-n);
		}
		if ((ucKeyCnts[n] >= LCNT) && (bittest(KeyLFlag, 4-n)==0))	   //长按
		{
			KeyLFlag = bitset(KeyLFlag, 4-n);	
		}
	}
	KeySFlag = KeySFlag & (~KeyLFlag);	//*****长按有效的话,短按就无效
	TempKey1 = KeySFlag;
	TempKey1 = (~TempBitByte) & TempKey1;		//只有在KeySFlag为1,并且按键已弹起后,短按才真正有效
	TempKey2 = KeyLFlag;					
	TempKey2 = TempBitByte & TempKey2;			//只有在KeyLFlag为1,且按键保持按下后,长按才真正有效
	KeySFlag = KeySFlag & TempBitByte;		  //在按键弹起后,KeySFlag失效为0
	KeyLFlag = KeyLFlag & TempBitByte;		  //在按键弹起后,KeySFlag失效为0
	K = TempKey1;							  //最后处理按键值
	if (bittest(TempKey2, 4)==1)
		K = bitset(K, 6);
	else 
		K = bitclr(K, 6);
	if (bittest(TempKey2, 1)==1)
		K = bitset(K, 5);
	else
		K = bitclr(K, 5);
	return K;
} 



void InitROM()
{
	uchar *array[16];
	Write_Flash(array, 0, 16);	
}

/*----------------------主函数----------------------------------
--------------------------------------------------------------*/
void main(void)
{
	InitT0();
//	InitROM();
	while (1)
	{
		key= ScanKey();
		_nop_();
		MenuOperat(key);
		ProcSMG();
		DispSMG(pMenuSMG1);
	}
}


//*************在我们仪表上测试所添加的程序*******************
void InitT0(void)
{
	TMOD = 0x02;
	ET0 = 1;
	TH0 = 0x00;
	TL0 = 0x00;
	EA = 1;
	TR0 = 1;	
}
//*************在我们仪表上测试所添加的程序*******************
void ResetWDT(void)	interrupt 1
{
	WDT = ~WDT;	
}




/*----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------*/


/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 1;
 _nop_();
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SDA = 0;
 _nop_();
}

/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 0;
 _nop_();
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SDA = 1;
 _nop_();
}

/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 0;
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 1;
}

/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 1;
 _nop_();
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SCL = 0;
 _nop_();
}

/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
 unsigned char i;
 AT24C02_WP = 0;
 for (i=0;i<8;i++)
 { 
  AT24C02_SCL = 0;
  input <<= 1;
  AT24C02_SDA = CY;			   //*************左移位后,移出的哪一位进入了CY中
  AT24C02_SCL = 1;
 
 }
 AT24C02_SCL = 0;			   //****以下为"接受确认信号"程序
 _nop_();
 AT24C02_SDA = 1;			   		//*****拉高管脚,准备读该管脚电平
 AT24C02_SCL = 1;
 _nop_();
 CY = AT24C02_SDA;			   //读"确认信息",如果返回1则表明写入失败
 AT24C02_WP = 1;
 return(CY) ;
}

/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
 {
 unsigned char temp,rbyte=0;
 for (temp = 8;temp != 0;temp--)
 {
  AT24C02_SCL = 0;
  _nop_();
  rbyte = (rbyte << 1) | AT24C02_SDA;				  //*****这样也可以按位并吗?AT24C02_SDA是不是代表着某个字节的最低位,其余位都为0
  AT24C02_SCL = 1;
  _nop_();
 }
 return rbyte;
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
 unsigned char Addr;
 Addr = nAddr;
 Start_Cond();    //写开始信号
 Write8Bit(WriteDeviceAddress);  //写驱动地址
 Write8Bit(Addr);   //写从EEPROM中读的开始地址
 Start_Cond();    //写开始信号
 Write8Bit(ReadDeviceAddress);  //写读数据指令
 while(--nLen)
 {

  *nContent=Read8Bit();  //读出内容
  nContent++;   //指针加1
  Ack();    //发确认信号,让24WC02继续发送数据
 }
 *nContent=Read8Bit();   //读一字节
 NoAck();    //发无确认信号,让24WC02停止发送数据
 Stop_Cond();    //发终止信号
 return(0);    //返回
}

/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF 
{
 unsigned char nLen;
 unsigned char Addr;
 nLen=8;
 Addr=8 *nPage;
 Start_Cond();
 Write8Bit(WriteDeviceAddress);
 Write8Bit(Addr);
 for(;nLen!=0;nLen--)
 {
     if(Write8Bit(0xff)) break;  //if Write8Bit() Return 1 Write Flase
 }
 Stop_Cond();
 return(CY);
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
 unsigned char i,temp;
 unsigned char Addr;
 Addr = nAddr;
 Start_Cond();     //写开始信号
 Write8Bit(WriteDeviceAddress);   //写驱动地址
 Write8Bit(Addr);    //写从EEPROM中写的开始地址 
 for(i = 0;i < nLen;i++)
 {
  if(Addr%8==0)   //每页8字节  //换页			  //*****为什么读EEPROM时不用换页呢?
  {
   Stop_Cond();
   _nop_();
   Start_Cond();
   Write8Bit(WriteDeviceAddress);
   Write8Bit(Addr);
  }
  temp = *nContent;
  if(Write8Bit(temp)) 	
  	break;  //如果失败则跳出循环
  nContent++;
  Addr++;
 }
 Stop_Cond();     //发停止信号
 return(CY);					   //*****CY来自Write8Bit(temp)
}

⌨️ 快捷键说明

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