📄 89s51 led测试.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 + -