各位大大,
使用的是 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天了,还是不行,谁来救我啊
|