#include #include #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}; /******************************************************************************/ /********** 数据部分 ***********/ /******************************************************************************/ word教育资料 . #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 word教育资料 //寄存器选择输入//液晶读/写控制 //液晶使能控制 //串/并方式控制 . } /*******************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /*******************************************************************/ void write_cmd(uchar cmd) { LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P0 = cmd; word教育资料 . 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) { word教育资料 . LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delay_1ms(5); LCD_EN = 1; delay_1ms(5); LCD_EN = 0; } /*********************************************************/ /* */ /* 设定显示位置 */ /* */ word教育资料 . /*********************************************************/ 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 ; word教育资料 . write_cmd(pos); //显示地址 } /*******************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*******************************************************************/ void lcd_init() { LCD_PSB = 1; //并口方式 write_cmd(0x30); //基本指令操作 delay_1ms(5); write_cmd(0x0C); //显示开,关光标 word教育资料 . 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显示状态 word教育资料 . 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 应答标志 /**************************************************************************/ /************ 各延时程序 **************/ /**************************************************************************/ word教育资料 . 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--); } word教育资料 . 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(); word教育资料 scl=1; iic_delay(); sda=0; iic_delay(); } void iic_stop() { sda=0; iic_delay(); scl=1; iic_delay(); sda=1; iic_delay(); word教育资料 . //函数功能:I2C通信停止 . } 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; word教育资料 . for(i=0;i<8;i++) { scl = 0; iic_delay(); temp=temp1; temp=temp&0x80; if(temp==0x80) sda=1; else sda=0; iic_delay(); scl=1; iic_delay(); word教育资料 . 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; word教育资料 . 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)//函数功能:按地址写入一字节数据 word教育资料 . { 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) word教育资料 //函数功能:按地址读出一字节数据 . { 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(); word教育资料 . 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值 word教育资料 . 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; word教育资料 . 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); word教育资料 . 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); }} word教育资料 因篇幅问题不能全部显示,请点此查看更多更全内容