📄 text1.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>
unsigned char dis_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dot_dis_code[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char lig_code[3]={0xf1,0xf2,0xf4};
unsigned char VOUT;
sbit KEY1=P2^4;
sbit KEY2=P2^5;
sbit KEY3=P2^6;
sbit KEY4=P2^7;
//sbit CS =P3^2;
void delay(unsigned int N)
{
unsigned int i;
for(i=0;i<N;i++);
}
//***********************
sbit SDA=P3^4;
sbit SCL=P3^5;
//************************
//************************
//************************
/****************************************************************************/
bit ack=0; //应答信号标志位。
//*********************************
//******************************
//发送开始信号
//I2C总线的起始信号的程序。
void I2C_START()
{
SCL=1;
SDA=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=0;
}
//******************************
//******************************
//送八位数据
//主器件送从器件8位数据。
void I2C_SEND8BIT(unsigned char send_data)
{
unsigned char i,temp;
temp=send_data;
for(i=8;i>0;i--)
{
SDA=(temp&0x80);
SCL=1; _nop_(); SCL=0;
temp=temp<<1;
}
}
//******************************
//******************************
//接收八位数据
//主器件接收从器件指定地址的8位数据。
unsigned char I2C_RECEIVE8BIT()
{
unsigned char i;
ACC=0;
for(i=8;i>0;i--)
{
ACC=ACC<<1;
SCL=1; _nop_();
if(SDA==1) ACC=ACC|0x01;
SCL=0;
}
return(ACC);
}
//*********************************************
//******************************
//发送接收确认信号
void I2C_ACK()
{
SDA=1; SCL=1;
_nop_(); _nop_();
if(SDA==1)ack=1;
else ack=0;
SCL=0;
}
//*****************************
//*****************************
//发送结束信号
void I2C_STOP()
{
SDA=0;
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
SDA=1;
}
//******************************
//*******************************
/*------------------------------------------------------
写一个字节 Address地址 I2CDatata写入的数据
------------------------------------------------------*/
void I2C_WRITE(unsigned char Address,unsigned char dat)
{
do{
I2C_START();
I2C_SEND8BIT(0xa0); //从器件地址位是000,并且对从器件进行写操作。
I2C_ACK();
}while(ack==1); //=1,表示无确认,再次发送。 C为1转移。
I2C_SEND8BIT(Address);
I2C_ACK();
I2C_SEND8BIT(dat);
I2C_ACK();
I2C_STOP();
}
//******************************************************
//*******************************************
/*------------------------------------------------------
读一个字节 Address地址 Data读出的数据
------------------------------------------------------*/
unsigned char I2C_READ(unsigned char Address)
{
unsigned char I2CData;
do{
I2C_START();
I2C_SEND8BIT(0xa0); //从器件地址位是000,并且对从器件进行读操作。
I2C_ACK();
}while(ack==1); //=1,表示无确认,再次发送。 C为1转移。
I2C_SEND8BIT(Address);
I2C_ACK();
do{
I2C_START();
I2C_SEND8BIT(0xa1);
I2C_ACK();
}while(ack==1);
I2CData=I2C_RECEIVE8BIT();
I2C_ACK();
I2C_STOP();
return I2CData;
}
//***********************************************
void display(void)
{
unsigned char value[3];
unsigned char i;
value[0]=VOUT/100;
value[1]=VOUT%100/10;
value[2]=VOUT%10;
for(i=0;i<3;i++)
{
if(i==0 && value[0]==0) i+=1;
if(i==1)P0=dot_dis_code[value[i]];
else P0=dis_code[value[i]];
P2=lig_code[i];
delay(60);
P2=0xf0;
}
}
void ADD0_1(void)
{
if(KEY1==0) if(VOUT<=149)VOUT+=1;
while(KEY1==0)display();
}
void ADD1(void)
{
if(KEY2==0) if(VOUT<=140) VOUT+=10;
while(KEY2==0)display();
}
void DEC0_1(void)
{
if(KEY3==0) if(VOUT>=1) VOUT-=1;
while(KEY3==0)display();
}
void DEC1(void)
{
if(KEY4==0) if(VOUT>=10) VOUT-=10;
while(KEY4==0)display();
}
void GetKey(void)
{
if(KEY1==0)ADD0_1();
if(KEY2==0)ADD1();
if(KEY3==0)DEC0_1();
if(KEY4==0)DEC1();
// while ((P2&0xf0)^0xf0) display(); //等待按键释放
}
void main()
{
P2=0xf0;
VOUT=I2C_READ(0x01);
while(1)
{
P1=VOUT; WR=0; WR=1;
display();
GetKey();
I2C_WRITE(0x01,VOUT);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -