#include <reg52.h>#include <intrins.h> //要用到_nop_();函数#define uchar unsigned char#define uint unsigned int/***************************************************************************/ /*********** 单片机引脚定义 ************/ /***************************************************************************/ sbit sda=P1^0; //I2C 数据传送位sbit scl=P1^1; //I2C 时钟传送位char x,y,z,num[9]={0,0,0};/****************************************************************************** //********** 数据部分 ***********//****************************************************************************** /#define IIC_READ 0x1D //定义读指令#define IIC_WRITE 0x1D //定义写指令#define LCD_data P0 //数据口sbit inter_0=P3^2;sbit LCD_RS = P2^7; //寄存器选择输入sbit LCD_RW = P2^6; //液晶读/写控制sbit LCD_EN = P2^5; //液晶使能控制sbit LCD_PSB = P2^4; //串/并方式控制void delay_1ms(uint x){uint i,j;for(j=0;j<x;j++)for(i=0;i<110;i++);}/*******************************************************************//* *//*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*//* *//*******************************************************************/void write_cmd(uchar cmd){LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P0 = cmd;delay_1ms(5);LCD_EN = 1;delay_1ms(5);LCD_EN = 0;}/*******************************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/ /* */ /*******************************************************************/ void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delay_1ms(5);LCD_EN = 1;delay_1ms(5);LCD_EN = 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); //显示地址}/*******************************************************************//* *//* LCD初始化设定 *//* *//*******************************************************************/ void lcd_init(){LCD_PSB = 1; //并口方式write_cmd(0x30); //基本指令操作delay_1ms(5);write_cmd(0x0C); //显示开,关光标delay_1ms(5);write_cmd(0x01); //清除LCD的显示内容delay_1ms(5);}uchar set_key_sign; //是否在设置状态标志uchar delaysign; //视觉停留标志uchar xposivalue; //x正方向满格显示g值uchar xnegavalue; //x反方向满格显示g值uchar yposivalue; //y正方向满格显示g值uchar ynegavalue; //y反方向满格显示g值//11111111 11111110 11111100 --- 10000000 00000000 led_ma[i]:i为亮灯数量uchar led_ma[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};uchar xposiupstate; //x正方向上8个LED显示状态uchar xposidownstate; //x正方向下8个LED显示状态uchar xnegaupstate; //x反方向上8个LED显示状态uchar xnegadownstate; //x反方向下8个LED显示状态uchar yupstate; //y方向上8个LED显示状态uchar ydownstate; //y方向下8个LED显示状态uchar xposilightnum; //x正方向亮灯数量(1——16)uchar xnegalightnum; //x反方向亮灯数量(1——16)uchar yposilightnum; //y正方向亮灯数量(1——8)uchar ynegalightnum; //x正方向亮灯数量(1——8)uchar ack_sign; //I2C 应答标志/**************************************************************************/ /************ 各延时程序 **************/ /**************************************************************************/ 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=6245;j>0;j--);}/*********************************************************************//************** 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=1;scl=1;iic_delay();ack_sign=sda;scl=0;}void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节{uchar i,temp,temp1;temp1=wdata;for(i=0;i<8;i++){scl = 0;iic_delay();temp=temp1;temp=temp&0x80;if(temp==0x80)sda=1;elsesda=0;iic_delay();scl=1;iic_delay();scl=0;iic_delay();temp1=temp1<<1;}}char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节{uchar x;char data_data;for (x=0;x<8;x++){data_data=data_data<<1;sda=1;iic_delay();scl=0;iic_delay();scl=1;iic_delay();if(sda==1)data_data|=0x01;//else// data_data&=0xfe;}return data_data;}void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据{uchar t;t=(IIC_WRITE<<1);iic_start();iic_write_byte(t);iic_ack();iic_write_byte(byte_add);iic_ack();iic_write_byte(wdata);iic_ack();iic_stop();}char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据{uchar t;char x;t=(IIC_WRITE<<1);iic_start();iic_write_byte(t);iic_ack();iic_write_byte(byte_add);iic_ack();t=((IIC_READ<<1)|0x01);iic_start();iic_write_byte(t);iic_ack();x=iic_read_byte();iic_ack();iic_stop();return x;}void main(){delay_1ms(10); //延时 lcd_init();delay_1ms(5);iic_write(0x16,0x5);iic_write(0x10,0x32);//校正X值iic_write(0x12,0x62);//校正Y值delay_50ms(20);while(1){x=iic_read(0x06);y=iic_read(0x07);z=iic_read(0x08);num[0]=x/100;num[1]=x/10%10;num[2]=x%10;num[3]=y/100;num[4]=y/10%10;num[5]=y%10;num[6]=z/100;num[7]=z/10%10;num[8]=z%10;lcd_pos(0,0);write_dat(num[0]+48); delay_1ms(5); write_dat(num[1]+48); delay_1ms(5);write_dat(num[2]+48); delay_1ms(5);lcd_pos(1,0);write_dat(num[3]+48); delay_1ms(5); write_dat(num[4]+48); delay_1ms(5);write_dat(num[5]+48); delay_1ms(5);lcd_pos(2,0);write_dat(num[6]+48); delay_1ms(5); write_dat(num[7]+48); delay_1ms(5);write_dat(num[8]+48); delay_1ms(5);}}。