?? lcm12864.h
字號:
//*******************************************************************************
//*文件:lcm12864.h *
//*說明:lcm12864液晶(帶字庫)驅動函數庫 7920控制器 8位并口方式驅動 *
//*平臺:AVR *
//*作者:陳崇 *
//*建立:2006-12-20 *
//*修改:2007-5-26 *
//*******************************************************************************
#ifndef _LCM12864_DRIVER_
#define _LCM12864_DRIVER_
#define LCD_DB_OUT PORTC // LCD數據端口
#define LCD_DB_SET_OUT DDRC=0xFF // 設置數據端口為輸出
#define LCD_DB_SET_IN DDRC=0x00 // 設置數據端口為輸入
#define LCD_RST_SBI PORTD|=_BV(PD1) // RST置位
#define LCD_RST_CBI PORTD&=~_BV(PD1) // RST清零9
#define LCD_PSB_SBI PORTD|=_BV(PD7) // PSB置位
#define LCD_PSB_CBI PORTD&=~_BV(PD7) // PSB清零
#define LCD_E_SBI PORTA|=_BV(PA5) // E置位
#define LCD_E_CBI PORTA&=~_BV(PA5) // E清零
#define LCD_RW_SBI PORTA|=_BV(PA6) // RW置位
#define LCD_RW_CBI PORTA&=~_BV(PA6) // RW清零
#define LCD_RS_SBI PORTA|=_BV(PA7) // RS置位
#define LCD_RS_CBI PORTA&=~_BV(PA7) // RS清零
#define LCD_BF PINC&_BV(PINC7) // 忙碌標志位
//***********************************************************************
//*名稱: void delay_nms(unsigned int nms) *
//*功能: 延時nms *
//*參數: 無 *
//*返回: 無 *
//***********************************************************************
void delay_nms(unsigned int nms)
{
for(;nms>0;nms--)
{
_delay_loop_2(2000);
}
}
//***********************************************************************
//*名稱: void lcm12864_check_busy(void) *
//*功能: 檢查lcm12864忙碌子程序 *
//*參數: 無 *
//*返回: 無 *
//***********************************************************************
void lcm12864_check_busy(void)
{
LCD_DB_SET_IN;
LCD_DB_OUT=0xFF;
LCD_RS_CBI; // 顯示指令
LCD_RW_SBI; // 讀數據
LCD_E_SBI; // 讀寫使能
while(LCD_BF); // 判斷忙碌標志位
LCD_E_CBI; // 讀寫使能關閉
LCD_DB_SET_OUT;
}
//***********************************************************************
//*名稱: void lcm12864_wirte_cmd(unsigned char command) *
//*功能: 往lcm12864寫指令子程序 *
//*參數: command 字符型 指令代碼 *
//*返回: 無 *
//***********************************************************************
void lcm12864_wirte_cmd(unsigned char command)
{
lcm12864_check_busy(); // 檢查LCD是否忙碌
LCD_DB_SET_OUT;
LCD_RS_CBI; // 顯示指令
LCD_RW_CBI; // 寫數據
LCD_DB_OUT=command;
LCD_E_SBI;
asm("nop"::);
LCD_E_CBI;
}
//***********************************************************************************
//*名稱: unsigned char lcm12864_read_data(void) *
//*功能: 從lcm12864讀數據子程序 *
//*參數: 無 *
//*返回: lcm12864_data 字符型 讀取數據 *
//***********************************************************************************
unsigned char lcm12864_read_data(void)
{
unsigned char rev_data;
lcm12864_check_busy();
LCD_RS_SBI; //顯示數據
LCD_RW_SBI; //讀數據
LCD_E_SBI;
rev_data=LCD_DB_OUT;
LCD_E_CBI;
return rev_data;
}
//***********************************************************************************
//*名稱: lcm12864_wirte_data(unsigned char data_byte) *
//*功能: 往lcm12864寫數據 *
//*參數: lcm12864_data 要寫入的數 *
//*返回: 無 *
//***********************************************************************************
void lcm12864_wirte_data(unsigned char data_byte)
{
lcm12864_check_busy(); // 檢查LCD是否忙碌
LCD_DB_SET_OUT;
LCD_RS_SBI; //顯示數據
LCD_RW_CBI; //寫數據
LCD_DB_OUT=data_byte;
LCD_E_SBI; // 讀寫使能
asm("nop"::);
LCD_E_CBI;
}
//***********************************************************************************
//*名稱: lcm12864_clear(void) *
//*功能: lcm12864DDRAM清屏 *
//*參數: 無 *
//*返回: 無 *
//***********************************************************************************
void lcm12864_clear(void)
{
lcm12864_wirte_cmd(0x01);
}
//***********************************************************************************
//*名稱: lcm12864_init(void) *
//*功能: lcm12864初始化 *
//*參數: 無 *
//*返回: 無 *
//***********************************************************************************
void lcm12864_init(void)
{
LCD_PSB_SBI; //8位并口方式
LCD_RST_CBI; //lcm12864復位
delay_nms(5);
LCD_RST_SBI;
lcm12864_wirte_cmd(0x30); //基本指令
lcm12864_wirte_cmd(0x01); //清除顯示
lcm12864_wirte_cmd(0x0C); //顯示開,關光標不閃爍
lcm12864_wirte_cmd(0x06); //設置輸入模式
}
//***************************************************************************************
//*名稱: void lcm12864_char_locate(unsigned char x, unsigned char y ) *
//*功能: 字符顯示定位(漢字和ASCII) *
//*參數: x水平列地址(0-7) y垂直行地址(0-3) *
//*返回: 無 *
//***************************************************************************************
void lcm12864_char_locate(unsigned char x, unsigned char y )
{
unsigned char dx=0; // DDRAM中的水平和垂直坐標
switch(y)
{
case 0:
{
dx=x+0x80;
break;
}
case 1:
{
dx=x+0x90;
break;
}
case 2:
{
dx=x+0x88;
break;
}
case 3:
{
dx=x+0x98;
break;
}
}
lcm12864_wirte_cmd(dx);
}
//***************************************************************************************
//*名稱: lcm12864_dis_ascii(unsigned char ascii_code) *
//*功能: 顯示一個ASCII字符 *
//*參數: ascii_code 顯示的ASCII代碼 *
//*返回: 無 *
//***************************************************************************************
void lcm12864_dis_ascii(unsigned char ascii_code)
{
lcm12864_wirte_data(ascii_code);
}
//***********************************************************************************************************************
//*名稱: lcm12864_dis_string (unsigned char x, unsigned char y, unsigned char *ptr,unsigned int speed) *
//*功能: 顯示一個字符 *
//*參數: x 水平列地址(0-7) y 垂直行地址(0-3) *ptr 字符串指針 *
//*返回:無 *
//***********************************************************************************************************************
void lcm12864_dis_string (unsigned char x, unsigned char y, unsigned char *ptr,unsigned int speed)
{
lcm12864_char_locate(x,y); // 定位字符的起點在DDRAM中的位置
{
lcm12864_wirte_data(*ptr++);
delay_nms(speed);
}
}
//*******************************************************************************************************
//*名稱: lcm12864_draw_locate (unsigned char x,unsigned char y) *
//*功能: 繪圖模式GDRAM定位 *
//*參數: x水平列地址(0-127) y垂直行地址(0-63) *
//*返回: 無 *
//*******************************************************************************************************
void lcm12864_draw_locate (unsigned char x,unsigned char y)
{
lcm12864_wirte_cmd(0x34);
lcm12864_wirte_cmd(y); // 垂直地址
lcm12864_wirte_cmd(x); // 水平地址
lcm12864_wirte_cmd(0x30);
}
//*******************************************************************************************************
//*名稱: lcm12864_string_negative(unsigned char x,unsigned char y,unsigned char with) *
//*功能: 字符串反白顯示 可以反白半寬的ASCII碼字符 *
//*參數: x水平列地址(0-15) y垂直行地址(0-3) *
//*返回: 無 *
//*******************************************************************************************************
void lcm12864_string_negative(unsigned char x,unsigned char y,unsigned char with)
{
unsigned char temp1,temp2;
unsigned int dot_data;
if(x%2==1) // 初始化寫入點數據
{
dot_data=0x00FF;
}
else
{
dot_data=0xFF00;
}
x=0x80+x/2; // 繪圖GDRAM水平地址
switch(y) // 轉換成DDRAM坐標
{
case 0:
{
y=0x80;
break;
}
case 1:
{
y=0x90;
break;
}
case 2:
{
y=0x80;
x+=8;
break;
}
case 3:
{
y=0x90;
x+=8;
break;
}
}
if(dot_data==0x00FF) // 反白起點為半個水平地址的字符
{
for(temp1=0;temp1<16;temp1++)
{
lcm12864_draw_locate(x,y+temp1); // 寫繪圖資料地址,先寫垂直地址,再寫水平地址
lcm12864_wirte_data((char)(dot_data/256)); // 連續寫入兩個字節的數據到繪圖資料
lcm12864_wirte_data((char)(dot_data%256));
}
with--;
if(with==0) // 如果達到反白寬度則退出
{
lcm12864_wirte_cmd(0x36);
lcm12864_wirte_cmd(0x30);
return;
}
x++; // 水平坐標增加
}
for(temp1=0;temp1<16;temp1++) // 反白剩余寬度的字符
{
dot_data=0xFF00;
for(temp2=0;temp2<with;temp2++)
{
lcm12864_draw_locate(x+temp2/2,y+temp1); // 寫繪圖資料地址,先寫垂直地址,再寫水平地址
lcm12864_wirte_data((char)(dot_data/256)); // 連續寫入兩個字節的數據到繪圖資料
lcm12864_wirte_data((char)(dot_data%256));
dot_data|=~dot_data;
}
}
lcm12864_wirte_cmd(0x36); // 打開繪圖顯示
lcm12864_wirte_cmd(0x30);
}
//*******************************************************************************************************
//*名稱: lcm12864_dis_dot(unsigned char x,unsigned char y,const unsigned char *prt) *
//*功能: 顯示16*16點陣
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -