?? lcd1602.c
字號:
/****************************************Copyright (c)**************************************************
** 智 能 充 電 器 開 發 小 組
** OurAVR 論壇
** QQ 群: 26052247
**
** http://www.ouravr.com/bbs
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: LCD1206.c
**創 建 人: Trinove
**最后修改日期: 2008年01月13日
**描 述: LCD1602字符型液晶的底層函數 FOR AVR MCU / Mega16
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 呂海安
** 版 本: v1.0
** 日 期: 2008年01月13日
** 描 述: 原始版本
**
**--------------歷史版本信息------------------------------------------------------------------------------
** 修改人: martin7wind
** 日 期: 2008年02月03日
** 描 述: For 智能充電器
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 呂海安
** 日 期: 2008年03月02日
** 描 述: 修改格式,歸檔
**
**------------------------------------------------------------------------------------------------------
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 村長 aleyn.wu
** 日 期: 2008年3月3日
** 描 述: 修改了一些BUG,使本項目能在CVAVR下編譯通過
** 增加了一個函數
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "LCD1602.h"
/*----------------------------------------------------------------------------
四線模式:
LCD: 1602
PIN0~7, RW, E, RS
連線如下:
PIN7 --> PB4
PIN6 --> PD2
PIN5 --> PD3
PIN4 --> PD6
RW --> GND (R/W = 0 write)
E --> PA6 (E = 1 enable )
RS --> PA7 (RS = 0 CMD; RS = 1 DATA )
---------------------------------------------------------------------------*/
#define LCD_DATA7_DDR DDRB
#define LCD_DATA6_DDR DDRD
#define LCD_DATA5_DDR DDRD
#define LCD_DATA4_DDR DDRD
#define LCD_DATA7_PIN PINB
#define LCD_DATA6_PIN PIND
#define LCD_DATA5_PIN PIND
#define LCD_DATA4_PIN PIND
#define LCD_DATA7_PORT PORTB
#define LCD_DATA6_PORT PORTD
#define LCD_DATA5_PORT PORTD
#define LCD_DATA4_PORT PORTD
#define LCD_DATA7 PB4
#define LCD_DATA6 PD2
#define LCD_DATA5 PD3
#define LCD_DATA4 PD6
#define LCD_E_DDR DDRA
#define LCD_E_PORT PORTA
#define LCD_E PA6
#define LCD_E_HIGH BIT_SET(LCD_E_PORT, LCD_E)
#define LCD_E_LOW BIT_CLR(LCD_E_PORT, LCD_E)
#define LCD_RS_DDR DDRA
#define LCD_RS_PORT PORTA
#define LCD_RS PA7
#define LCD_DATA_MODE BIT_SET(LCD_RS_PORT, LCD_RS)
#define LCD_CMD_MODE BIT_CLR(LCD_RS_PORT, LCD_RS)
#define BIT_POSITION7 (1<<7)
#define BIT_POSITION6 (1<<6)
#define BIT_POSITION5 (1<<5)
#define BIT_POSITION4 (1<<4)
#define LINE_1 0
#define LINE_2 1
INT16U temp;
/*******************************************************************************************************
** 函數名稱: delay_1us
** 功能描述: delay 1 us,16mhz, 1 nop bring 62.5ns delay
** 輸入參數: 無
** 輸出參數: 無
********************************************************************************************************/
void delay_1us(void)
{
INT8U i;
for(i = 15; i > 0; i--);
}
/*******************************************************************************************************
** 函數名稱: delay_xus
** 功能描述: 延時 N uS
** 輸入參數: INT8U t: N 個單位
** 輸出參數: 無
********************************************************************************************************/
void delay_xus(INT8U t)
{
for( ; t>0; t--)
{
delay_1us();
}
}
/*******************************************************************************************************
** 函數名稱: lcd_write_cmd
** 功能描述: 最初的初始化設置中,寫入數據函數
** 輸入參數: INT8U cmd: 命令
** 輸出參數: 無
********************************************************************************************************/
void lcd_write_cmd(INT8U cmd)
{
LCD_CMD_MODE;
if(cmd & BIT_POSITION7)
{BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
else
{BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
if(cmd & BIT_POSITION6)
{BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
else
{BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
if(cmd & BIT_POSITION5)
{BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
else
{BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
if(cmd & BIT_POSITION4)
{BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
else
{BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
LCD_E_HIGH; // E 信號
delay_us(5);
LCD_E_LOW;
}
/*******************************************************************************************************
** 函數名稱: lcd_write_byte
** 功能描述: 向LCD寫入數據
** 輸入參數: INT8U byte: 數據
** INT8U type: 類型
** 輸出參數: 無
********************************************************************************************************/
void lcd_write_byte(INT8U byte, INT8U type)
{
if(type)
{LCD_DATA_MODE;}
else
{LCD_CMD_MODE;}
temp = byte;
if(byte & BIT_POSITION7)
{BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
else
{BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
if(byte&BIT_POSITION6)
{BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
else
{BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
if(byte&BIT_POSITION5)
{BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
else
{BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
if(byte&BIT_POSITION4)
{BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
else
{BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
LCD_E_HIGH; // E 信號
delay_us(5);
LCD_E_LOW;
delay_xus(39); // 39 us!
byte <<= 4;
if(byte & BIT_POSITION7)
{BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
else
{BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
if(byte & BIT_POSITION6)
{BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
else
{BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
if(byte & BIT_POSITION5)
{BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
else
{BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
if(byte & BIT_POSITION4)
{BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
else
{BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
LCD_E_HIGH; // E 信號
delay_xus(5);
LCD_E_LOW;
delay_ms(10); // 延時 10 mS
}
/*******************************************************************************************************
** 函數名稱: lcd_cls
** 功能描述: 清屏
** 輸入參數: 無
** 輸出參數: 無
********************************************************************************************************/
void lcd_cls()
{
lcd_write_byte(0x01, CMD);
}
/*******************************************************************************************************
** 函數名稱: lcd_init
** 功能描述: 1602 液晶初始化函數
** 輸入參數: 無
** 輸出參數: 無
********************************************************************************************************/
void lcd_init()
{
// 相關IO配置
BIT_SET(LCD_DATA7_DDR, LCD_DATA7);
BIT_SET(LCD_DATA6_DDR, LCD_DATA6);
BIT_SET(LCD_DATA5_DDR, LCD_DATA5);
BIT_SET(LCD_DATA4_DDR, LCD_DATA4);
BIT_SET(LCD_E_DDR, LCD_E);
BIT_SET(LCD_RS_DDR, LCD_RS);
delay_ms(15); // 上電延時15MS以上
lcd_write_cmd(0x30); // 上電初始化命令
delay_ms(5); // delay > 5.1MS
lcd_write_cmd(0x30);
delay_ms(5); // delay > 100us
lcd_write_cmd(0x30);
delay_ms(15);
lcd_write_cmd(0x20); // 四位數據模式
delay_ms(15);
//功能設定
lcd_write_byte(0x28, CMD); // 0x28 = 4 位數據線,雙行顯示,5*7 字型
//LCD_write_byte(0x0e, CMD); // 0x0e = 顯示開,光標不閃爍
lcd_write_byte(0x0c, CMD); // 0x0c = 顯示開,光標不顯示
lcd_write_byte(0x06, CMD); // 0x06 = 每次輸入后光標右移一格
lcd_cls(); // 清屏
}
/*******************************************************************************************************
** 函數名稱: lcd_write_char
** 功能描述: 在 X,Y 坐標寫單字符
** 輸入參數: INT8U lcd_x: x 坐標
** INT8U lcd_y: y 坐標
** INT8U data: 單字符
** 輸出參數: 無
********************************************************************************************************/
void lcd_write_char(INT8U lcd_x, INT8U lcd_y, INT8U data)
{
if(lcd_y) // 第二行
{
lcd_write_byte(0xc0+lcd_x, CMD);
}
else // 第一行
{
lcd_write_byte(0x80+lcd_x, CMD);
}
lcd_write_byte(data, DATA);
}
/*******************************************************************************************************
** 函數名稱: lcd_locate
** 功能描述: 定位 LCD 行列位置
** 輸入參數: INT8U lcd_x: x 坐標
** INT8U lcd_y: y 坐標
** 輸出參數: 無
********************************************************************************************************/
void lcd_locate(INT8U lcd_x, INT8U lcd_y)
{
if(lcd_y) // 第二行
{
lcd_write_byte(0xc0 + lcd_x, CMD);
}
else // 第一行
{
lcd_write_byte(0x80 + lcd_x, CMD);
}
}
/*******************************************************************************************************
** 函數名稱: lcd_print_string
** 功能描述: 向 LCD 發送顯示文字
** 輸入參數: char *pstring: 顯示文字指針pstring
** 輸出參數: 無
********************************************************************************************************/
void lcd_print_string(char *pstring)
{
while(*pstring)
{
lcd_write_byte(*pstring, DATA);
pstring++;
}
}
/*******************************************************************************************************
** 函數名稱: lcd_print_stringF
** 功能描述: 向 LCD 發送顯示文字
** 輸入參數: flash char *pstring: 顯示文字指針pstring
** 輸出參數: 無
********************************************************************************************************/
void lcd_print_stringF(flash char *pstring)
{
while(*pstring)
{
lcd_write_byte(*pstring, DATA);
pstring++;
}
}
/*******************************************************************************************************
** 函數名稱: lcd_print_number
** 功能描述: 向 LCD 發送顯示數據
** 輸入參數: INT16S number: 數值, 為有符號的整數
** INT8U ca: 顯示的位數 (1 - 6)
** INT8U cb: 其中的小數位數,(類似定點的小數),顯示整數時,cb 置 0 即可
** 輸出參數: 無
********************************************************************************************************/
void lcd_print_number(INT16S number , INT8U ca , INT8U cb)
{
INT8U _bit[5]; // 最多 5 位
INT8U *pbit;
INT8U i;
if(number > 0)
{
temp = number;
}
else
{
temp = -number;
}
// temp = 12345;
// 算出每一位 057920
_bit[4] = (INT8U)(temp/10000);
_bit[3] = (INT8U)(temp/1000 - _bit[4]*10);
_bit[2] = (INT8U)(temp/100 - _bit[4]*100 - _bit[3]*10);
_bit[1] = (INT8U)(temp/10 - _bit[4]*1000 - _bit[3]*100 - _bit[2]*10);
_bit[0] = (INT8U)(temp - _bit[4]*10000 - _bit[3]*1000 - _bit[2]*100 - _bit[1]*10);
if(number < 0) // 負值
{
lcd_write_byte('-', DATA); //先顯示負號
pbit = &(_bit [4]); //指向最高位
for(i = 5 - ca; i > 0; i--)
{
pbit --;
}
while(ca)
{
if(ca == cb)
{
lcd_write_byte('.', DATA);
}
lcd_write_byte(*pbit+48, DATA);
pbit --;
ca--;
}
}
else // 正數
{
pbit = &(_bit [4]); //指向最高位
for(i = 5 - ca; i > 0; i--)
{
pbit --;
}
while(ca)
{
if(ca == cb)
{
lcd_write_byte('.', DATA);
}
lcd_write_byte(*pbit+48,DATA);
pbit --;
ca--;
}
}
}
/**************************************************************************************×*****************
** END OF FILE
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -