📄 s51_borad_test.c
字号:
//2005-6-4 21:25
//2005-6-9 9:10 修改
/*资源:
P00~P03 四个按键
P04 蜂鸣器
P05 LCD E
P06 LCD R/W
P07 LCD RS
P2 LCD数据端口
P22 24C02 SCL
P23 24C02 SDA
P30、P31 两个LED
HD7279 interface
MOTOR DRIVE interface
*/
//s51board test
/*功能:上电后24C02计数从0~99
液晶第一行显示24C02信息
按键1(靠近串口)红灯亮
按键2 绿灯亮
按键3 蜂鸣器响
按键4 灯灭、蜂鸣器停
操作按键时,液晶第二行有信息提示*/
#include " reg51.h "
#include " intrins.h "
/********************************************************************/
#define LCDIO P2
#define LINE1 0
#define LINE2 1
#define HIGH 1
#define LOW 0
#define CLEARSCREEN LCD_en_command(0x01)
#define LCD_DELAY_TIME 40
#define WRITE24C02 0xA0
#define READ24C02 0xA1
#define ACK 0
#define NO_ACK 1
#define MSB 0x80
#define KEY (P0&0x0F)
#define KEY1 0X0E
#define KEY2 0X0D
#define KEY3 0X0B
#define KEY4 0X07
#define BUZZER_ON BUZZER=0
#define BUZZER_OFF BUZZER=1
#define LED1_ON LED1=0
#define LED2_ON LED2=0
#define LED1_OFF LED1=1
#define LED2_OFF LED2=1
/********************************************************************/
sbit RS=P0^7; //数据、命令选择 1:数据 0:指令 4脚
sbit RW=P0^6; //读、写操作选择 1:读 0:写 5脚
sbit E=P0^5; //使能信号 6脚
sbit SDA=P2^3; //AT24C02串行数据 5脚
sbit SCLK=P2^2; //AT24C02串行时钟 6脚
sbit BUZZER=P0^4;
sbit LED1=P3^0;
sbit LED2=P3^1;
/********************************************************************/
void LCD_delay(void);
void LCD_en_command(unsigned char command);
void LCD_en_dat(unsigned char temp);
void LCD_set_xy( unsigned char x, unsigned char y );
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_init(void);
/********************************************************************/
void I2C_delay(void);
void I2C_start(void);
void I2C_stop(void);
void I2C_send_ack(bit k);
void I2C_write_byte(unsigned char dat);
unsigned char I2C_read_byte(void);
void I2C_write(unsigned char address,unsigned char dat);
unsigned char I2C_read(unsigned char address);
/********************************************************************/
void AT24C02_write(unsigned char address,unsigned char dat);
unsigned char AT24C02_read(unsigned char address);
/********************************************************************/
void Mcu_init(void); //系统初始化
void delay_nms(unsigned int n); //N ms延时函数
void Key_delay(void);
unsigned char count[2];
/********************************************************************/
void main(void)
{
unsigned char temp;
Mcu_init();
while(1)
{
AT24C02_write(0x00,count[1]);
temp=AT24C02_read(0x00);
LCD_write_string(0x00,LINE1,"AT24C02 TEST ");
LCD_write_char(0x0e,LINE1,(temp/10)|0x30);
LCD_write_char(0x0f,LINE1,(temp%10)|0x30);
AT24C02_write(0x00,count[1]);
if(KEY!=0x0F)
{
Key_delay();
if(KEY!=0x0F)
switch (KEY)
{
case KEY1:
LED1_ON;
LCD_write_string(0,LINE2,"KEY1 LED1 LIGHT ");
break;
case KEY2:
LED2_ON;
LCD_write_string(0,LINE2,"KEY2 LED2 LIGHT ");
break;
case KEY3:
BUZZER_ON;
LCD_write_string(0,LINE2,"KEY3 BUZZER RING");
break;
case KEY4:
BUZZER_OFF;
LED1_OFF;
LED2_OFF;
LCD_write_string(0,LINE2,"KEY4 STOP ALL ");
break;
default:
break;
}
}
}
}
s/***********************************************************************/
void timer0(void) interrupt 1 using 1
{
TH0=-(12000/256);
TL0=-(12000%256);
count[0]=count[0]+1;
if(count[0]==100)
{
count[0]=0;
count[1]=count[1]+1;
if(count[1]==99)
count[1]=0;
}
}
/***********************************************************************/
void Mcu_init(void)
{
TMOD=0x11;
TH0=-(12000/256);
TL0=-(12000%256);
EA=1;
ET0=1;
TR0=1;
LED1_ON;
LED2_ON;
BUZZER_ON;
delay_nms(100);
LED1_OFF;
LED2_OFF;
BUZZER_OFF;
LCD_init();
}
/***********************************************************************/
/******************************** I2C PART **************************/
void I2C_delay(void)
{
_nop_();_nop_();_nop_();_nop_();
}
/***********************************************************************/
void I2C_start(void)
{
SDA=HIGH;
_nop_();
SCLK=HIGH;
_nop_();
SDA=LOW;
_nop_();
SCLK=LOW;
_nop_();
}
/***********************************************************************/
void I2C_stop(void)
{
SDA=LOW;
_nop_();
SCLK=HIGH;
_nop_();
SDA=HIGH;
_nop_();
SCLK=LOW;
_nop_();
}
/***********************************************************************/
void I2C_send_ack(bit k)
{
SDA=k;
_nop_();
SCLK=HIGH;
I2C_delay();
SCLK=LOW;
}
/***********************************************************************/
void I2C_write_byte(unsigned char dat)
{
unsigned char i;
for (i=8;i>0;i--)
{
SCLK=LOW;
_nop_();
SDA=(bit)(dat&MSB);
dat<<=1;
I2C_delay();
I2C_delay();
SCLK=HIGH;
I2C_delay();
}
SCLK=LOW;
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char i,dat;
for (i=0;i<8;i++)
{
SCLK=LOW;
_nop_();
SDA=HIGH;
I2C_delay();
SCLK=HIGH;
dat<<=1;
I2C_delay();
if(SDA)
dat++;
}
SCLK=LOW;
return (dat);
}
/***********************************************************************/
void I2C_write(unsigned char address,unsigned char dat)
{
unsigned char temp;
temp=dat/10;
temp<<=4;
temp=dat%10+temp;
I2C_start();
I2C_write_byte(WRITE24C02);
I2C_send_ack(ACK);
I2C_write_byte(address);
I2C_send_ack(ACK);
I2C_write_byte(temp);
I2C_send_ack(NO_ACK);
I2C_stop();
}
/***********************************************************************/
unsigned char I2C_read(unsigned char address)
{
unsigned char temp,dat;
I2C_start();
I2C_write_byte(WRITE24C02);
I2C_send_ack(ACK);
I2C_write_byte(address);
I2C_send_ack(NO_ACK);
I2C_stop();
I2C_start();
I2C_write_byte(READ24C02);
I2C_send_ack(ACK);
dat=I2C_read_byte();
I2C_send_ack(NO_ACK);
I2C_stop();
temp=dat/16;
dat=dat%16;
dat=dat+temp*10;
return (dat);
}
/***********************************************************************/
/************************ 24C02 PART **********************************/
void AT24C02_write(unsigned char address,unsigned char dat)
{
_nop_();_nop_();_nop_();_nop_();
I2C_write(address,dat);
_nop_();_nop_();_nop_();_nop_();
}
/***********************************************************************/
unsigned char AT24C02_read(unsigned char address)
{
unsigned char temp;
_nop_();_nop_();_nop_();_nop_();
temp=I2C_read(address);
_nop_();_nop_();_nop_();_nop_();
return (temp);
}
/***********************************************************************/
/******************** LCD PART *************************************/
void LCD_delay(void)//延时子函数
{
unsigned char i;
for(i=LCD_DELAY_TIME;i>0;i--); //保证lcd复位的最小延时
}
/********************************************************************/
void LCD_en_command(unsigned char command)//写命令函数
{
LCDIO=command;
RS=LOW;
RW=LOW;
E=LOW;
LCD_delay();
E=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)//写数据函数
{
LCDIO=dat;
RS=HIGH;
RW=LOW;
E=LOW;
LCD_delay();
E=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y ) //设置地址函数
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
LCD_en_command(address);
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)//写字符函数
{
LCD_set_xy( x, y );
LCD_en_dat(dat);
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)//写字符串函数
{
LCD_set_xy( X, Y ); //写地址
while (*s) // 写显示字符
{
LCDIO=*s;
LCD_en_dat(*s);
s ++;
}
}
/********************************************************************/
void LCD_init(void)//初始化子函数
{
CLEARSCREEN;//清屏
LCD_en_command(0x38);//设置8位串数据格式
LCD_en_command(0x0c);//开显示器
LCD_en_command(0x80);//显示起始地址
CLEARSCREEN;//清屏
}
/********************************************************************/
/******************* OTHER PART ***********************************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++)
;
}
/********************************************************************/
void Key_delay(void)
{
unsigned char temp;
unsigned int i;
for(temp=25;temp>0;temp--)
for(i=50;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -