#include//要用到_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 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; } [page] 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; else sda=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); }}
上一篇:8*8点阵流水显示I 爱心“U”
下一篇:无线通信NRF24L01-发送
推荐阅读最新更新时间:2024-03-16 14:26