打印
[STM8]

为什么1602显示不出字符?

[复制链接]
1107|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
层层天|  楼主 | 2014-9-24 23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, ck, BLE, ni, ip
各位大大,
使用的是 STM8S103F3芯片,通过I2C连接的LCD 1602 的屏。
I2C 已上拉。

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

        // init
        I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR,
           I2C_ADDMODE_7BIT, CLK_GetClockFreq()/1000000);

        // 使能I2C
        I2C_Cmd( ENABLE);
LCD初始化:
void I2C_JLX_send_data(char *data, int data_len)
{
        if (data_len <= 0) {
                return;
        }
       
        /* 等待空闲 */
   while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
   
   /* 发起始位 */
   I2C_GenerateSTART(ENABLE);
   
   /* 测试EV5 ,检测从器件返回一个应答信号*/
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
   
   /* 设置I2C从器件地址,I2C主设备为写模式*/
   I2C_Send7bitAddress(0x78, I2C_DIRECTION_TX);

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

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

   /* 不断往从设备写数据*/
   while(data_len--)       
   {
         
         I2C_SendData(*data);

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

   /* 发结束位*/
   I2C_GenerateSTOP(ENABLE);
}


void initial_lcd(void)
{
        char init_cmd[5] = {
                0x00, /*控制字节:Co=0,A0=0,表示以下传输的 N 个字节是指令*/
                0x38, // function set
                0x0C, //Display ON/OFF
                0x01, //Clear display
                0x06 //Entry mode set
        };
       
//        I2C_send_data(init_cmd, 5);
        I2C_JLX_send_data(init_cmd, 5);
}

最后显示数据

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

        buf[0] = 0x80;
        buf[1] = 0x80+(line-1)*0x40+(column-1);
        buf[2] = 0x40;
       
        for(i=0;i<16;i++)
        {
                buf[3 + i] = *dp;
                dp++;
        }

//        I2C_send_data(buf, 19);
        I2C_JLX_send_data(buf, 19);
}

调用的是
        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

粉丝