[STM8] 为什么1602显示不出字符?

[复制链接]
1338|1
 楼主| 层层天 发表于 2014-9-24 23:22 | 显示全部楼层 |阅读模式
I2c, ck, BLE, ni, ip
各位大大,
使用的是 STM8S103F3芯片,通过I2C连接的LCD 1602 的屏。
I2C 已上拉。

系统初始化:
  1. // 使能I2C的时钟
  2.         CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);

  3.         // init
  4.         I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR,
  5.            I2C_ADDMODE_7BIT, CLK_GetClockFreq()/1000000);

  6.         // 使能I2C
  7.         I2C_Cmd( ENABLE);
LCD初始化:
  1. void I2C_JLX_send_data(char *data, int data_len)
  2. {
  3.         if (data_len <= 0) {
  4.                 return;
  5.         }
  6.        
  7.         /* 等待空闲 */
  8.    while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
  9.    
  10.    /* 发起始位 */
  11.    I2C_GenerateSTART(ENABLE);
  12.    
  13.    /* 测试EV5 ,检测从器件返回一个应答信号*/
  14.    while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  15.    
  16.    /* 设置I2C从器件地址,I2C主设备为写模式*/
  17.    I2C_Send7bitAddress(0x78, I2C_DIRECTION_TX);

  18.    /* 测试EV6 ,检测从器件返回一个应答信号*/
  19.    while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  20.    

  21.    I2C_SendData(*data);
  22.    data++;
  23.    data_len--;
  24.    
  25.    /* 测试EV8 ,检测从器件返回一个应答信号*/
  26.    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING));  

  27.    /* 不断往从设备写数据*/
  28.    while(data_len--)       
  29.    {
  30.          
  31.          I2C_SendData(*data);

  32.          /*指针指向下一个地址*/
  33.          data++;
  34.    
  35.          /* 测试EV6 ,检测从器件返回一个应答信号*/
  36.          while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  37.          I2C_AcknowledgeConfig(I2C_ACK_CURR);
  38.    }

  39.    /* 发结束位*/
  40.    I2C_GenerateSTOP(ENABLE);
  41. }


  42. void initial_lcd(void)
  43. {
  44.         char init_cmd[5] = {
  45.                 0x00, /*控制字节:Co=0,A0=0,表示以下传输的 N 个字节是指令*/
  46.                 0x38, // function set
  47.                 0x0C, //Display ON/OFF
  48.                 0x01, //Clear display
  49.                 0x06 //Entry mode set
  50.         };
  51.        
  52. //        I2C_send_data(init_cmd, 5);
  53.         I2C_JLX_send_data(init_cmd, 5);
  54. }

最后显示数据

  1. /*在指定行和列位置显示指定的字母、数字(5*7 点阵的)*/
  2. void disp_char(int line,int column,char *dp)
  3. {
  4.         int i;
  5.         char buf[20] = {0};

  6.         buf[0] = 0x80;
  7.         buf[1] = 0x80+(line-1)*0x40+(column-1);
  8.         buf[2] = 0x40;
  9.        
  10.         for(i=0;i<16;i++)
  11.         {
  12.                 buf[3 + i] = *dp;
  13.                 dp++;
  14.         }

  15. //        I2C_send_data(buf, 19);
  16.         I2C_JLX_send_data(buf, 19);
  17. }

调用的是
        disp_char(1,1,"AAAAAAAAAAAAAAAA"); /*在第 1 行,第 1 列,显示字符。 。。。*/
    disp_char(2,1,"BBBBBBBBBBBBBBBB"); /*在第 2 行,第 1 列,显示字符。 。。。*/
       
结果一直都显不出来啊,折腾N天了,还是不行,谁来救我啊










nyszx 发表于 2014-9-25 13:17 | 显示全部楼层
有没有观察一下实际I2C时序对不对呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

14

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部