#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/***************************************************************************/
/*********** 单片机引脚定义 ************/
/***************************************************************************/
sbit sda=P1^0; //I2C 数据传送位
sbit scl=P1^1; //I2C 时钟传送位
//
sbit rs=P2^2; //12864RS控制位
sbit rw=P2^1; //12864RW控制位
sbit e =P2^0; //12864E 控制位
/******************************************************************************/
/********** 数据部分 ***********/
/******************************************************************************/
#define IIC_READ 0x1D //定义读指令
#define IIC_WRITE 0x1D //定义写指令
uchar table4[10]="0123456789";
uchar table6[10]="hulala制作";
uchar table5[10] ="检测地平线";
/**************************************************************************/
/************ 各延时程序 **************/
/**************************************************************************/
void iic_delay() //5us延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void delay_50ms(uchar t)
{
uint j;
for(;t>0;t--)
for(j=6000;j>0;j--);
}
/************************************************************************/
/************** 12864显示部分 *****************/
/************************************************************************/
void write_cmd(uchar cmd) //函数功能:写指令
{
rs=0;
rw=0;
e=0;
P0=cmd;
delay_50us(1);
e=1;
delay_50us(1);
e=0;
}
void write_data(uchar dat) //函数功能:写数据
{
rs=1;
rw=0;
e=0;
P0=dat;
delay_50us(1);
e=1;
delay_50us(1);
e=0;
}
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X==0)
{X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
write_cmd(pos);
}
void init()
{
// LCD_PSB = 1;
// delay_1(5);
// LCD_RES = 0;
// delay_1(5);
// LCD_RES = 1;
// delay_1(5);
write_cmd(0x30);
delay_50us(10);
write_cmd(0x0C);
delay_50us(10);
write_cmd(0x01);
delay_50us(10);
}
/*********************************************************************/
/************** I2C通信部分 ***************/
/*********************************************************************/
void iic_start() //函数功能:I2C通信开始
{
sda=1;
iic_delay();
scl=1;
iic_delay();
sda=0;
iic_delay();
}
void iic_stop() //函数功能:I2C通信停止
{
sda=0;
iic_delay();
scl=1;
iic_delay();
sda=1;
iic_delay();
}
void iic_ack() //函数功能:I2C通信查应答位
{
sda=0;
scl=1;
iic_delay();
scl=0;
}
void iic_write_byte(uchar wdata) //函数功能:向I2C从机写入一个字节
{
uchar i,temp;
temp=wdata;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl = 0;
iic_delay();
sda=CY;
iic_delay();
scl=1;
iic_delay();
}
scl=0;
iic_delay();
sda=1;
iic_delay();
}
char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节
{
uchar x;
char data_data;
scl=0;
iic_delay();
sda=1;
for(x=0;x<8;x++)
{
scl=1;
iic_delay();
data_data=(data_data<<1)|sda;
scl=0;
iic_delay();
}
return data_data;
}
void iic_write(uchar byte_add,uchar wdata) //函数功能:按地址写入一字节数据
{ iic_start();
iic_write_byte(0x3a);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
iic_write_byte(wdata);
iic_ack();
}
char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据
{
char x;
iic_start();
iic_write_byte(0x3a);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
iic_start();
iic_write_byte(0x3b);
iic_ack();
x=iic_read_byte();
iic_stop();
return x;
}
void self_test7455() //函数功能:检测7455有没有插好
{ // 如果没有插好,1602将会显示
int j; // “No acceleration!"
char t;
delay_50us(10);
iic_write(0x16,0x05);
delay_50us(20);
t=iic_read(0x16);
if(t!=0x05)
{ lcd_pos(2,0);
for(j=0;j<10;j++)
{
write_data(table6[j]);
delay_50us(10);
}
while(1);
}
}
void sendx() //函数功能:向12864发送x轴测量数据
{
uchar x1,x2,x3,xsign;
char x;
x=iic_read(0x06);
if((x&0x80)==0x00)
{
xsign=0x2b; //+
}
else
{
xsign=0x2d; //-
x=x-0x01;
x=~x;
}
x1=(x/63);
x2=((x*100/63)%100)/10;
x3=(x*100/63)%10;
lcd_pos(0,0);
write_data('x');
write_data(xsign);
write_data(table4[x1]);
write_data(table4[x2]);
write_data(table4[x3]);
}
void sendy() //函数功能:向12864发送y轴测量数据
{
uchar y1,y2,y3,ysign;
char y;
y=iic_read(0x07);
if((y&0x80)==0x00)
{
ysign=0x2b; //+
}
else
{
ysign=0x2d; //-
y=y-0x01;
y=~y;
}
y1=(y/63);
y2=((y*100/63)%100)/10;
y3=(y*100/63)%10;
lcd_pos(1,0);
write_data('y');
write_data(ysign);
write_data(table4[y1]);
write_data(table4[y2]);
write_data(table4[y3]);
}
void sendz() //函数功能:向12864发送z轴测量数据
{
uchar z1,z2,z3,zsign;
char z;
z=iic_read(0x08);
if((z&0x80)==0x00)
{
zsign=0x2b; //+
}
else
{
zsign=0x2d; //-
z=z-0x01;
z=~z;
}
z1=(z/63);
z2=((z*100/63)%100)/10;
z3=(z*100/63)%10;
lcd_pos(2,0);
write_data('z');
write_data(zsign);
write_data(table4[z1]);
write_data(table4[z2]);
write_data(table4[z3]);
}
/***********************************************************/
/**************** 主函数 ****************/
/***********************************************************/
void ma7455_init()
{
iic_write(0x16,0x05);
}
void main()
{
uchar j;
init();
//self_test7455();
delay_50ms(2);
lcd_pos(2,0);
for(j=0;j<10;j++)
{
write_data(table6[j]);
delay_50us(10);
}
lcd_pos(3,0);
for(j=0;j<10;j++)
{
write_data(table5[j]);
delay_50us(10);
}ma7455_init();
while(1)
{ iic_write(0x10,0x15);//校正X值
iic_write(0x12,0x25);//校正Y值
// iic_write(0x14,0x10);//校正Z值
sendx();
delay_50ms(1);
sendy();
delay_50ms(1); }
}
显示屏一直闪不稳定 |