這是樓主壓縮包里面的st7565.c 驅(qū)動(dòng)程序:
- #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;
- }
- uchar Lcd12864_Write8CnCHAR(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/10; //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
- x2 = x%10; //去低四位
- //--設(shè)置X坐標(biāo)--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- for (wordNum=0; wordNum<50; wordNum++)
- {
- //--查詢要寫(xiě)的字在字庫(kù)中的位置--//
- if ((CN8CHAR[wordNum].Index == *cn))
- {
- for (j=0; j<16; j++) //寫(xiě)一個(gè)字
- {
- if (j == 8) //由于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(CN8CHAR[wordNum].Msk[j]);
- }
- x += 8;
- }//if查到字結(jié)束
- } //for查字結(jié)束
- cn += 1;
- } //while結(jié)束
- return 1;
- }
- #endif
復(fù)制代碼 |