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