#include"st7565.h"
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_WriteCmd
* 函數(shù)功能 : 寫入一個命令到12864
* 輸 入 : cmd
* 輸 出 : 無
*******************************************************************************/
void LcdSt7565_WriteCmd(cmd)
{
LCD12864_CS = 0; //chip select,打開片選
LCD12864_RD = 1; //disable read,讀失能
LCD12864_RS = 0; //select command,選擇命令
LCD12864_RW = 0; //select write,選擇寫模式
_nop_();
_nop_();
DATA_PORT = cmd; //put command,放置命令
_nop_();
_nop_();
LCD12864_RW = 1; //command writing ,寫入命令
}
/*******************************************************************************
* 函 數(shù) 名 : LcdSt7565_WriteData
* 函數(shù)功能 : 寫入一個數(shù)據(jù)到12864
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
void LcdSt7565_WriteData(dat)
{
LCD12864_CS = 0; //chip select,打開片選
LCD12864_RD = 1; //disable read,讀失能
LCD12864_RS = 1; //select data,選擇數(shù)據(jù)
LCD12864_RW = 0; //select write,選擇寫模式
_nop_();
_nop_();
DATA_PORT = dat; //put data,放置數(shù)據(jù)
_nop_();
_nop_();
LCD12864_RW = 1; //data writing,寫數(shù)據(jù)
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Init
* 函數(shù)功能 : 初始化12864
* 輸 入 : 無
* 輸 出 : 無
* 說 明 : LCD12864的命令指令可以查看例程文件夾下的《ST7565p數(shù)據(jù)手冊》
* * 的第51頁的位置。
*******************************************************************************/
void Lcd12864_Init()
{
uchar i;
LCD12864_RSET = 0;
for (i=0; i<100; i++);
LCD12864_CS = 0;
LCD12864_RSET = 1;
//----------------Star Initial Sequence-------//
//------程序初始化設置,具體命令可以看文件夾下---//
//--軟件初始化--//
LcdSt7565_WriteCmd(0xE2); //reset
for (i=0; i<100; i++); //延時一下
//--表格第8個命令,0xA0段(左右)方向選擇正常方向(0xA1為反方向)--//
LcdSt7565_WriteCmd(0xA1); //ADC select segment direction
//--表格第15個命令,0xC8普通(上下)方向選擇選擇反向,0xC0為正常方向--//
LcdSt7565_WriteCmd(0xC8); //Common direction
//--表格第9個命令,0xA6為設置字體為黑色,背景為白色---//
//--0xA7為設置字體為白色,背景為黑色---//
LcdSt7565_WriteCmd(0xA6); //reverse display
//--表格第10個命令,0xA4像素正常顯示,0xA5像素全開--//
LcdSt7565_WriteCmd(0xA4); //normal display
//--表格第11個命令,0xA3偏壓為1/7,0xA2偏壓為1/9--//
LcdSt7565_WriteCmd(0xA2); //bias set 1/9
//--表格第19個命令,這個是個雙字節(jié)的命令,0xF800選擇增壓為4X;--//
//--0xF801,選擇增壓為5X,其實效果差不多--//
LcdSt7565_WriteCmd(0xF8); //Boost ratio set
LcdSt7565_WriteCmd(0x01); //x4
//--表格第18個命令,這個是個雙字節(jié)命令,高字節(jié)為0X81,低字節(jié)可以--//
//--選擇從0x00到0X3F。用來設置背景光對比度。---/
LcdSt7565_WriteCmd(0x81); //V0 a set
LcdSt7565_WriteCmd(0x23);
//--表格第17個命令,選擇調節(jié)電阻率--//
LcdSt7565_WriteCmd(0x25); //Ra/Rb set
//--表格第16個命令,電源設置。--//
LcdSt7565_WriteCmd(0x2F);
for (i=0; i<100; i++);
//--表格第2個命令,設置顯示開始位置--//
LcdSt7565_WriteCmd(0x40); //start line
//--表格第1個命令,開啟顯示--//
LcdSt7565_WriteCmd(0xAF); // display on
for (i=0; i<100; i++);
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_ClearScreen
* 函數(shù)功能 : 清屏12864
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Lcd12864_ClearScreen(void)
{
uchar i, j;
for(i=0; i<8; i++)
{
//--表格第3個命令,設置Y的坐標--//
//--Y軸有64個,一個坐標8位,也就是有8個坐標--//
//所以一般我們使用的也就是從0xB0到0x07,就夠了--//
LcdSt7565_WriteCmd(0xB0+i);
//--表格第4個命令,設置X坐標--//
//--當你的段初始化為0xA1時,X坐標從0x10,0x04到0x18,0x04,一共128位--//
//--當你的段初始化為0xA0時,X坐標從0x10,0x00到0x18,0x00,一共128位--//
//--在寫入數(shù)據(jù)之后X坐標的坐標是會自動加1的,我們初始化使用0xA0所以--//
//--我們的X坐標從0x10,0x00開始---//
LcdSt7565_WriteCmd(0x10);
LcdSt7565_WriteCmd(0x04);
//--X軸有128位,就一共刷128次,X坐標會自動加1,所以我們不用再設置坐標--//
for(j=0; j<128; j++)
{
LcdSt7565_WriteData(0x00); //如果設置背景為白色時,清屏選擇0XFF
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Write16CnCHAR
* 函數(shù)功能 : 在12864上面書寫16X16的漢字
* 輸 入 : x, y, cn
* 輸 出 : 無
* 說 明 : 該函數(shù)可以直接書寫字符串,但是書寫是從右到左,所以輸入的時
* * 侯注意輸入。漢字的取模方式請觀看文件夾下的《漢字取模軟件的
* * 使用說明》
*******************************************************************************/
#ifdef CHAR_CODE
#include"charcode.h"
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
{
uchar j, x1, x2, wordNum;
//--Y的坐標只能從0到7,大于則直接返回--//
if(y > 7)
{
return 0;
}
//--X的坐標只能從0到128,大于則直接返回--//
if(x > 128)
{
return 0;
}
y += 0xB0; //求取Y坐標的值
//--設置Y坐標--//
LcdSt7565_WriteCmd(y);
while ( *cn != '\0') //在C語言中字符串結束以‘\0’結尾
{
//--設置Y坐標--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐標要兩句命令,分高低4位,所以這里先取出高4位
x2 = x & 0x0F; //去低四位
//--設置X坐標--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (wordNum=0; wordNum<50; wordNum++)
{
//--查詢要寫的字在字庫中的位置--//
if ((CN16CHAR[wordNum].Index[0] == *cn)
&&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
{
for (j=0; j<32; j++) //寫一個字
{
if (j == 16) //由于16X16用到兩個Y坐標,當大于等于16時,切換坐標
{
//--設置Y坐標--//
LcdSt7565_WriteCmd(y + 1);
//--設置X坐標--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
}
x += 16;
}//if查到字結束
} //for查字結束
cn += 2;
} //while結束
return 1;
}
#endif
|