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

📄 89s51 led测试.c

📁 C8051汇编语言89s51 LED测试.C 。LCD显示
💻 C
字号:
#include <reg52.h>
/*
//定义LCD
sbit LCD_E=P1^3;
sbit LCD_RS=P1^4;
sbit LCD_WR=P1^5;
char LCD_nRow, LCD_nCol;

void LCD_Init(void);
void clearDisplay(void);
void LCD_clock(bit nRS, char ShowData);
void gotoXY(unsigned char nRow, unsigned char nCol);
*/

//定义LED
sbit LED2=P3^1;
sbit LED3=P3^2;

//定义按扭
sbit KEY0=P0^0;
sbit KEY1=P0^1;
sbit KEY2=P0^2;
sbit KEY3=P0^3;
sbit KEY4=P0^4;
sbit KEY5=P0^5;
sbit KEY6=P0^6;
sbit KEY7=P0^7;

//定义LED显示器
char DispBuff[8];
char DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//G=0xC2 o=0xA3 l=0xF9 d=0xA1   E=0x85 r=0xAF
//
void delayMS(unsigned int MS);
void delay10US(unsigned char US);
void Init_T0(void);
void ClrDisp(void);
void OneWord(unsigned char word, unsigned char num);


//定义I2C
#define AT24C02W 0xA0
#define AT24C02R 0xA1
sbit SDA=P3^6;
sbit SCL=P3^7;
void I_start(void);
void I_stop(void);
void I_init(void);
bit I_clock(void);
bit I_send(unsigned char iodata);
unsigned char I_receive(void);
void I_Ack(void);
bit E_address(unsigned int Address);
bit E_read_block(unsigned int addr, unsigned char* buff, unsigned char len);
bit E_write_block(unsigned int addr, unsigned char* buff, unsigned char len);

//---------------------------------------------------------------------
main()
{
	int i;
	int dispcount=7;	//disp循环计数器
	bit dispflag=1;		//disp循环标志

	bit flag=0;			//LED方向标志

	char buff1[]={0xC2, 0xA3, 0xA3, 0xA1};	//24C02写缓冲区
	char buff2[10];			//24C02读缓冲区
	
	delay10US(100);
	I_init();
	Init_T0();
	EA=1;
	ClrDisp();

loop1:
	//检测按键
	for(i=0; i<150; i++)
	{
		delayMS(5);
		if(P0!=0xFF)
			goto selkey;
	}

	//LED交替
	if(flag)
	{
		LED2=0;
		LED3=1;
		flag=0;
	}
	else
	{
		LED2=1;
		LED3=0;
		flag=1;
	}
	//DISP循环
	if(dispflag)
	{
		ClrDisp();
		DispBuff[dispcount]=DispTab[8];
		dispcount--;
		if(dispcount<0)
			dispcount=7;
	}

goto loop1;

//按键操作	
selkey:
	delayMS(5);	
	if(P0!=0xFF)
	{
		ClrDisp();
		dispflag=0;

		if(KEY0==0)
			OneWord(0,7);    	
		else if(KEY1==0)
			OneWord(1,6);    	
		else if(KEY2==0)
			OneWord(2,5);    	
		else if(KEY3==0)
			OneWord(3,4);    	
		else if(KEY4==0)
			OneWord(4,3);    	
		else if(KEY5==0)
			OneWord(5,2);    	
		else if(KEY6==0)
			OneWord(6,1);    	
		else if(KEY7==0)
			OneWord(7,0);    	

		//检查24C02
		if(KEY0==0 && KEY7==0)
		{
			E_write_block(0, buff1, 4);
			buff2[0]=0;
			E_read_block(0, buff2, 4);
			OneWord(0,7);    	
			OneWord(7,0);    	

			OneWord(2,7);    	//2402
			OneWord(4,6);    	
			OneWord(0,5);    	
			OneWord(2,4);   
			if(buff2[0]!=0)
			{
				DispBuff[3]=buff2[0];    	//Gold
				DispBuff[2]=buff2[1];    	//Gold
				DispBuff[1]=buff2[2];    	//Gold
				DispBuff[0]=buff2[3];    	//Gold
			}
			else
			{
				DispBuff[3]=0xFF;    	
				DispBuff[2]=0x86;    
				DispBuff[1]=0xAF;    
				DispBuff[0]=0xAF;    
			}
			while(P0!=0xFF);
		}
	}

goto loop1;

}
//----毫妙延时--------------------------------------------------------
void delayMS(unsigned int MS)
{
	unsigned char i;
	while(MS)
   	{
    	for(i=0; i<110; i++);
		MS--;
	}
}
//----10微妙延时--------------------------------------------------------
void delay10US(unsigned char n10US)
{
	unsigned char i;
	for(i=0;i<n10US;i++);
}
//---------------------------------------------------------------------
void Init_T0(void)
{
   TF0=0;
   TR0=1;
   TMOD&=0XF0;
   TMOD|=1;
   TH0=0XDC;
   TL0=0;
   ET0=1;
}
//---------------------------------------------------------------------
void T0_break(void) interrupt 1
{
	static char DispCount=0;

	TH0=0XFA;
	TL0=0;
	
	//扫描LED
	DispCount++;
	if(DispCount==8)
		DispCount=0;
	P3&=0xC7;
	P3|=DispCount<<3;
	P1=DispBuff[DispCount];
}
//---------------------------------------------------------------------
void ClrDisp()
{
	unsigned char i;
	for(i=0; i<8; i++)
		DispBuff[i]=0xFF;
}
//---------------------------------------------------------------------
void OneWord(unsigned char word, unsigned char num)
{
	if(word>9 || num>7)
	 	return;
	DispBuff[num]=DispTab[word];
}




//----I2C总线-------------------------------------------------------------
void I_init(void)
{
//  I2CTEST=0;
  SCL=0;
  I_stop();
}

void I_start(void)
{
   SCL=1;
   delay10US(1);
   SDA=0;
   delay10US(1);
   SCL=0;
   delay10US(1);
}
void I_stop(void)
{
   SDA=0;
   delay10US(1);
   SCL=1;
   delay10US(1);
   SDA=1;
   delay10US(1);
   SCL=0;
   delay10US(1);
}
bit I_clock(void)
{
   bit sample;
   SCL=1;
   delay10US(1);
   sample=SDA;
   SCL=0;
   delay10US(1);
   return sample;
}
void I_Ack(void)
{ 
   SDA=0;
   I_clock();
   SDA=1;
}
bit I_send(unsigned char iodata)
{
    unsigned char idx;
    for(idx=0;idx<8;idx++)
    {
       SDA=(bit)(iodata & 0x80);
	   iodata<<=1;
	   I_clock();
    }
    SDA=1;
    return (~I_clock());
}
unsigned char I_receive(void)
{
   unsigned char I_data=0;
   register unsigned char idx;
   for(idx=0;idx<8;idx++)
   {
       I_data*=2;
       if(I_clock())
          I_data++;
   }       
   return I_data;      
}
bit E_address(unsigned int Address)
{
   unsigned char taddr;
   I_start();
   if(!I_send(AT24C02W))
      return 0;
//   taddr=Address>>8;  
//   if(!I_send(taddr))
//      return 0;
   taddr=(unsigned char)Address;
   if(!I_send(taddr))
     return 0;         
   return 1;  
}
bit E_read_block(unsigned int addr, unsigned char* buff, unsigned char len)
{
   unsigned char idx;
//   while(PowFlags);   
   if(!E_address(addr))
     return 0;
   delay10US(2);  
   I_start();                     //重复起始信号和从机地址。
   if(!I_send(AT24C02R))
     return 0;
   for(idx=0; idx<len; idx++)
   {	
      buff[idx]=I_receive();	
	  if(idx!=(len-1))       
	     I_Ack();
   }
   SDA=1;
   I_clock();
   I_stop();
   return 1;
}
bit E_write_block(unsigned int addr, unsigned char* buff, unsigned char len)
{
   unsigned char idx;
//   while(PowFlags);   
   if(!E_address(addr))
      return 0;
   for(idx=0;idx<len;idx++)
     if(!I_send(buff[idx]))   
     {
         I_stop();
         return 0;
     }
   I_stop();
   delayMS(8);
   return 1;       
}

⌨️ 快捷键说明

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