#include "lcd_iic.h" #include "gpio.h" #include "devicegpioinit.h" void I2c_Scl_Gpio_Init(void) { CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý OutputIO(LCD_SCL_PIN_GROUP, LCD_SCL_PIN_NUM, OUT_PUSHPULL); LCD_SCL_L; } void Sda_Out(void) { CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý OutputIO(LCD_SDA_PIN_GROUP, LCD_SDA_PIN_NUM, OUT_PUSHPULL); } void Sda_In(void) { CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý InputtIO(LCD_SDA_PIN_GROUP, LCD_SDA_PIN_NUM, IN_NORMAL); } void LCD_IIC_Start(void) { Sda_Out(); LCD_SDA_H; LCD_SCL_H; delay_us(5); LCD_SDA_L; // Æô¶¯¿ªÊ¼ÐźŠdelay_us(4); LCD_SCL_L; // ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý } void LCD_IIC_Stop(void) { Sda_Out(); // SDAÏßÊä³ö LCD_SDA_L; // ·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźŠdelay_us(4); LCD_SCL_H; delay_us(4); // ½áÊøÌõ¼þ½¨Á¢Ê±¼ä´óÓÚ4¦Ì LCD_SDA_H; // ·¢ËÍI2C×ÜÏß½áÊøÐźŠdelay_us(5); } void LCD_IIC_Send_Byte(uint8_t dat) { // unsigned char temp; // Sda_Out(); // for (temp = 0x80; temp != 0; temp >>= 1) // { // if ((temp & dat) == 0) // LCD_SDA_L; // else // LCD_SDA_H; // delay_us(1); /// ½¨Á¢Êý¾Ýʱ¼ä // LCD_SCL_H; // delay_us(4); // t_h // LCD_SCL_L; // delay_us(5); // t_l unsigned char i; Sda_Out(); for (i = 0; i < 8; i++) { if (dat & 0x80) LCD_SDA_H; else LCD_SDA_L; dat <<= 1; delay_us(10); LCD_SCL_H; delay_us(10); LCD_SCL_L; } delay_us(10); LCD_SCL_H; delay_us(10); LCD_SCL_L; } uint8_t LCD_IIC_Read_Byte(void) { unsigned char temp; unsigned char dat = 0; LCD_SDA_H; // ÊÍ·Å×ÜÏß×¼±¸½ÓÊÕ Sda_In(); for (temp = 0x80; temp != 0; temp >>= 1) { LCD_SCL_H; delay_us(1); if (LCD_SDA_READ == 1) dat |= temp; else dat &= ~temp; LCD_SCL_L; delay_us(4); } return dat; } // uint8_t LCD_IIC_Read_Byte(void)/*(bool ack)*/ //{ // // uint8_t byte = 0; // LCD_SDA_H; // È·±£SDAΪÊäÈë // for (int i = 0; i < 8; i++) { // LCD_SCL_H; // delay_us(1); // byte <<= 1; // if (LCD_SDA_READ) { // byte |= 0x01; // } // LCD_SCL_L; // delay_us(4); // } //// if (ack) { //// LCD_IIC_Ack(); //// } else { //// LCD_IIC_NAck(); //// } // Sda_Out(); // return byte; // //} char LCD_IIC_Wait_Ack(void) { uint32_t con = 0; Sda_In(); LCD_SDA_H; // ÊÍ·ÅÊý¾ÝÏߣ¬×¼±¸½ÓÊÕÓ¦´ð delay_us(1); LCD_SCL_H; // CPUÇý¶¯SCL = 1, ´ËʱÆ÷¼þ»á·µ»ØACKÓ¦´ð delay_us(1); while (LCD_SDA_READ) // CPU¶ÁÈ¡SDA¿ÚÏß״̬ { con++; if (con > 500) { LCD_IIC_Stop(); return 1; // ÎÞÓ¦´ðÐźŠ} } LCD_SCL_L; delay_us(1); return 0; // ÓÐÓ¦´ð } void LCD_IIC_Ack(void) { Sda_Out(); LCD_SDA_L; delay_us(1); LCD_SCL_H; // CPU²úÉú1¸öʱÖÓ delay_us(4); // ʱÖÓµÍµçÆ½ÖÜÆÚ´óÓÚ4¦Ì LCD_SCL_L; // ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ delay_us(4); LCD_SDA_H; // CPUÊÍ·ÅSDA×ÜÏß } void LCD_IIC_NAck(void) { Sda_Out(); LCD_SDA_H; delay_us(1); LCD_SCL_H; delay_us(4); LCD_SCL_L; delay_us(4); } /* LCDд²Ù×÷£º ÆðʼÐźš¢Ð´´Ó»úµØÖ·¡¢ÃüÁî×Ö½Ú¡¢É趨×Ö½Ú¡¢Í£Ö¹ÐźŠ*/ void LCD_Write(u8 command_add, u8 *wait_data, u8 data_len) { u8 i = 0; LCD_IIC_Start(); LCD_IIC_Send_Byte(LCD_ADDR_WRITE); LCD_IIC_Send_Byte(command_add); for (i = 0; i < data_len; i++) LCD_IIC_Send_Byte(wait_data[i]); LCD_IIC_Stop(); } /* ÏÔʾÊý¾ÝÊäÈëÃüÁstarts +w/r_addr+ ÃüÁî×Ö½Ú£¨0x80£©+ram¼Ä´æÆ÷µØÖ·+Êý¾ÝÄÚÈÝ......+stop ÐźŠ*/ void LCD_Write_reg(u8 sadd, u8 *buf, u8 len) { u8 i = 0; LCD_IIC_Start(); LCD_IIC_Send_Byte(LCD_ADDR_WRITE); LCD_IIC_Send_Byte(LCD_REG_DATA_ADDR); LCD_IIC_Send_Byte(sadd); for (i = 0; i < len; i++) { LCD_IIC_Send_Byte(buf[i]); } LCD_IIC_Stop(); }