霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在 1°~2°的 12 位模数转换器.简易的 I2C 系列总线接口。HMC5883L 是采用无铅表面封装技术,带有 16 引脚,尺寸为 3.0X3.0X0.9mm。HMC5883L 的所应用领域有手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统

HMC5883主要有接口是IIC,同时提供一个数据中断引脚,一般而言,电路设计如下

该传感器芯片的驱动并不复杂,主要是设置几个寄存器,如下所示

  1. //HMC5883寄存器定义
  2. //寄存器地址定义
  3. #define HMC_CONFIG_A_REG 0X00 //配置寄存器A
  4. //bit0-bit1 xyz是否使用偏压,默认为0正常配置
  5. //bit2-bit4 数据输出速率, 110为最大75HZ 100为15HZ 最小000 0.75HZ
  6. //bit5-bit5每次采样平均数 11为8次 00为一次
  7.  
  8. #define HMC_CONFIG_B_REG 0X01 //配置寄存器B
  9. //bit7-bit5磁场增益 数据越大,增益越小 默认001
  10.  
  11. #define HMC_MODE_REG 0X02 //模式设置寄存器
  12. //bit0-bit1 模式设置 00为连续测量 01为单一测量
  13.  
  14. #define HMC_XMSB_REG 0X03 //X输出结果
  15. #define HMC_XLSB_REG 0X04
  16.  
  17. #define HMC_ZMSB_REG 0X05 //Z输出结果
  18. #define HMC_ZLSB_REG 0X06
  19.  
  20. #define HMC_YMSB_REG 0X07 //Y输出结果
  21. #define HMC_YLSB_REG 0X08
  22.  
  23. #define HMC_STATUS_REG 0X09 //只读的状态
  24. //bit1 数据更新时该位自动锁存,等待用户读取,读取到一半的时候防止数据改变
  25. //bit0 数据已经准备好等待读取了,DRDY引脚也能用
  26.  
  27. #define HMC_CHEAK_A_REG 0X0A //三个识别寄存器,用于检测芯片完整性
  28. #define HMC_CHEAK_B_REG 0X0B
  29. #define HMC_CHEAK_C_REG 0X0C
  30.  
  31. #define HMC_CHECKA_VALUE 0x48 //三个识别寄存器的默认值
  32. #define HMC_CHECKB_VALUE 0x34
  33. #define HMC_CHECKC_VALUE 0x33

建议选择最大速率,八倍采样输出,同时该传感器支持读写地址指针自动变化,但是针对随机读取的驱动而言,该特性不重要

另外,一般而言,地址为0x3c,驱动代码如下

  1. #include "hmc5883.h"
  2. #include "math.h"
  3.  
  4. struct HMCVALUE hmcValue;
  5. u8 dataReady = 0;
  6.  
  7. //IO方向设置
  8. #define HMC_SDA_IN() {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=8;}
  9. #define HMC_SDA_OUT() {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=3;}
  10.  
  11. //IO操作函数
  12. #define HMC_SCL PCout(9) //SCL
  13. #define HMC_SDA PCout(8) //SDA
  14. #define HMC_READ_SDA PCin(8) //输入SDA
  15.  
  16. #define HMC_DRDY PCin(7)
  17.  
  18. /**************************HMC5883 IIC驱动函数*********************************/
  19.  
  20. static void Hmc5883IOInit(void)
  21. {
  22. GPIO_InitTypeDef GPIO_InitStructure;
  23. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
  24.  
  25. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
  26. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
  27. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28. GPIO_Init(GPIOC, &GPIO_InitStructure);
  29.  
  30. //PC7 drdy引脚
  31. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  32. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //浮空输入
  33. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34. GPIO_Init(GPIOC, &GPIO_InitStructure);
  35.  
  36. HMC_SCL = 1;
  37. HMC_SDA = 1;
  38. }
  39.  
  40. //发送IIC起始信号
  41. static void ComStart(void)
  42. {
  43. HMC_SDA_OUT(); //sda线输出
  44. HMC_SDA=1;
  45. HMC_SCL=1;
  46. DelayUs(5);
  47. HMC_SDA=0;//START:when CLK is high,DATA change form high to low
  48. DelayUs(5);
  49. HMC_SCL=0;//钳住I2C总线,准备发送或接收数据
  50. }
  51. //发送IIC停止信号
  52. static void ComStop(void)
  53. {
  54. HMC_SDA_OUT();//sda线输出
  55. HMC_SDA=0;//STOP:when CLK is high DATA change form low to high
  56. HMC_SCL=1;
  57. DelayUs(5);
  58. HMC_SDA=1;//发送I2C总线结束信号
  59. DelayUs(5);
  60. }
  61. //等待ACK,为1代表无ACK 为0代表等到了ACK
  62. static u8 ComWaitAck(void)
  63. {
  64. u8 waitTime = 0;
  65. HMC_SDA_OUT();//sda线输出
  66. HMC_SDA = 1;
  67. DelayUs(5);
  68. HMC_SDA_IN(); //SDA设置为输入
  69. HMC_SCL=1;
  70. DelayUs(5);
  71. while(HMC_READ_SDA)
  72. {
  73. waitTime++;
  74. DelayUs(1);
  75. if(waitTime > HMC_ACK_WAIT_TIME)
  76. {
  77. ComStop();
  78. return 1;
  79. }
  80. }
  81. HMC_SCL = 0;
  82. return 0;
  83.  
  84. }
  85.  
  86. static void ComSendAck(void)
  87. {
  88. HMC_SCL = 0;
  89. HMC_SDA_OUT();
  90. HMC_SDA = 0;
  91. DelayUs(2);
  92. HMC_SCL = 1;
  93. DelayUs(5);
  94. HMC_SCL = 0;
  95. DelayUs(5);
  96. }
  97.  
  98. static void ComSendNoAck(void)
  99. {
  100. HMC_SCL = 0;
  101. HMC_SDA_OUT();
  102. HMC_SDA = 1;
  103. DelayUs(2);
  104. HMC_SCL = 1;
  105. DelayUs(5);
  106. HMC_SCL = 0;
  107. DelayUs(5);
  108. }
  109. //返回0 写入收到ACK 返回1写入未收到ACK
  110. static u8 ComSendByte(u8 byte)
  111. {
  112. u8 t;
  113. HMC_SDA_OUT();
  114. for(t=0;t<8;t++)
  115. {
  116. HMC_SDA=(byte&0x80)>>7;
  117. byte<<=1;
  118. HMC_SCL=1;
  119. DelayUs(5);
  120. HMC_SCL=0;
  121. DelayUs(5);
  122. }
  123. return ComWaitAck();
  124. }
  125.  
  126. static void ComReadByte(u8* byte)
  127. {
  128. u8 i,receive=0;
  129. HMC_SDA_IN();//SDA设置为输入
  130. for(i=0;i<8;i++ )
  131. {
  132. receive <<= 1;
  133. HMC_SCL=1;
  134. DelayUs(5);
  135. if(HMC_READ_SDA)receive++;
  136. HMC_SCL=0;
  137. DelayUs(5);
  138. }
  139. *byte = receive;
  140. }
  141.  
  142. /**************************HMC5883 IIC驱动函数*********************************/
  143.  
  144. //向HMC写入一个字节数据,失败返回1 成功返回0
  145. u8 Hmc5883WriteReg(u8 regValue,u8 setValue)
  146. {
  147. u8 res;
  148. ComStart(); //起始信号
  149. res = ComSendByte(HMC_ADDR); //发送设备地址+写信号
  150. if(res)
  151. {
  152. #ifdef HMC_DEBUG
  153. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  154. #endif
  155. return res;
  156. }
  157. res = ComSendByte(regValue); //内部寄存器地址
  158. if(res)
  159. {
  160. #ifdef HMC_DEBUG
  161. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  162. #endif
  163. return res;
  164. }
  165. res = ComSendByte(setValue); //内部寄存器数据
  166. if(res)
  167. {
  168. #ifdef HMC_DEBUG
  169. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  170. #endif
  171. return res;
  172. }
  173. ComStop(); //发送停止信号
  174. return res;
  175. }
  176.  
  177. //**************************************
  178. //从I2C设备读取一个字节数据
  179. //**************************************
  180. u8 Hmc5883ReadReg(u8 regAddr,u8* readValue)
  181. {
  182. u8 res;
  183. ComStart(); //起始信号
  184. res = ComSendByte(HMC_ADDR); //发送设备地址+写信号
  185. if(res)
  186. {
  187. #ifdef HMC_DEBUG
  188. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  189. #endif
  190. return res;
  191. }
  192. res = ComSendByte(regAddr); //发送存储单元地址,从0开始
  193. if(res)
  194. {
  195. #ifdef HMC_DEBUG
  196. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  197. #endif
  198. return res;
  199. }
  200. ComStart(); //起始信号
  201. res = ComSendByte(HMC_ADDR+1); //发送设备地址+读信号
  202. if(res)
  203. {
  204. #ifdef HMC_DEBUG
  205. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  206. #endif
  207. return res;
  208. }
  209. ComReadByte(readValue); //读出寄存器数据
  210. ComSendNoAck(); //发送非应答信号
  211. ComStop(); //停止信号
  212. return res;
  213. }
  214.  
  215. static void HmcDefaultConfig(void)
  216. {
  217. Hmc5883WriteReg(HMC_CONFIG_A_REG,HMC_DEFAULT_CONFIGA_VALUE);
  218. Hmc5883WriteReg(HMC_CONFIG_B_REG,HMC_DEFAULT_CONFIGB_VALUE);
  219. Hmc5883WriteReg(HMC_MODE_REG,HMC_DEFAULT_MODE_VALUE);
  220. }
  221.  
  222. //配置HMC drdy引脚中断
  223. void HmcDrdyPinIntInit(void)
  224. {
  225. EXTI_InitTypeDef EXTI_InitStructure;
  226. NVIC_InitTypeDef NVIC_InitStructure;
  227.  
  228. //GPIOC.7 中断线以及中断初始化配置 下降沿触发
  229. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7);
  230.  
  231. EXTI_InitStructure.EXTI_Line=EXTI_Line7;
  232. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  233. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
  234. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  235. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  236.  
  237. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能所在的外部中断通道
  238. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = HMC_DRDY_PreemptionPriority; //抢占优先级
  239. NVIC_InitStructure.NVIC_IRQChannelSubPriority = HMC_DRDY_SubPriority; //子优先级
  240. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  241. NVIC_Init(&NVIC_InitStructure);
  242. }
  243.  
  244. //对应的外部中断处理函数
  245. void EXTI9_5_IRQHandler()
  246. {
  247. if(EXTI_GetFlagStatus(EXTI_Line7) == SET)
  248. {
  249. EXTI_ClearFlag(EXTI_Line7);
  250. dataReady = 1;
  251. }
  252. }
  253. //失败返回1,初始化通过之后基本通讯就没有问题了就可以不再判定通讯结果了
  254. u8 HmcInit(void)
  255. {
  256. u8 hmcCheckValue = 0x00;
  257. u8 res = 0;
  258. Hmc5883IOInit(); //接口初始化
  259. while(HMC_DRDY == 1);//等待数据引脚正常
  260. HmcDrdyPinIntInit();//配置中断
  261. DelayMs(100);
  262. //验证A识别
  263. res = Hmc5883ReadReg(HMC_CHEAK_A_REG,&hmcCheckValue);
  264. if(res)
  265. {
  266. #ifdef HMC_DEBUG
  267. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  268. #endif
  269. }
  270. if(hmcCheckValue != HMC_CHECKA_VALUE) //自检通过
  271. {
  272. return 1;
  273. }
  274. //验证B识别
  275. res = Hmc5883ReadReg(HMC_CHEAK_B_REG,&hmcCheckValue);
  276. if(res)
  277. {
  278. #ifdef HMC_DEBUG
  279. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  280. #endif
  281. }
  282. if(hmcCheckValue != HMC_CHECKB_VALUE) //自检通过
  283. {
  284. return 1;
  285. }
  286. //验证C识别
  287. res = Hmc5883ReadReg(HMC_CHEAK_C_REG,&hmcCheckValue);
  288. if(res)
  289. {
  290. #ifdef HMC_DEBUG
  291. printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);
  292. #endif
  293. }
  294. if(hmcCheckValue != HMC_CHECKC_VALUE) //自检通过
  295. {
  296. return 1;
  297. }
  298. HmcDefaultConfig();
  299. //全部验证通过
  300. return 0;
  301. }
  302.  
  303. void Hmc5883Reflush(void)
  304. {
  305. u16 xValue = 0x00,yValue = 0x00,zValue = 0x00;
  306. u8 temp;
  307. Hmc5883ReadReg(HMC_XMSB_REG,&temp);
  308. xValue |= temp;
  309. xValue <<=8;
  310. Hmc5883ReadReg(HMC_XLSB_REG,&temp);
  311. xValue |= temp;
  312.  
  313. Hmc5883ReadReg(HMC_ZMSB_REG,&temp);
  314. zValue |= temp;
  315. zValue <<=8;
  316. Hmc5883ReadReg(HMC_ZLSB_REG,&temp);
  317. zValue |= temp;
  318.  
  319. Hmc5883ReadReg(HMC_YMSB_REG,&temp);
  320. yValue |= temp;
  321. yValue <<=8;
  322. Hmc5883ReadReg(HMC_YLSB_REG,&temp);
  323. yValue |= temp;
  324.  
  325. hmcValue.hmcXvalue = (s16)xValue;
  326. hmcValue.hmcYvalue = (s16)yValue;
  327. hmcValue.hmcZvalue = (s16)zValue;
  328.  
  329. hmcValue.hmcAxis = atan2((double)hmcValue.hmcYvalue,(double)hmcValue.hmcXvalue) * (180 / 3.14159265) + 180; // angle in degrees
  330. #ifdef HMC_DEBUG
  331. printf("x = %d \t y = %d \t z = %d \t axis = %f\r\n",xValue,yValue,zValue,hmcValue.hmcAxis);
  332. #endif
  333. }

头文件定义如下(中断有优先级请自行定义)

  1. #ifndef __HMC5883_H_
  2. #define __HMC5883_H_
  3.  
  4. #include "common.h"
  5. #include "stm32f10x.h"
  6. #include "delay.h"
  7. #include "ioremap.h"
  8. #include "uart.h"
  9.  
  10. #define HMC_DEBUG 1 //是否输出调试信息
  11.  
  12. //没有主机改变地址的话地址是可以自动更新的,不过该驱动没有用这个模式
  13.  
  14. //HMC5883寄存器定义
  15. //寄存器地址定义
  16. #define HMC_CONFIG_A_REG 0X00 //配置寄存器A
  17. //bit0-bit1 xyz是否使用偏压,默认为0正常配置
  18. //bit2-bit4 数据输出速率, 110为最大75HZ 100为15HZ 最小000 0.75HZ
  19. //bit5-bit5每次采样平均数 11为8次 00为一次
  20.  
  21. #define HMC_CONFIG_B_REG 0X01 //配置寄存器B
  22. //bit7-bit5磁场增益 数据越大,增益越小 默认001
  23.  
  24. #define HMC_MODE_REG 0X02 //模式设置寄存器
  25. //bit0-bit1 模式设置 00为连续测量 01为单一测量
  26.  
  27. #define HMC_XMSB_REG 0X03 //X输出结果
  28. #define HMC_XLSB_REG 0X04
  29.  
  30. #define HMC_ZMSB_REG 0X05 //Z输出结果
  31. #define HMC_ZLSB_REG 0X06
  32.  
  33. #define HMC_YMSB_REG 0X07 //Y输出结果
  34. #define HMC_YLSB_REG 0X08
  35.  
  36. #define HMC_STATUS_REG 0X09 //只读的状态
  37. //bit1 数据更新时该位自动锁存,等待用户读取,读取到一半的时候防止数据改变
  38. //bit0 数据已经准备好等待读取了,DRDY引脚也能用
  39.  
  40. #define HMC_CHEAK_A_REG 0X0A //三个识别寄存器,用于检测芯片完整性
  41. #define HMC_CHEAK_B_REG 0X0B
  42. #define HMC_CHEAK_C_REG 0X0C
  43.  
  44. #define HMC_CHECKA_VALUE 0x48 //三个识别寄存器的默认值
  45. #define HMC_CHECKB_VALUE 0x34
  46. #define HMC_CHECKC_VALUE 0x33
  47.  
  48. //HMC5883地址定义
  49. #define HMC_ADDR 0X3C //写地址,读地址+1
  50.  
  51. //HMC5883 初始化宏定义
  52. #define HMC_DEFAULT_CONFIGA_VALUE 0x78 //75hz 8倍采样 正常配置
  53. #define HMC_DEFAULT_CONFIGB_VALUE 0x00 //+-0.88GA增益
  54. #define HMC_DEFAULT_MODE_VALUE 0x00 //连续测量模式
  55.  
  56. #define HMC_ACK_WAIT_TIME 200 //iic通讯时的ack等待时间
  57.  
  58. //HMC5883驱动结构体定义
  59. typedef struct HMCVALUE
  60. {
  61. s16 hmcXvalue;
  62. s16 hmcYvalue;
  63. s16 hmcZvalue;
  64. double hmcAxis;
  65. }HMCVALUE;
  66.  
  67. u8 HmcInit(void);
  68.  
  69. u8 Hmc5883WriteReg(u8 regValue,u8 setValue);
  70.  
  71. u8 Hmc5883ReadReg(u8 regAddr,u8* readValue);
  72.  
  73. void Hmc5883Reflush(void);
  74.  
  75. extern struct HMCVALUE hmcValue;
  76. extern u8 dataReady;
  77.  
  78. #endif

引脚连接电路如下

HMC5883L地磁传感器驱动的更多相关文章

  1. stm32与地磁传感器HMC5883L

    1.简介 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域.HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器 ...

  2. 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展HMC ...

  3. 张高兴的 Windows 10 IoT 开发笔记:三轴数字罗盘 HMC5883L

    注意,数据不包含校验,准确的来说我不知道怎么校验,但方向看起来差不多是对的... GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tre ...

  4. Android指南针之加速度传感器地磁传感器-android学习之旅(67)

    由于andorid不推荐用传统的方向传感器,推荐用加速度传感器和地磁传感器来构造得到方向传感器的数据,其实主要是z轴的旋转角度 具体代码示例 代码如下 public class MainActivit ...

  5. 地磁应用中的低功耗无线数传模块xbee PRO S2C

    地球上每一个地理坐标点,在一段时间内磁场强度是恒定的,当车辆这种铁磁物质经过这个点时,对这个点的磁场强度产生一个连续的扰动,通过磁传感器采样数据与初始采样数据(该点的地球磁场值)进行对比,其差值为车辆 ...

  6. 博世传感器调试笔记(三)加速度及地磁传感器BMC156

    一.    器件简介:1.    BMC 156是一款整合三轴地磁传感器与三轴(12bit)加速度传感器于一体的传感器,以BMC 150 电子罗盘模块为基础, 并与Bosch Sensortec 2x ...

  7. 基于STM32的三轴数字罗盘HMC5883L模块的测试

    最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内.连续测量模式下,最快测量.输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲 ...

  8. 461在全志r16平台tinav3.0系统下使用地磁计QMC5883L

    461在全志r16平台tinav3.0系统下使用地磁计QMC5883L 2018/9/7 14:08 版本:V1.0 开发板:SC3817R SDK:tina v3.0 (基本确认全志tina v3. ...

  9. 基于ARM-LINUX的温度传感器驱动-DS18B20

    转载:http://blog.csdn.net/ayangke/article/details/6883244 作者:冯建,华清远见嵌入式学院讲师. DS18B20数字温度传感器接线方便,封装成后可应 ...

随机推荐

  1. Android 系统编译

    最近研究了下Android 的编译系统,下面结合编译我们自己的产品 mobot 来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改. 先列出几个觉得重要的Make 文件: build/bu ...

  2. Lucene.NET中Field.Index 和 Field.Store的几种属性的用法

    转载自 http://blog.csdn.net/yja886/article/details/6612069 lucene在doc.add(new Field("content" ...

  3. android 数据存储分配的一些事

    应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载后,这些数据还 ...

  4. Git学习 -- 工作区和暂存区

    工作区(working directory): 就是能看到的目录,如我的git文件夹 版本库(repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库 里面最重要的就 ...

  5. realypay

    1.判断新老接口的方法: 去网站后台接口配置的地方,如果有merchantno参数就是新接口,否则为老接口,新接口则不需要更新了. 2.老接口需要去网站后台卸载老的接口,然后再用新的(下载的文件)覆盖 ...

  6. VIJOS P1647 不差钱 SBT

    [描述] 同学们一起看了小品<不差钱>,LX神突发奇想,想刁难一下十八居士,他让十八居士模拟一下点菜的过程. [输入格式] 输入第一行为一个数price,表示价钱大于price的菜赵本山都 ...

  7. English--Computer System

    A: Hey, Bill, Can you tell what's wrong with my computer? I can't move the mouse, I can's user the k ...

  8. Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯

    Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...

  9. java HTTP请求 DefaultHttpClient is deprecated

    最近在使用Apache的httpclient的时候,maven引用了最新版本4.3,发现Idea提示DefaultHttpClient等常用的类已经不推荐使用了,之前在使用4.2.3版本的时候,还没有 ...

  10. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...