📄 stc_lsm303dlh.lst
字号:
C51 COMPILER V7.08 STC_LSM303DLH 06/19/2011 23:40:18 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE STC_LSM303DLH
OBJECT MODULE PLACED IN STC_LSM303DLH.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE STC_LSM303DLH.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //***************************************
2 // LSM303DLH IIC测试程序
3 // 使用单片机STC89C51
4 // 晶振:11.0592M
5 // 显示:LCD1602
6 // 编译环境 Keil uVision2
7 // 参考宏晶网站24c04通信程序
8 // 时间:2011年3月1日
9 // QQ:531389319
10 //****************************************
11 #include <REG51.H>
12 #include <math.h> //Keil library
13 #include <stdio.h> //Keil library
14 #include <INTRINS.H>
15 #define uchar unsigned char
16 #define uint unsigned int
17 #define DataPort P0 //LCD1602数据端口
18 sbit SCL=P1^0; //IIC时钟引脚定义
19 sbit SDA=P1^1; //IIC数据引脚定义
20 sbit LCM_RS=P2^0; //LCD1602命令端口
21 sbit LCM_RW=P2^1; //LCD1602命令端口
22 sbit LCM_EN=P2^2; //LCD1602命令端口
23
24 #define LSM303A_SlaveAddress 0x30 //定义器件在IIC总线中的从地址,(加速度)根据ALT ADDRESS地址引脚不同修
-改 0x30(ADDRESS=0)
25 #define LSM303M_SlaveAddress 0x3C //定义器件在IIC总线中的从地址,(磁场)根据ALT ADDRESS地址引脚不同修
-改
26
27
28 typedef unsigned char BYTE;
29 typedef unsigned short WORD;
30
31 BYTE BUF[8]; //接收数据缓存区
32 uchar ge,shi,bai,qian,wan; //显示变量
33 int dis_data; //变量
34
35 void delay(unsigned int k);
36 void InitLcd(); //初始化lcd1602
37
38 void WriteDataLCM(uchar dataW);
39 void WriteCommandLCM(uchar CMD,uchar Attribc);
40 void DisplayOneChar(uchar X,uchar Y,uchar DData);
41 void conversion(uint temp_data);
42
43 void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data); //单个写入数据
44 uchar Single_Read(uchar SlaveAddress,uchar REG_Address); //单个读取内部寄存器数据
45 void Multiple_Read(uchar,uchar); //连续的读取内部寄存器数据
46 //------------------------------------
47 void Delay5us();
48 void Delay5ms();
49 void LSM303_Start();
50 void LSM303_Stop();
51 void LSM303_SendACK(bit ack);
52 bit LSM303_RecvACK();
53 void LSM303_SendByte(BYTE dat);
C51 COMPILER V7.08 STC_LSM303DLH 06/19/2011 23:40:18 PAGE 2
54 BYTE LSM303_RecvByte();
55 void LSM303_ReadPage();
56 void LSM303_WritePage();
57 //-----------------------------------
58
59 //*********************************************************
60 void conversion(uint temp_data)
61 {
62 1 wan=temp_data/10000+0x30 ;
63 1 temp_data=temp_data%10000; //取余运算
64 1 qian=temp_data/1000+0x30 ;
65 1 temp_data=temp_data%1000; //取余运算
66 1 bai=temp_data/100+0x30 ;
67 1 temp_data=temp_data%100; //取余运算
68 1 shi=temp_data/10+0x30 ;
69 1 temp_data=temp_data%10; //取余运算
70 1 ge=temp_data+0x30;
71 1 }
72
73 /*******************************/
74 void delay(unsigned int k)
75 {
76 1 unsigned int i,j;
77 1 for(i=0;i<k;i++)
78 1 {
79 2 for(j=0;j<121;j++)
80 2 {;}}
81 1 }
82 /*******************************/
83 void WaitForEnable(void)
84 {
85 1 DataPort=0xff;
86 1 LCM_RS=0;LCM_RW=1;_nop_();
87 1 LCM_EN=1;_nop_();_nop_();
88 1 while(DataPort&0x80);
89 1 LCM_EN=0;
90 1 }
91 /*******************************/
92 void WriteCommandLCM(uchar CMD,uchar Attribc)
93 {
94 1 if(Attribc)WaitForEnable();
95 1 LCM_RS=0;LCM_RW=0;_nop_();
96 1 DataPort=CMD;_nop_();
97 1 LCM_EN=1;_nop_();_nop_();LCM_EN=0;
98 1 }
99 /*******************************/
100 void WriteDataLCM(uchar dataW)
101 {
102 1 WaitForEnable();
103 1 LCM_RS=1;LCM_RW=0;_nop_();
104 1 DataPort=dataW;_nop_();
105 1 LCM_EN=1;_nop_();_nop_();LCM_EN=0;
106 1 }
107 /***********************************/
108 void InitLcd()
109 {
110 1 WriteCommandLCM(0x38,1);
111 1 WriteCommandLCM(0x08,1);
112 1 WriteCommandLCM(0x01,1);
113 1 WriteCommandLCM(0x06,1);
114 1 WriteCommandLCM(0x0c,1);
115 1 }
C51 COMPILER V7.08 STC_LSM303DLH 06/19/2011 23:40:18 PAGE 3
116 /***********************************/
117 void DisplayOneChar(uchar X,uchar Y,uchar DData)
118 {
119 1 Y&=1;
120 1 X&=15;
121 1 if(Y)X|=0x40;
122 1 X|=0x80;
123 1 WriteCommandLCM(X,0);
124 1 WriteDataLCM(DData);
125 1 }
126
127 /**************************************
128 延时5微秒(STC90C52RC@12M)
129 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
130 当改用1T的MCU时,请调整此延时函数
131 **************************************/
132 void Delay5us()
133 {
134 1 _nop_();_nop_();_nop_();_nop_();
135 1 _nop_();_nop_();_nop_();_nop_();
136 1 _nop_();_nop_();_nop_();_nop_();
137 1 _nop_();_nop_();_nop_();_nop_();
138 1 }
139
140 /**************************************
141 延时5毫秒(STC90C52RC@12M)
142 不同的工作环境,需要调整此函数
143 当改用1T的MCU时,请调整此延时函数
144 **************************************/
145 void Delay5ms()
146 {
147 1 WORD n = 560;
148 1
149 1 while (n--);
150 1 }
151
152 /**************************************
153 起始信号
154 **************************************/
155 void LSM303_Start()
156 {
157 1 SDA = 1; //拉高数据线
158 1 SCL = 1; //拉高时钟线
159 1 Delay5us(); //延时
160 1 SDA = 0; //产生下降沿
161 1 Delay5us(); //延时
162 1 SCL = 0; //拉低时钟线
163 1 }
164
165 /**************************************
166 停止信号
167 **************************************/
168 void LSM303_Stop()
169 {
170 1 SDA = 0; //拉低数据线
171 1 SCL = 1; //拉高时钟线
172 1 Delay5us(); //延时
173 1 SDA = 1; //产生上升沿
174 1 Delay5us(); //延时
175 1 }
176
177 /**************************************
C51 COMPILER V7.08 STC_LSM303DLH 06/19/2011 23:40:18 PAGE 4
178 发送应答信号
179 入口参数:ack (0:ACK 1:NAK)
180 **************************************/
181 void LSM303_SendACK(bit ack)
182 {
183 1 SDA = ack; //写应答信号
184 1 SCL = 1; //拉高时钟线
185 1 Delay5us(); //延时
186 1 SCL = 0; //拉低时钟线
187 1 Delay5us(); //延时
188 1 }
189
190 /**************************************
191 接收应答信号
192 **************************************/
193 bit LSM303_RecvACK()
194 {
195 1 SCL = 1; //拉高时钟线
196 1 Delay5us(); //延时
197 1 CY = SDA; //读应答信号
198 1 SCL = 0; //拉低时钟线
199 1 Delay5us(); //延时
200 1
201 1 return CY;
202 1 }
203
204 /**************************************
205 向IIC总线发送一个字节数据
206 **************************************/
207 void LSM303_SendByte(BYTE dat)
208 {
209 1 BYTE i;
210 1
211 1 for (i=0; i<8; i++) //8位计数器
212 1 {
213 2 dat <<= 1; //移出数据的最高位
214 2 SDA = CY; //送数据口
215 2 SCL = 1; //拉高时钟线
216 2 Delay5us(); //延时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -