?? lcd.c
字號:
/**--------------------------------File Info--------------------------------------------------------
**
** File name: lcd.c
** Latest modified Date: 2008.05.23
** Latest Version: v1.0
** Descriptions: The lcd draw function
**
**--------------------------------------------------------------------------------------------------------
** Modified by: X
** Modified date: 2008.05.22
** Version: v1.1
** Descriptions: The original version is Running In 51 System
**
*********************************************************************************************************/
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <sysctl.h>
#include <gpio.h>
#include "lcd.h"
/////////////////////// 延時常數宏定義 ///////////////////////////
#define NOP for(int i=0;i<80;i++)
/***************************** 定義LCD數據接口 **********************************/
#define LCD_DATA_PORT SYSCTL_PERIPH_GPIOA
#define LCD_CTL_PORT SYSCTL_PERIPH_GPIOB
#define LCD_DATA_ADR GPIO_PORTA_BASE
#define LCD_CTL_ADR GPIO_PORTB_BASE
#define LCD_RS_PIN GPIO_PIN_0
#define LCD_RW_PIN GPIO_PIN_1
#define LCD_E_PIN GPIO_PIN_2
#define CSA_PIN GPIO_PIN_3
#define CSB_PIN GPIO_PIN_4
#define GPIO_ALL 0x000000ff // All of GPIO Select
#define PinSetBit(x) GPIOPinWrite(LCD_CTL_ADR,x,x)
#define PinClrBit(x) GPIOPinWrite(LCD_CTL_ADR,x,~x)
////////////////////////////// 常用操作命令和參數定義 ////////////////////////////////
#define DISPON 0x3f // 開啟顯示
#define DISPOFF 0x3e // 關閉顯示
#define DISPFIRST 0xc0 // 顯示起始行定義
#define SETX 0x40 // X定位設定指令(頁)(0-127)
#define SETY 0xb8 // Y定位設定指令(列)(0-7)
#define LCD_Busy 0x80 // LCM忙判斷位
///////////////////////// 顯示分區邊界位置 ////////////////////////////////////////
#define MODL 0x00 // 左區
#define MODR 0x40 // 左區和右區分界
#define LCMLIMIT 0x80 // 顯示區的右邊界
///////////////////////////// 全局變量定義 ////////////////////////////////////////
uchar ucCol,ucRow,ucShowData; // Col = x (0-127), Row = y (0-7)
uchar xy; // 畫線方向標志:1 = 水平 0 = 垂直
uchar Base=0; // 滾屏顯示中使用 Base為顯示的起始行
///////////////////////// 自定義字符數組列表 ////////////////////////////////
const uchar _ASCII[]; // ASCII常規字符點陣碼表
/***************************** 中英文字符串顯示函數 **********************************/
void PutEnStr(uchar *puts,uchar i)
{
uchar j,ucDat;
for (j=0;j<i;j++)
{
ucDat = puts[j];
if(!(ucDat&0x80))
Putedot(ucDat-0x20); // Ascii碼表從0x20開始 之前的20H是控制碼
}
}
void PutChStr(const uchar *puts,uchar i)
{
uchar j;
for (j=0;j<i;j++)
{
Putcdot(puts,j&0x7f); // 只保留低7位
}
}
/*********************************半角字符點陣碼數據輸出********************************/
void Putedot(uchar Order)
{
uchar i,bakerx,bakery;
uint index; // 偏移量
bakerx = ucCol; // 暫存x,y坐標,已備下半個字符使用
bakery = ucRow;
index=Order * 0x10; // 半角字符,每個字符16字節
// 上半個字符輸出,8列
for(i=0;i<8;i++)
{
ucShowData = _ASCII[index]; // 取點陣碼,ASCII碼數組
Wrdata(ucShowData); // 寫輸出一字節數據
index++;
ucCol++;
if (ucCol==LCMLIMIT)
{
ucCol=0;ucRow++;ucRow++;}; // 下一列,如果列越界換行
if (ucRow>7)
ucRow=0; // 如果行越界,返回首行
} // 上半個字符輸出結束
ucCol = bakerx; // 列對齊
ucRow = bakery+1; // 指向下半個字符行
// 下半個字符輸出,8列
for(i=0;i<8;i++)
{
ucShowData = _ASCII[index]; // 取點陣碼
Wrdata(ucShowData); // 寫輸出一字節數據
index++;
ucCol++;
if (ucCol==LCMLIMIT)
{
ucCol=0;
ucRow=ucRow+2;
}; // 下一列,如果列越界換行
if (ucRow>7)
ucRow=1; // 如果行越界,返回首行
} // 下半個字符輸出結束
ucRow=bakery;
} // 整個字符輸出結束
/*********************************全角字符點陣碼數據輸出********************************/
void Putcdot(const uchar * ChDat,uchar Order)
{
uchar i,bakerx,bakery;
uint index; // 偏移量
bakerx = ucCol; // 暫存x,y坐標,已備下半個字符使用*/
bakery = ucRow;
index=Order * 0x20; // 每個字符32字節*/
// 上半個字符輸出,16列*/
for(i=0;i<16;i++)
{
Wrdata(ChDat[index]);
index++;
ucCol++;
if(ucCol==LCMLIMIT)
{
ucCol=0;
ucRow++;
ucRow++;
}
if (ucRow>6) ucRow=0;
}
ucCol = bakerx;
ucRow = bakery+1;
for(i=0;i<16;i++)
{
Wrdata(ChDat[index]);
index++;
ucCol++;
if (ucCol==LCMLIMIT)
{
ucCol=0;
ucRow++;
ucRow++;
}
if(ucRow>7)
ucRow=1;
}
ucRow = bakery;
}
/************************************清屏,全屏幕清零***********************************/
void LCD_Cls( void )
{
for(ucRow=0;ucRow<8;ucRow++)
for(ucCol=0;ucCol<LCMLIMIT;ucCol++)
Wrdata(0);
}
/*************************************數據寫輸出 **************************************/
void Wrdata(uchar WrDat)
{
Locatexy(); // 坐標定位,返回時保留分區狀態不變
PinSetBit(LCD_RS_PIN); // 數據輸出
PinClrBit(LCD_RW_PIN); // 寫輸出
BaseWrData(WrDat);
PinSetBit(LCD_E_PIN);
NOP;
PinClrBit(LCD_E_PIN);
}
/***************************從液晶片上讀數據,保留在全局變量中***************************/
uchar Rddata( void )
{
uchar RdDat;
Locatexy(); // 坐標定位,返回時保留分區狀態不變
PinSetBit(LCD_RS_PIN); // 數據
PinSetBit(LCD_RW_PIN); // 讀數據
PinSetBit(LCD_E_PIN);
NOP;
RdDat=BaseRdData(); // 虛讀一次
PinClrBit(LCD_E_PIN);
Locatexy(); // 坐標定位,返回時保留分區狀態不變
PinSetBit(LCD_RS_PIN); // 數據
PinSetBit(LCD_RW_PIN); // 讀數據
PinSetBit(LCD_E_PIN);
NOP;
RdDat=BaseRdData(); // 從數據口讀數據,真讀
PinClrBit(LCD_E_PIN);
return RdDat;
}
/*********************************命令輸出到左區控制口*********************************/
void WrcmdL(uchar WrDat)
{
LCD_BusyL(); // 確定分區,返回時保留分區狀態不變
PinClrBit(LCD_RS_PIN); //命令操作
PinClrBit(LCD_RW_PIN);
BaseWrData(WrDat);
PinSetBit(LCD_E_PIN);
NOP;
PinClrBit(LCD_E_PIN);
}
/*********************************命令輸出到右區控制口********************************/
void WrcmdR(uchar WrDat)
{
LCD_BusyR();
PinClrBit(LCD_RS_PIN);
PinClrBit(LCD_RW_PIN);
BaseWrData(WrDat);
PinSetBit(LCD_E_PIN);
NOP;
PinClrBit(LCD_E_PIN);
}
/************************分區操作允許等待,返回時保留分區選擇狀態*************************/
void LCD_BusyL(void)
{
PinClrBit(CSA_PIN);
PinSetBit(CSB_PIN); // 選擇左區
Wtcom(); // 等待使能
}
/************************************************************************************/
void LCD_BusyR(void)
{
PinSetBit(CSA_PIN);
PinClrBit(CSB_PIN); // 選擇右區
Wtcom(); // 等待使能
}
/************************************************************************************/
void Wtcom(void)
{
uchar RdDat;
PinClrBit(LCD_RS_PIN);
PinSetBit(LCD_RW_PIN);
RdDat=BaseRdData();
PinSetBit(LCD_E_PIN);
while(RdDat & LCD_Busy)
{
RdDat=BaseRdData(); // 判斷等待位狀態
}
PinClrBit(LCD_E_PIN);
}
/******************根據設定的坐標數據,定位LCM上的下一個操作單元位置******************/
void Locatexy(void)
{
uchar x,y;
switch (ucCol&0xc0) // 根據列地址判斷顯示所在的區(左/右)
{
case 0 : LCD_BusyL();break;
case 0x40 : LCD_BusyR();break;
default : break;
}
x = ucCol&0x3F|SETX;
y = ucRow&0x07|SETY;
Wtcom();
PinClrBit(LCD_RS_PIN);
PinClrBit(LCD_RW_PIN);
BaseWrData(y); // 寫入列地址(Y)
PinSetBit(LCD_E_PIN);
PinClrBit(LCD_E_PIN);
Wtcom();
PinClrBit(LCD_RS_PIN);
PinClrBit(LCD_RW_PIN);
BaseWrData(x); // 寫入行地址(X)
PinSetBit(LCD_E_PIN);
PinClrBit(LCD_E_PIN);
}
/***************************畫線,只提供X或Y方向的,不支持斜線*************************/
void LineTo(uchar length)
{
uchar xs,ys;
if (xy)
{
ys = ucCol;
for (xs=0;xs<length;xs++)
{
ucCol = ys + xs;
Point();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -