?? lcd_51.c
字號:
/*======================================================================================
本源程序包括的頭部文件
======================================================================================*/
#include "ATmega16.h" /* 包含目標(biāo)器件芯片的頭部文件 */
#include "LCDM_HD61202_128D64.h" /* 本程序的頭部文件 */
#include "DELAY.H" /* 包含延時函數(shù)的頭部文件 */
#include "Lattice_Character.h" /* 包含字符點陣數(shù)據(jù)表的頭部文件 */
/*======================================================================================
程序指令代碼清單
======================================================================================*/
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于控制液晶模塊的MCU輸入/輸出引腳的初始化操作。
備注: 本函數(shù)僅在主函數(shù)中調(diào)用一次即可,除非釋放各控制引腳作為其他用途,
如要再使用這些控制引腳來控制液晶模塊則需在主函數(shù)中再調(diào)用一次本函數(shù)。
----------------------------------------------------------------------------*/
void LCDM_initialization(void)
{
/* 下面這些語句用于設(shè)置液晶模塊的各控制引腳與MCU的連接定義 */
LCDM_BL_DDR |= LCDM_BL_PINNum; /* 設(shè)置液晶的背景燈控制端口為輸出引腳 */
LCDM_BL_PORT &= ~LCDM_BL_PINNum;
LCDM_DI_DDR |= LCDM_DI_PINNum; /* 設(shè)置液晶的寄存器選擇控制端口為輸出引腳 */
LCDM_DI_PORT &= ~LCDM_DI_PINNum;
LCDM_RW_DDR |= LCDM_RW_PINNum; /* 設(shè)置液晶的讀/寫選擇控制端口為輸出引腳 */
LCDM_RW_PORT &= ~LCDM_RW_PINNum;
LCDM_EN_DDR |= LCDM_EN_PINNum; /* 設(shè)置液晶的使能信號控制端口為輸出引腳 */
LCDM_EN_PORT &= ~LCDM_EN_PINNum;
LCDM_CS1_DDR |= LCDM_CS1_PINNum; /* 設(shè)置液晶的片選1控制端口為輸出引腳 */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum;
LCDM_CS2_DDR |= LCDM_CS2_PINNum; /* 設(shè)置液晶的片選2控制端口為輸出引腳 */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum;
LCDM_RST_DDR |= LCDM_RST_PINNum; /* 設(shè)置液晶的復(fù)位信號控制端口為輸出引腳 */
LCDM_RST_PORT &= ~LCDM_RST_PINNum;
LCDM_DATA_DDR = 0xFF; /* 設(shè)置液晶模塊的數(shù)據(jù)端口為輸出引腳 */
LCDM_DATA_PORT = 0x00;
/* 下面這些語句用于液晶模塊的初始化復(fù)位 */
LCDM_RST_PORT &= ~LCDM_RST_PINNum; /* 置復(fù)位信號為低電平 */
delay_ms(2);
LCDM_RST_PORT |= LCDM_RST_PINNum; /* 置復(fù)位信號為高電平 */
delay_ms(2);
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于控制液晶模塊背景燈打開/關(guān)閉的操作。
函數(shù)入口參數(shù):BL_status ------ 僅可取二個值 ON 或 OFF 中的一個。
----------------------------------------------------------------------------*/
void LCDM_BackgroundLight(Uchar8 BL_status)
{
if (BL_status == ON)
{
LCDM_BL_DDR |= LCDM_BL_PINNum; /* 設(shè)置液晶的背景燈控制端口為輸出引腳 */
LCDM_BL_PORT |= LCDM_BL_PINNum; /* 打開液晶的背景燈 */
delay_us(2); /* 延時2us */
}
if (BL_status == OFF)
{
LCDM_BL_DDR |= LCDM_BL_PINNum; /* 設(shè)置液晶的背景燈控制端口為輸出引腳 */
LCDM_BL_PORT &= ~LCDM_BL_PINNum; /* 關(guān)閉液晶的背景燈 */
delay_us(2); /* 延時2us */
}
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于控制液晶模塊顯示打開/關(guān)閉的操作。
函數(shù)入口參數(shù):Dpy_status ------ 僅可取二個值 ON 或 OFF 中的一個。
----------------------------------------------------------------------------*/
void LCDM_Display(Uchar8 Dpy_status)
{
if (Dpy_status == ON)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器選擇為L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置讀/寫選擇為L */
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片選1為H */
/* 將打開液晶顯示的控制指令字輸出到片1的數(shù)據(jù)端口 */
LCDM_DATA_PORT = LCDM_ON_Display;
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片選1為L */
LCDM_CS2_PORT |= LCDM_CS2_PINNum; /* 置片選2為H */
/* 將打開液晶顯示的控制指令字輸出到片2的數(shù)據(jù)端口 */
LCDM_DATA_PORT = LCDM_ON_Display;
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片選2為L */
}
if (Dpy_status == OFF)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器選擇為L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置讀/寫選擇為L */
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片選1為H */
/* 將關(guān)閉液晶顯示的控制指令字輸出到片1的數(shù)據(jù)端口 */
LCDM_DATA_PORT = LCDM_OFF_Display;
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片選1為L */
LCDM_CS2_PORT |= LCDM_CS2_PINNum; /* 置片選2為H */
/* 將關(guān)閉液晶顯示的控制指令字輸出到片2的數(shù)據(jù)端口 */
LCDM_DATA_PORT = LCDM_OFF_Display;
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片選2為L */
}
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于控制液晶模塊設(shè)置顯示開始行的操作。
函數(shù)入口參數(shù):line_num ------ 開始行數(shù)值。(數(shù)值范圍:line_num ≤63)
----------------------------------------------------------------------------*/
void LCDM_SetStartLine(Uchar8 line_num)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器選擇為L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置讀/寫選擇為L */
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片選1為H */
/* 將設(shè)置的開始顯示行數(shù)值與控制指令字一同輸出到片1的數(shù)據(jù)端口 */
LCDM_DATA_PORT = LCDM_StartLine_1 + line_num;
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片選1為L */
LCDM_CS2_PORT |= LCDM_CS2_PINNum; /* 置片選2為H */
/* 將設(shè)置的開始顯示行數(shù)值與控制指令字一同輸出到片2的數(shù)據(jù)端口 */
LCDM_DATA_PORT = LCDM_StartLine_1 + line_num;
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片選2為L */
}
/*----------------------------------------------------------------------------
下面這個函數(shù)用于向液晶模塊寫入控制指令代碼。
函數(shù)入口參數(shù):WriteCode ------ 向液晶模塊寫入的控制指令代碼 。
WC_CSNum ------- 片選數(shù)值,僅可取二個值 CS1 或 CS2 中的一個。
----------------------------------------------------------------------------*/
void LCDM_WriteCode(Uchar8 WriteCode, Uchar8 WC_CSNum)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器選擇為L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置讀/寫選擇為L */
if (WC_CSNum == CS1)
{
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片選1為H */
}
if (WC_CSNum == CS2)
{
LCDM_CS1_PORT |= LCDM_CS2_PINNum; /* 置片選2為H */
}
LCDM_DATA_PORT = WriteCode; /* 將控制指令代碼輸出到的數(shù)據(jù)端口 */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片選1為L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片選2為L */
}
/*----------------------------------------------------------------------------
下面這個函數(shù)用于向液晶模塊寫入顯示數(shù)據(jù)。
函數(shù)入口參數(shù):WriteData ------ 向液晶模塊寫入的顯示數(shù)據(jù) 。
WD_CSNum ------- 片選數(shù)值,僅可取二個值 CS1 或 CS2 中的一個。
----------------------------------------------------------------------------*/
void LCDM_WriteData(Uchar8 WriteData, Uchar8 WD_CSNum)
{
LCDM_DI_PORT |= LCDM_DI_PINNum; /* 置寄存器選擇為H */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置讀/寫選擇為L */
if (WD_CSNum == CS1)
{
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片選1為H */
}
if (WD_CSNum == CS2)
{
LCDM_CS1_PORT |= LCDM_CS2_PINNum; /* 置片選2為H */
}
LCDM_DATA_PORT = WriteData; /* 將顯示數(shù)據(jù)輸出到的數(shù)據(jù)端口 */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
delay_us(2); /* 延時2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信號為H */
delay_us(2); /* 延時2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信號為L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片選1為L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片選2為L */
}
/*----------------------------------------------------------------------------
函數(shù)功能: 本函數(shù)用于在液晶屏幕上在指定坐標(biāo)位置(x,y)顯示單個點陣字符的操作。
函數(shù)入口參數(shù):x ----------------- X軸坐標(biāo),其數(shù)值范圍:x ≤63。
y ----------------- Y軸坐標(biāo),其數(shù)值范圍:y ≤7。
*pdc_address ------ 顯示字符點陣數(shù)據(jù)存儲地址,即指向存儲點陣數(shù)據(jù)的指針。
dc_row_num -------- 顯示字符行點數(shù),其數(shù)值范圍:x ≤127。
dc_column_num ----- 顯示字符列點數(shù),其數(shù)值范圍:x ≤63。
備注: ①.參數(shù) y(Y軸坐標(biāo))的數(shù)值范圍:y ≤7。
②.在移植程序時,請注意 *pdc_address 參數(shù)前的 flash 關(guān)鍵字,此關(guān)鍵字
為 CodeVision AVR C 所擴充,在移植時要做相應(yīng)修改。
----------------------------------------------------------------------------*/
void LCDM_Display_Character(Uchar8 x, /* X軸坐標(biāo) */
Uchar8 y, /* Y軸坐標(biāo) */
const Uchar8 flash *pdc_address, /* 字符點陣數(shù)據(jù)存儲地址 */
const Uchar8 dc_row_num, /* 顯示字符行點數(shù) */
const Uchar8 dc_column_num) /* 顯示字符列點數(shù) */
{
register Uchar8 i_counter; /* 行循環(huán)計數(shù)器變量 */
register Uchar8 j_counter; /* 列循環(huán)計數(shù)器變量 */
register Uchar8 temp; /* 臨時寄存器變量 */
register Uchar8 temp_data; /* 臨時數(shù)據(jù)寄存器變量 */
LCDM_BackgroundLight(ON); /* 打開液晶的背景燈 */
LCDM_Display(ON); /* 打開液晶顯示屏幕 */
LCDM_SetStartLine(0); /* 設(shè)置顯示開始行為第一行 */
j_counter = dc_column_num/LCDM_DataBits; /* 列循環(huán)次數(shù)=字符列點數(shù)÷字符位長 */
temp = x + dc_row_num; /* 字符行寬范圍=X軸坐標(biāo)+顯示字符行點數(shù) */
if (temp < LCDM_MaxRowDot) /* 字符行寬范圍是否全部在芯片1內(nèi)? */
{
x = x + LCDM_Yaddress_1; /* 設(shè)置X軸坐標(biāo) */
LCDM_WriteCode(x, CS1);
y = y + LCDM_DataPage_1; /* 設(shè)置Y軸坐標(biāo) */
LCDM_WriteCode(y, CS1);
while (j_counter>0)
{
for (i_counter=dc_row_num; i_counter>0; i_counter--)
/* 行循環(huán)次數(shù)=字符行點數(shù) */
{
temp_data = *(pdc_address++); /* 輸入顯示字符點陣數(shù)據(jù) */
LCDM_WriteData(temp_data, CS1); /* 將顯示字符點陣數(shù)據(jù)寫入液晶顯示屏幕 */
}
LCDM_WriteCode(x, CS1); /* X軸坐標(biāo)退回到設(shè)置點 */
y = y + 1; /* 顯示頁數(shù)(Y軸坐標(biāo))+1 */
LCDM_WriteCode(y, CS1);
j_counter--;
}
}
else /* 否則字符行寬范圍即在芯片2和芯片1之間 */
{
if (x >= LCDM_MaxRowDot) /* 字符行寬范圍是否全部在芯片2內(nèi)? */
{
x = x - LCDM_MaxRowDot; /* X軸坐標(biāo)=X軸坐標(biāo)-芯片1的最大行點陣數(shù) */
x = x + LCDM_Yaddress_1; /* 設(shè)置X軸坐標(biāo) */
LCDM_WriteCode(x, CS2);
y = y + LCDM_DataPage_1; /* 設(shè)置Y軸坐標(biāo) */
LCDM_WriteCode(y, CS2);
while (j_counter>0)
{
for (i_counter=dc_row_num; i_counter>0; i_counter--)
/* 行循環(huán)次數(shù)=字符行點數(shù) */
{
temp_data = *(pdc_address++); /* 輸入顯示字符點陣數(shù)據(jù) */
LCDM_WriteData(temp_data, CS2); /* 將顯示字符點陣數(shù)據(jù)寫入液晶顯示屏幕 */
}
LCDM_WriteCode(x, CS2); /* X軸坐標(biāo)退回到設(shè)置點 */
y = y + 1; /* 顯示頁數(shù)(Y軸坐標(biāo))+1 */
LCDM_WriteCode(y, CS2);
j_counter--;
}
}
else
{
temp = x + LCDM_Yaddress_1; /* 設(shè)置X軸坐標(biāo) */
LCDM_WriteCode(temp, CS1);
y = y + LCDM_DataPage_1; /* 設(shè)置Y軸坐標(biāo) */
LCDM_WriteCode(y, CS1);
while (j_counter>0)
{
for (i_counter=(LCDM_MaxRowDot-x); i_counter>0; i_counter--)
/* 芯片1行循環(huán)次數(shù)=芯片1的最大行點陣數(shù)-X軸坐標(biāo) */
{
temp_data = *(pdc_address++); /* 輸入顯示字符點陣數(shù)據(jù) */
LCDM_WriteData(temp_data, CS1); /* 將顯示字符點陣數(shù)據(jù)寫入液晶顯示屏幕 */
}
temp = 0 + LCDM_Yaddress_1; /* 設(shè)置芯片2的X軸坐標(biāo)為起點 */
LCDM_WriteCode(temp, CS2);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -