設置 | 登錄 | 註冊

目前共有6篇帖子。

【程序庫】AVR單片機操作普通12864液晶的程序庫(目前只支持顯示字)

1樓 巨大八爪鱼 2013-9-19 00:15

【LCD12864.c】

#include <iom16v.h>
#include <macros.h>
#include "LCD12864.h"
void LCD12864_Initial(void)
{
 LCD12864_WriteCmd(0x06); //光標設置,讀或寫一個字符後,地址指針加一,光標加一,整屏不移動
 LCD12864_WriteCmd(0x0c); //顯示開關控制,開顯示,光標不顯示,光標不閃爍
 LCD12864_Clear();
}
void LCD12864_Clear(void)
{
 LCD12864_WriteCmd(0x30);
 LCD12864_WriteCmd(0x01);
}
void LCD12864_ChkBusy(void)
{
 LCD12864_DATD=~BIT(7); //檢測忙信號時,PX7變成了輸入口
 LCD12864_DAT=0xf2;
 LCD12864_RS0;
 LCD12864_RW1;
 LCD12864_E1;
 while (LCD12864_BSY); //注意:如果不改變DDRX,程序將卡死在這裏!
 LCD12864_E0;
 LCD12864_DATD=0xff; //恢復PX7為輸出口
}
void LCD12864_WriteCmd(unsigned char Data)
{
 LCD12864_ChkBusy();
 LCD12864_RS0;
 LCD12864_RW0;
 LCD12864_DAT=Data;
 LCD12864_E1;
 LCD12864_E0;
}
void LCD12864_WriteData(unsigned char Data)
{
 LCD12864_ChkBusy();
 LCD12864_RS1;
 LCD12864_RW0;
 LCD12864_DAT=Data;
 LCD12864_E1;
 LCD12864_E0;
}
void LCD12864_Goto(unsigned char x, unsigned char y)
{
 switch (y)
 {
 case 1:
  LCD12864_WriteCmd(0x90+x);
  break;
 case 2:
  LCD12864_WriteCmd(0x88+x);
  break;
 case 3:
  LCD12864_WriteCmd(0x98+x);
  break;
 default:
  LCD12864_WriteCmd(0x80+x);
  break;
 }
}
void LCD12864_PrintString(char* pStr)
{
 while (*pStr!='\0')
 {
  LCD12864_WriteData(*pStr);
  pStr++;
 }
}
/*void LCD12864_PrintNumber(unsigned char num)
{
 LCD12864_WriteData('0'+num);
}*/

2樓 巨大八爪鱼 2013-9-19 00:15

【LCD12864.h】

#define LCD12864_DAT PORTA
#define LCD12864_DATD DDRA
#define LCD12864_BSY PINA&BIT(7)
#define LCD12864_RS0 PORTC&=~BIT(0)
#define LCD12864_RS1 PORTC|=BIT(0)
#define LCD12864_RW0 PORTC&=~BIT(1)
#define LCD12864_RW1 PORTC|=BIT(1)
#define LCD12864_E0 PORTC&=~BIT(2)
#define LCD12864_E1 PORTC|=BIT(2)
/*
#define LCD12864_CS10 PORTC&=~BIT(3);
#define LCD12864_CS11 PORTC|=BIT(3);
#define LCD12864_CS20 PORTC&=~BIT(4);
#define LCD12864_CS21 PORTC|=BIT(4);
#define LCD12864_RST0 PORTC&=~BIT(5);
#define LCD12864_RST1 PORTC|=BIT(5);
*/
void LCD12864_Initial(void);
void LCD12864_Clear(void);
void LCD12864_ChkBusy(void);
void LCD12864_WriteCmd(unsigned char Data);
void LCD12864_WriteData(unsigned char Data);
void LCD12864_Goto(unsigned char x, unsigned char y);
void LCD12864_PrintString(char* pStr);
void LCD12864_PrintNumber(unsigned char num);
/*void LCD12864_ShowCursor();
void LCD12864_HideCursor();
void LCD12864_GetCursor(unsigned char* x, unsigned char* y);
unsigned char LCD12864_CursorVisible();*/

3樓 巨大八爪鱼 2013-9-19 00:15

【主程序】

【main.c】

#include <iom16v.h>
#include <macros.h>
#include "LCD12864.h"
//AVR程序中,函數定義時如果無參數,必須在括號中寫void
//否則編譯時會警告
void main(void)
{
 //端口設置
 DDRA=DDRC=PORTA=PORTC=0xff;
 LCD12864_Initial();
 /*LCD12864_Goto(0,0);
 LCD12864_PrintString("在檢測液晶的忙信");
 LCD12864_Goto(0,1);
 LCD12864_PrintString("號時千萬別忘了設");
 LCD12864_Goto(0,2);
 LCD12864_PrintString("置DDRA=~BIT(7)哦");
 LCD12864_Goto(0,3);
 LCD12864_PrintString("否則程序會卡死的");*/
 LCD12864_Goto(1,0);
 LCD12864_PrintString("Time Server");
 LCD12864_Goto(0,1);
 LCD12864_PrintString("Date:09/19/2013");
 LCD12864_Goto(0,2);
 LCD12864_PrintString("Time:12:16:55 AM");
 LCD12864_Goto(0,3);
 LCD12864_PrintString("Thursday  26.3℃");
 while (1);
}

4樓 巨大八爪鱼 2013-9-19 00:18

該庫的使用方法很簡單。

在主函數中先設置端口(DDRA、DDRC),然後執行LCD12864_Initial();初始化液晶
 

然後在程序的任意位置都可以輸入:

LCD12864_Goto(0,0);
LCD12864_PrintString("要顯示的文字sss");

 

goto是跳至第y行第x個漢字上,如果調用Goto(1,0)則跳到第1行第2個字符上,每個字符是兩個空格的大小!

 

PrintString是一個極其方便的函數。

PrintNumber函數目前只能顯示一位數

5樓 巨大八爪鱼 2013-9-19 00:21

本人決定以後在設計單片機函數庫時,不管是avr還是c51,不管是1602還是12864,凡是液晶的操作,函數名都大同小異。

比如:

LCD12864_Goto(0,0);
LCD12864_PrintString("要顯示的文字sss");

LCD1602_Goto(0,0);
LCD1602_PrintString("要顯示的文字sss");

 

具體的使用方法都是先在主函數中初始化端口,然後調用goto和printstring或writedata(顯示單個字符)函數來顯示字符。

6樓 巨大八爪鱼 2013-9-19 00:22

這個12864液晶弄了我今晚6個小時的時間!百度上很難找到有用的資料,我試了很多程序都不行。

 

所以本人打算建立一個單片機程序庫。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。