⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_hd44780.c

📁 这是我自已写的HD44780 LCD1602液晶屏的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
* 入 口 : 'Data'  是当前要写入的数据
* 返 回 : 无
* 说 明 : 如果送到数据端口的数据跟实际需要送出的数据不一样 表示LCM可能出问题或着有共享的I/O被利用了
*         则需要等待其他的释放共享的I/O 来保证数据的正确性
**************************************************************************************************/
void HD44780_Write_Data (INT8U Data)
{
    HD44780_Read_Cmd();                                    // 等待LCD空闲

#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)

//    HD44780_Data_W_Add = Data;
#else

    HD44780_Data_Mode();                                   // 选择数据寄存器
    HD44780_Wr_Mode ();                                    // 选择写状态

    HD44780_Data_PORT_Wr(Data);                            // 向LCD数据端口写数据
#endif
}

/**************************************************************************************************
* 功 能 : 从LCM数据寄存器读一字节数据
* 入 口 : 
* 返 回 : 当前读到的数据
* 说 明 : 在调用此函数前需要写入要读数据的地址 如果是当前读 则不需要
**************************************************************************************************/

#if (EN_HD44780_Read_Data > 0)||(EN_LCD_CGRAM_read_byte > 0)
INT8U HD44780_Read_Data (void)
{ 
#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)

//    return (HD44780_Data_R_Add);
#else

    HD44780_Read_Cmd();                                    // 等待LCD空闲

    HD44780_Data_Mode();                                   // 选择命令寄存器
    HD44780_Rd_Mode();                                     // 选择读状态

    return (HD44780_Data_PORT_Rd());
#endif
}
#endif



/**************************************************************************************************
* 功 能 : 读状态 等待LCD空闲
* 入 口 : 无
* 返 回 : 状态字
* 说 明 : STA0-6  当前数据地址指针的数值
*         STA7    读写操作使能 1: 禁止0:  允许
*         对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0 
***************************************************************************************************/

INT8U HD44780_Read_Cmd(void)// 等待LCD空闲
{
    INT8U i;

#if (HD44780_COMM_PORT == HD44780_8_Bits_SRAM)
/*
    do {
  #if DEBUG_HD44780_Read_Cmd >0
        i = HD44780_Cmd_R_Add;
  #else
        i = (HD44780_Cmd_R_Add & ~(1 << HD44780_BUSY_BIT));  // 确保STA7为0
  #endif
    }while ( i &(1 << HD44780_BUSY_BIT));                  // RW=1,读PD7,为0表示空闲;

    return (i);
*/
#else
    HD44780_Cmd_Mode();                                    // 选择命令寄存器
    HD44780_Rd_Mode();                                     // 选择读状态

    do {
  #if DEBUG_HD44780_Read_Cmd >0
        i = HD44780_Data_PORT_Rd();
  #else
        i = (HD44780_Data_PORT_Rd() & ~(1 << HD44780_BUSY_BIT));  // 确保STA7为0
  #endif
    }while ( i &(1 << HD44780_BUSY_BIT));                  // RW=1,读PD7,为0表示空闲;

    return (i);
#endif
}


/**************************************************************************************************
* 功 能 : 从LCD数据端口读数据
* 入 口 : 无
* 返 回 : 数据端口的数据
* 说 明 :
**************************************************************************************************/
#if (HD44780_COMM_PORT != HD44780_8_Bits_SRAM)
static INT8U HD44780_Data_PORT_Rd (void)
{
    HD44780_Data_Port_In();                                // I/O口方向设置为输入
    INT8U i = 0;
#if(HD44780_COMM_PORT == HD44780_8_Bits_Bus)///////////////// 8位总线

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定
    
    i = HD44780_Data_PIN;                                  // 读数据

#elif (HD44780_COMM_PORT == HD44780_8_Bits_IO)/////////////// 8位普通I/O口

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定
    
    SETBITFLAG( i,0, BITHIGH( HD44780_Data0_PIN, HD44780_Data0));// 读数据
    SETBITFLAG( i,1, BITHIGH( HD44780_Data1_PIN, HD44780_Data1));
    SETBITFLAG( i,2, BITHIGH( HD44780_Data2_PIN, HD44780_Data2));
    SETBITFLAG( i,3, BITHIGH( HD44780_Data3_PIN, HD44780_Data3));
    SETBITFLAG( i,4, BITHIGH( HD44780_Data4_PIN, HD44780_Data4));
    SETBITFLAG( i,5, BITHIGH( HD44780_Data5_PIN, HD44780_Data5));
    SETBITFLAG( i,6, BITHIGH( HD44780_Data6_PIN, HD44780_Data6));
    SETBITFLAG( i,7, BITHIGH( HD44780_Data7_PIN, HD44780_Data7));

#elif (HD44780_COMM_PORT == HD44780_4_Bits_HBus)//////////////// 4位总线(高半字节)

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定

    i = HD44780_Data_PIN & 0xf0;                          // 读高4位的数据

    HD44780_E_Low();                                       // E --\__

    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定

   i |=  HD44780_Data_PIN >> 4;                            // 读低4位的数据
   
#elif (HD44780_COMM_PORT == HD44780_4_Bits_LBus)///////////// 4位总线(低半字节)

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定

    i = (HD44780_Data_PIN << 4) & 0xf0;                    // 读高4位的数据

    HD44780_E_Low();                                       // E --\__

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定

    i |=  HD44780_Data_PIN & 0x0f;                         // 读低4位的数据

#elif (HD44780_COMM_PORT == HD44780_4_Bits_IO)/////////////// 4位普通I/O口

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定

    SETBITFLAG( i,4, BITHIGH( HD44780_Data4_PIN, HD44780_Data4));// 读高4位的数据
    SETBITFLAG( i,5, BITHIGH( HD44780_Data5_PIN, HD44780_Data5));
    SETBITFLAG( i,6, BITHIGH( HD44780_Data6_PIN, HD44780_Data6));
    SETBITFLAG( i,7, BITHIGH( HD44780_Data7_PIN, HD44780_Data7));
    
    HD44780_E_Low();                                       // E --\__

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCD E信号稳定
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定

    SETBITFLAG( i,0, BITHIGH( HD44780_Data4_PIN, HD44780_Data4));// 读低4位的数据
    SETBITFLAG( i,1, BITHIGH( HD44780_Data5_PIN, HD44780_Data5));
    SETBITFLAG( i,2, BITHIGH( HD44780_Data6_PIN, HD44780_Data6));
    SETBITFLAG( i,3, BITHIGH( HD44780_Data7_PIN, HD44780_Data7));
    
#else
    #error "请选择正确通信模式 (HD44780_COMM_MODE)!"
#endif

    HD44780_E_Low();  
    return i;                                                 // 从端口读数据
}
#endif

/**************************************************************************************************
* 功 能 : 向LCD数据端口写数据
* 入 口 : 'Data'  是当前要写入的数据
* 返 回 : 无
* 说 明 :1> 如果送到数据端口的数据跟实际需要送出的数据不一样 表示LCM可能出问题或着有共享的I/O被利
*           用了,则需要等待其他的释放共享的I/O 来保证数据的正确性
**************************************************************************************************/
#if (HD44780_COMM_PORT != HD44780_8_Bits_SRAM)
static void HD44780_Data_PORT_Wr (INT8U Data)
{
    HD44780_Data_Port_Out();                               // I/O口方向设置为输出
    
#if   (HD44780_COMM_PORT == HD44780_8_Bits_Bus)////////////// 8位总线

    HD44780_Data_PORT = Data;                              // 写数据到端口
    
#elif (HD44780_COMM_PORT == HD44780_8_Bits_IO)/////////////// 8位普通I/O口

    SETBITFLAG( HD44780_Data0_PORT, HD44780_Data0, BITHIGH( Data, 0));// 写数据到端口
    SETBITFLAG( HD44780_Data1_PORT, HD44780_Data1, BITHIGH( Data, 1));
    SETBITFLAG( HD44780_Data2_PORT, HD44780_Data2, BITHIGH( Data, 2));
    SETBITFLAG( HD44780_Data3_PORT, HD44780_Data3, BITHIGH( Data, 3));
    SETBITFLAG( HD44780_Data4_PORT, HD44780_Data4, BITHIGH( Data, 4));
    SETBITFLAG( HD44780_Data5_PORT, HD44780_Data5, BITHIGH( Data, 5));
    SETBITFLAG( HD44780_Data6_PORT, HD44780_Data6, BITHIGH( Data, 6));
    SETBITFLAG( HD44780_Data7_PORT, HD44780_Data7, BITHIGH( Data, 7));
        
#elif (HD44780_COMM_PORT == HD44780_4_Bits_HBus)///////////// 4位总线(高半字节)

    HD44780_Data_PORT &= 0x0F;                             // 清数据端口高4bit
    HD44780_Data_PORT |= (Data & 0xf0);                    // 写高4bit数据到端口高4bit

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_Low();                                       // E --\__写入命令数据

    HD44780_Data_PORT &= 0x0F;                             // 清数据端口高4bit
    HD44780_Data_PORT |= (Data << 4);                      // 写低4bit数据到端口高4bit

#elif (HD44780_COMM_PORT == HD44780_4_Bits_LBus)///////////// 4位总线(低半字节)

    HD44780_Data_PORT &= 0xF0;                             // 清数据端口低4bit
    HD44780_Data_PORT |= (Data >> 4);                      // 写高4bit数据到端口低4bit

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_Low();                                       // E --\__写入命令数据
                        
    HD44780_Data_PORT &= 0xF0;                             // 清数据端口低4bit
    HD44780_Data_PORT |= (Data & 0x0F);                    // 写低4bit数据到端口低4bit
    
#elif (HD44780_COMM_PORT == HD44780_4_Bits_IO)/////////////// 4位普通I/O口

    SETBITFLAG( HD44780_Data4_PORT, HD44780_Data4, BITHIGH( Data, 4));// 写高4bit数据到端口
    SETBITFLAG( HD44780_Data5_PORT, HD44780_Data5, BITHIGH( Data, 5));
    SETBITFLAG( HD44780_Data6_PORT, HD44780_Data6, BITHIGH( Data, 6));
    SETBITFLAG( HD44780_Data7_PORT, HD44780_Data7, BITHIGH( Data, 7));

    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_Low();                                       // E --\__写入命令数据

    SETBITFLAG( HD44780_Data4_PORT, HD44780_Data4, BITHIGH( Data, 0));// 低4bit写数据到端口
    SETBITFLAG( HD44780_Data5_PORT, HD44780_Data5, BITHIGH( Data, 1));
    SETBITFLAG( HD44780_Data6_PORT, HD44780_Data6, BITHIGH( Data, 2));
    SETBITFLAG( HD44780_Data7_PORT, HD44780_Data7, BITHIGH( Data, 3));
    
#else
    #error "请选择正确通信模式 (HD44780_COMM_MODE)!"
#endif
    //向LCM操作时序
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_High();                                      // E __/--
    HD44780_E_delay();                                     // 等待LCDE信号稳定 > 1uS
    HD44780_E_Low();                                       // E --\__写入命令数据
}
#endif

/**************************************************************************************************
*           END  OF  FILE
**************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -