微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > (4)mbed入门——iic控制1602

(4)mbed入门——iic控制1602

时间:10-02 整理:3721RD 点击:

首先声明,所有代码都是自己手打的,原创首发!
第一次写C++程序(花了一晚上,照葫芦画瓢写得)先上基本效果


开始用c写的,没用过c++,mbed编译总报错,各种错,没办法了,完全照着改的,没想到成功了
这里是主程序:

  1. #include "mbed.h"
  2. #include "1602_iic_sw.h"

  3. #define GREEN_LED PB_0
  4. #define BLUE_LED PB_7
  5. #define RED_LED PB_14
  6. //DigitalOut myled1(GREEN_LED);
  7. //DigitalOut myled2(BLUE_LED);
  8. //DigitalOut myled3(RED_LED);

  9. PwmOut PWM1(GREEN_LED);
  10. PwmOut PWM2(BLUE_LED);
  11. PwmOut PWM3(RED_LED);

  12. //    I2C_SCL     = PB_8,
  13. //    I2C_SDA     = PB_9,
  14. I2C i2c_port(I2C_SDA, I2C_SCL);

  15. float gValue = 0;
  16. char data = 0;


  17. Serial pc(PA_2,PA_3);

  18. int main() {        
  19.         PWM1.period(0.01);
  20.         PWM2.period(0.01);
  21.         PWM3.period(0.01);


  22.     while(1) {
  23.                 PWM1 = gValue;
  24.                 PWM2 = 1 - gValue;
  25.                 PWM3 = gValue;

  26.         gValue = gValue + 0.001;
  27.         wait(0.001); // 1 sec

  28.         if(gValue >= 1)
  29.         {
  30.             static char ack_value = 0;
  31.                 gValue = 0;
  32.                         
  33.                         i2c_port.start();

  34.             // ack_value = i2c_port.write(address, data, 1, 0);
  35.             ack_value = i2c_port.write(ADDRWRITE);
  36.             i2c_port.write(data);
  37.                         i2c_port.stop();
  38.                 printf("ACK = %d\n", ack_value);               
  39.         }
  40.     }
  41. }

复制代码


初始化过程有点粗暴!哈哈,直接抓协议搞的,像我这么干的恐怕不多


  1. #include "mbed.h"
  2. #include "1602_iic_sw.h"

  3. //set default status of backlight to ON
  4. static u8 backLight = BACKLIGHT_ON;

  5. const u8 Ainit[42] = {
  6.         0x30, 0x34, 0x30,
  7.         0x30, 0x34, 0x30,
  8.         0x30, 0x34, 0x30,
  9.         0x20, 0x24, 0x20,
  10.         0x20, 0x24, 0x20,
  11.         0x80, 0x84, 0x80,
  12.         0x00, 0x04, 0x00,
  13.         0xc0, 0xc4, 0xc0,
  14.         0x00, 0x04, 0x00,
  15.         0x10, 0x14, 0x10,
  16.         0x00, 0x04, 0x00,
  17.         0x60, 0x64, 0x60,
  18.         0x00, 0x04, 0x00,
  19.         0x20, 0x24, 0x20,
  20. };

  21. /***
  22.         initial 1602 pins and mode
  23. ***/
  24. // Servo::Servo(PinName Pin) : ServoPin(Pin)
  25. IIC_1602::IIC_1602(PinName sda, PinName scl):i2c_port(sda, scl)
  26. {
  27.         u8 i = 0;
  28.         i2cAction(0);
  29.         wait_ms(500);

  30.         for(i = 0; i < 42; ++i)
  31.         {
  32.                 i2cAction(Ainit[i]);
  33.                
  34.                 if((i == 2) || (i == 5))wait_ms(5);
  35.                 else if((i == 29) || (i == 41))wait_ms(2);
  36.                 else if(i == 8)wait_us(230);
  37.                 else wait_us(20);
  38.         }
  39. }

  40. /***
  41.         Output charactors on 1602
  42. ***/
  43. void IIC_1602::lcdPrint(const char* charactor)
  44. {
  45.         u8 c = 0;
  46.         for(c = 0; c < (u8)strlen(charactor); ++c)
  47.         writeOneChar(DATA_1602 ,*(charactor + c));
  48. }

  49. void IIC_1602::lcdPrint_int(const u16 val)
  50. {
  51.         u8 status = 0;
  52.         u8 num[5] = {0};

  53.         num[4] = val/10000;
  54.         num[3] = val/1000%10;
  55.         num[2] = val/100%10;
  56.         num[1] = val/10%100%10;
  57.         num[0] = val%10;
  58.         if(num[4] || status)writeOneChar(DATA_1602 , num[4] + 0x30),status = 1;
  59.         if(num[3] || status)writeOneChar(DATA_1602 , num[3] + 0x30),status = 1;
  60.         if(num[2] || status)writeOneChar(DATA_1602 , num[2] + 0x30),status = 1;
  61.         if(num[1] || status)writeOneChar(DATA_1602 , num[1] + 0x30),status = 1;
  62.         if(num[0] || status)writeOneChar(DATA_1602 , num[0] + 0x30),status = 1;

  63.         writeOneChar(DATA_1602 , num[3] + 30);
  64. }

  65. void IIC_1602::disOneChar(unsigned char X, unsigned char Y, char word)
  66. {
  67.         Y &= 0x1;
  68.         X &= 0xF;   //限制 X 不能大于 15,Y 不能大于 1
  69.         if (Y) X |= 0x40;   //当要显示第二行时地址码+0x40;
  70.         X |= 0x80;       //算出指令码
  71.         writeOneChar(CMD_1602, X);    //这里不检测忙信号,发送地址码
  72.         writeOneChar(DATA_1602, word);
  73. }

  74. void IIC_1602::writeOneChar(const u8 cmdOrData, const u8 Data)
  75. {
  76.         u8 LCM_Data = 0;
  77.         LCM_Data = ((Data & 0xF0) | (cmdOrData) | (backLight));
  78.         i2cAction(LCM_Data);

  79.         i2cAction(LCM_Data | 0x04);
  80.         wait_us(20);

  81.         LCM_Data = (((Data & 0x0F)<<4) | (cmdOrData) | (backLight));
  82.         i2cAction(LCM_Data);

  83.         i2cAction(LCM_Data | 0x04);
  84.         wait_us(20);
  85.         i2cAction(LCM_Data);
  86. }

  87. /***
  88.         set position of cursor
  89. ***/
  90. void IIC_1602::setCursor(u8 colmn, u8 line)
  91. {
  92.         line &= 0x1;
  93.         colmn &= 0xF;   //限制 X 不能大于 15,line 不能大于 1
  94.         if (line) colmn |= 0x40;   //当要显示第二行时地址码+0x40;
  95.         colmn |= 0x80;       //算出指令码
  96.         writeOneChar(CMD_1602, colmn);    //这里不检测忙信号,发送地址码
  97. }

  98. /***
  99.         send one frame by iic
  100. ***/
  101. void IIC_1602::i2cAction(u8 status)
  102. {
  103.         i2c_port.start();
  104.         i2c_port.write(ADDRWRITE);
  105.         i2c_port.write(status);
  106.         i2c_port.stop();
  107. }

复制代码

  1. #ifndef __1602_IIC_SW_H__
  2. #define __1602_IIC_SW_H__

  3. #include "mbed.h"
  4. #include "string.h"

  5. #ifndef u8
  6. #define u8 unsigned char
  7. #endif

  8. #ifndef u16
  9. #define u16 unsigned int
  10. #endif

  11. #define ADDR        0x27

  12. //High bit to R,Loe bit to W
  13. #define ADDRREAD        ((ADDR<<1) | 0x01)
  14. #define ADDRWRITE        (ADDR<<1)

  15. #define BACKLIGHT_ON        0x08
  16. #define BACKLIGHT_OFF        0x00
  17. #define LCD_CLC        0x00

  18. #define CMD_1602         0
  19. #define DATA_1602        1


  20. class IIC_1602 {

  21. public:
  22.         IIC_1602(PinName sda, PinName scl);
  23.         void lcdPrint(const char* charactor);
  24.         void lcdPrint_int(const u16 val);
  25.         void disOneChar(unsigned char X, unsigned char Y, char word);
  26.         void writeOneChar(const u8 cmdOrData, const u8 Data);
  27.         void setCursor(u8 colmn, u8 line);
  28.         void i2cAction(u8 status);
  29. private :
  30.         I2C i2c_port;
  31. };
  32. #endif

复制代码



上一篇:课程实验
下一篇:PIC单片机串口调试

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top