?? main.c
字號:
#include "config.h"
#define LCD_DI 0x1<<20 // 定義LCM12864的RS控制線
#define LCD_RW 0x1<<21 // 定義LCM12864的RW控制線
#define LCD_E 0x1<<22 // 定義LCM12864的E控制線
#define LCD_CS1 0x1<<23 // 定義LCM12864的CS1控制線
#define LCD_CS2 0x1<<24 // 定義LCM12864的CS2控制線
#define LCD_RESET 0x1<<25 // 定義LCM12864的RESET控制線
#define LCD_LEDK 0x1<<26 // 定義LCM12864的LEDK(BLK)控制線
#define LCD_DB7_DB0 0xFF<<8
#define LCD_DISP_ON 0x3f
#define LCD_DISP_OFF 0x3e
#define LCD_START_ROW 0xc0 //顯示起始行0,可以用LCM12864_START_ROW+x設置起始行。(x<64)
#define LCD_PAGE_START_ADDR 0xb8 // 頁起始地址,可以用LCM12864_PAGE_START_ADDR+x設置當前頁。(x<8)
#define LCD_COL_START_ADDR 0x40 //列起始地址,可以用LCM12864_COL_START_ADDR+x設置當前列。(x<64)
#define LCD_STATUS_BUSY 0x80 // LCM12864忙狀態屏蔽碼
#define LCD_STATUS_DISP_OFF 0x20 // LCM12864顯示關閉狀態屏蔽碼
#define LCD_STATUS_REST 0x10 // LCM12864復位狀態屏蔽碼
uint8 huan1[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
/********************************************************************************************
* 函數名稱:Delay()
* 功 能:軟件延時
* 入口參數:count 延時參數,值越大,延時越長
* 出口參數:無
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0;i < 125; i++);
}
}
/********************************************************************************************
* 函數名稱:LCM12864_TestBusy()
* 功 能:LCM12864測忙函數
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void LCD_TestBusy(void)
{
IO0SET=LCD_RW;
IO0CLR=LCD_DI;
IO0SET=LCD_E;
Delay(1);
while(((IO0PIN&LCD_DB7_DB0)>>8) & LCD_STATUS_BUSY);
}
//寫命令
//*********************************************************************************************/
void wcodel(uint8 code)
{
IO0CLR=LCD_RW;
IO0CLR=LCD_DI;
IO0SET=code<<8;
IO0CLR=((~code)<<8)&LCD_DB7_DB0;
IO0SET=LCD_E;
Delay(1);
IO0CLR=LCD_E;
}
/********************************************************************************************
寫數據
*********************************************************************************************/
void wdata1(uint8 data)
{
IO0CLR=LCD_RW;
IO0SET=LCD_DI;
IO0SET=data<<8;
IO0CLR=((~data)<<8)&LCD_DB7_DB0;
IO0SET=LCD_E;
Delay(1);
IO0CLR=LCD_E;
}
/********************************************************************************************
空讀一次 從LCD讀一字節數據
*********************************************************************************************/
uint8 Readwdata1(void)
{ uint8 data;
IO0SET=LCD_RW;
IO0SET=LCD_DI;
IO0SET=LCD_E;
/* 按LCM12864數據手冊,先空讀一次 */
data = (IO0PIN&LCD_DB7_DB0)>>8;
LCD_TestBusy();
/* 按LCM12864數據手冊,再讀一次 */
data = (IO0PIN&LCD_DB7_DB0)>>8;
LCD_TestBusy();
IO0CLR=LCD_E;
return data;
}
/********************************************************************************************
向LCD指定點寫一字節數據。
*********************************************************************************************/
void Write1_x_y(uint8 x,uint8 y,uint8 data)
{
/* 參數過濾 */
x = x&0x7f;
y = y&0x3f;
IO0CLR=LCD_CS1;
IO0CLR=LCD_CS2;
if(x<64)
{
IO0SET=LCD_CS1;
}
else
{
IO0SET=LCD_CS2;
x = x-64;
}
wcodel(LCD_COL_START_ADDR+x); // 設置當前列地址,即x坐標
wcodel(LCD_PAGE_START_ADDR+y); // 設置當前頁地址,即y坐標
wdata1(data);
}
/********************************************************************************************
從LCD指定點上讀取一字數據
*********************************************************************************************/
uint8 Read1_x_y(uint8 x,uint8 y)
{
uint8 data;
/* 參數過濾 */
x = x&0x7f;
y = y&0x3f;
IO0CLR=LCD_CS1;
IO0CLR=LCD_CS2;
if(x<64)
{
IO0SET=LCD_CS1;
}
else
{
IO0SET=LCD_CS2;
x = x-64;
}
wcodel(LCD_COL_START_ADDR+x); // 設置當前列地址,即x坐標
wcodel(LCD_PAGE_START_ADDR+y); // 設置當前頁地址,即y坐標
data=Readwdata1();
return data;
}
/********************************************************************************************
LCD初始化
*********************************************************************************************/
void LCD_Init(void)
{
IO0CLR=LCD_RESET;
IO0SET=LCD_RESET;
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_DISP_OFF);
wcodel(LCD_PAGE_START_ADDR+0);
wcodel(LCD_START_ROW+0);
wcodel(LCD_COL_START_ADDR+0);
wcodel(LCD_DISP_ON);
//IO0SET=LCD_LEDK;
//IO0CLR=LCD_LEDK;
}
/********************************************************************************************
向LCD填充數據
*********************************************************************************************/
void LCD_Fill_Screen(uint8 LCD_FillData)
{
uint8 x,y;
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_START_ROW+0);
for(x=0;x<8;x++)
{
wcodel(LCD_PAGE_START_ADDR+x);
wcodel(LCD_COL_START_ADDR);
for(y=0;y<64;y++)
wdata1(LCD_FillData);
}
IO0CLR=LCD_CS2;
}
/********************************************************************************************
* 函數名稱:LCM12864_Clear_Screen()
* 功 能:LCM12864清屏
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void LCD_Clear_Screen(void)
{
LCD_Fill_Screen(0x55);
}
/********************************************************************************************
在LCD的指定點上顯示16*16點陣漢字
*********************************************************************************************/
void LCD_Disp_Chinese_16_16(uint8 LCD_page,uint8 LCD_col, uint8 *Chinese_16_16)
{
uint8 j=0,i=0;
for(j=0;j<2;j++)
{
wcodel(LCD_PAGE_START_ADDR+LCD_page+j);
wcodel(LCD_COL_START_ADDR+LCD_col);
for(i=0;i<16;i++)
wdata1(Chinese_16_16[16*j+i]);
}
}
/********************************************************************************************
* 函數名稱:LCM12864_Frame()
* 功 能:在LCM12864上顯示最大尺寸的邊框
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void LCM12864_Frame(void)
{
uint8 i;
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_PAGE_START_ADDR+0);
wcodel(LCD_COL_START_ADDR+0);
for(i=0;i<64;i++) wdata1(0x01);
wcodel(LCD_PAGE_START_ADDR+7);
wcodel(LCD_COL_START_ADDR+0);
for(i=0;i<64;i++){
wdata1(0x80);
}
for(i=0;i<8;i++)
{
IO0CLR=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_PAGE_START_ADDR+i);
wcodel(LCD_COL_START_ADDR+63);
wdata1(0xff);
IO0SET=LCD_CS1;
IO0CLR=LCD_CS2;
wcodel(LCD_PAGE_START_ADDR+i);
wcodel(LCD_COL_START_ADDR+0);
wdata1(0xff);
}
}
/********************************************************************************************
* 函數名稱:main()
* 功 能:LCD12864液晶模塊驅動演示。
******************************************************************************************/
int main(void)
{
PINSEL0=0;
PINSEL1=0;
IO0DIR=~0;
LCD_Init(); // LCM12864初始化
LCD_Clear_Screen();
while(1)
{
LCD_Init();
IO0SET=LCD_CS1;
IO0CLR=LCD_CS2;
LCD_Disp_Chinese_16_16(1,0,huan1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -