?? drvsed1335.c
字號:
// 編譯版本:0002 如果對本文件的更改會影響全局,請將編譯版本號增加,謝謝
//
// 版權所有(C)2005 www.yangchu.com
//
// 文件名稱: DrvSED1335.c
//
// 簡 介: SED1335驅(qū)動程序,僅為黑白顯示
//
// 作 者: yangchu 14-September-2005
// yangchu@yangchu.com
//
// ~~~~~~~~~~~~~~~~~~~~~~~ Never try, never know ~~~~~~~~~~~~~~~~~~~~~~~
//
// 狀 態(tài): 測試中
//
// 改進紀錄:
// 3-November-2005 yangchu
// 1)改寫字符顯示函數(shù)為通用函數(shù)
// 2)刪除原來的字符顯示函數(shù)
// 3)修改了注釋風格
//
// 12-November-2005 yangchu
// 1)增加2148模式函數(shù)接口
//
#include "typedef.h"
#include "lcd.h"
#if (CONTROLLER_TYPE == SED1335)
#include "SED1335Cfg.h"
//
// 數(shù)據(jù)轉(zhuǎn)換宏定義
//
#define HIBYTE(V1) ((BYTE)((V1) >> 8))
#define LOBYTE(V1) ((BYTE)((V1) & 0xff))
#define MAKEWORD(V1, V2) ((((WORD)(V1)) << 8) + (WORD)(V2))
//
// CPU延時宏定義
//
#define DLY_CPU_CYCLE(x) \
{ \
int i; \
for (i = 0; i < x; i++); \
}
//
// SED1335的命令集
//
#define SYSTEM_SET (0x40)
#define SCROLL (0x44)
#define SLEEP_IN (0x53)
#define DISP_ON (0x59)
#define DISP_OFF (0x58)
#define OVLAY (0x5b)
#define HDOT_SCR (0x5a)
#define CSRFORM (0x5d)
#define CGRAM_ADR (0x5c)
#define CSR_RIGHT (0x4c)
#define CSR_LEFT (0x4d)
#define CSR_UP (0x4e)
#define CSR_DOWN (0x4f)
#define CSRW (0x46)
#define CSRR (0x47)
#define MWRITE (0x42)
#define MREAD (0x43)
//
// 屏幕中,每行可顯示的ASC字符數(shù)
//
#define AP (40)
//
// LCD初始化所用到的參數(shù)
//
#define GRAPHICS_BASE_ADDR 0x1000 // 該地址位于SED1335所使用的32kB SRAM中
static const BYTE SYSTAB[8] = {
0x30, // 0011 0000 B: 1, W/S: 0, M2: 0, M1: 0, M0: 0
0x87, // 1000 0111 WF: 1, FX: 7
0x0f, // 0000 1111 FY: 15
0x27, // 0010 0111 C/R: 39
0x42, // 0100 0010 TC/R: 66
0xf0, // 1111 0000 L/F: 240
0x28, // 0010 1000 APL: 40
0x00 // 0000 0000 APH: 0
};
static const BYTE SCRTAB[10] = {
0x00, // 0000 0000 SAD1L: 0x00
0x00, // 0000 0000 SAD1H: 0x00
0xf0, // 1111 0000 SL1: 240
(BYTE)(GRAPHICS_BASE_ADDR & 0xff), // 0000 0000 SAD2L: 0x00
(BYTE)(GRAPHICS_BASE_ADDR >> 8), // 0001 0000 SAD2H: 0x10
0xf0, // 1111 0000 SL2: 240
0x00, // 0000 0000 SAD3L: 0x00
0x04, // 1000 0000 SAD3H: 0x40
0x00, // 0000 0000 SAD4L: 0x00
0x50 // 0101 0000 SAD4H: 0x50
};
static int _Color; // 前景色
static int _XRefreshLimit; // X方向刷新屏幕最大坐標限制值
//
// Philips LPC2114接口方式(試驗用)
//
#if (CPU_TYPE == LPC2114)
#include "LPC2294.h"
/*
Signal cofiguration of LPC2114:
A0 : P0.9
nWR : P0.8
nRD : P0.11
DB0~DB7 : P0.0~P0.7
nCS : P0.10
nRST : nRST from mainboard
SEL1 : Always low (always 8080 mode)
*/
#define BIT_A0 (1 << 9)
#define BIT_nWR (1 << 8)
#define BIT_nRD (1 << 11)
#define BIT_nCS (1 << 10)
//
// 寫LCD控制命令
//
static void
_LCDCom(
BYTE com
)
{
IO0CLR = 0xff | BIT_nCS; // Clear DB0~DB7, chip select enable
IO0PIN |= (BIT_A0 | com); // Set A0 and put Data on bus
IO0CLR = BIT_nWR; // Clear nWR
#if DELAY_TIME > 0
DLY_CPU_CYCLE(DELAY_TIME); // Delay for SED1335
#endif
IO0SET = BIT_nWR; // Set nWR
IO0SET = BIT_nCS; // Chip select disable
}
//
// 寫LCD控制參數(shù)和顯示字符數(shù)據(jù)
//
static void
_LCDData(
BYTE dat
)
{
IO0CLR = 0xff | BIT_A0 | BIT_nCS; // Clear DB0~DB7 and A0, chip select enable
IO0PIN |= dat; // Put Data on bus
IO0CLR = BIT_nWR; // Clear nWR
#if DELAY_TIME > 0
DLY_CPU_CYCLE(DELAY_TIME); // Delay for SED1335
#endif
IO0SET = BIT_nWR; // Set nWR
IO0SET = BIT_nCS; // Chip select disable
}
#if LCD_READ_BACK_ENABLE == TRUE
//
// 讀數(shù)據(jù)
//
static BYTE
_ReadData(void)
{
BYTE dat;
IO0CLR = BIT_nCS; // Clear DB0~DB7, chip select enable
IO0CLR = BIT_nRD; // Clear nRD
#if DELAY_TIME > 0
DLY_CPU_CYCLE(DELAY_TIME); // Delay for SED1335
#endif
dat = (BYTE)(IO0PIN & 0xff); // Get memory data
IO0SET = BIT_nRD; // Set nRD
IO0SET = BIT_nCS; // Chip select disable
return dat;
}
//
// 讀顯示內(nèi)存
//
static BYTE
_ReadSram(void)
{
BYTE dat;
_LCDCom(MREAD); // Send command of reading memory
IO0DIR &= ~0xff; // Bit P0.0~P0.7 IO direction: input
IO0SET = BIT_A0; // Set A0
dat = _ReadData();
IO0DIR |= 0xff; // Bit P0.0~P0.7 IO direction: output
return dat;
}
//
// 讀狀態(tài)
//
static BYTE
_ReadState(void)
{
BYTE state;
IO0DIR &= ~0xff; // Bit P0.0~P0.7 IO direction: input
IO0CLR = BIT_A0; // Clear DB0~DB7 and A0, chip select enable
state = _ReadData(); // Get state
IO0DIR |= 0xff; // Bit P0.0~P0.7 IO direction: output
return state;
}
//
// 讀光標地址
//
static WORD
_ReadCursorPos(void)
{
WORD state = 0;
_LCDCom(CSRR);
IO0DIR &= ~0xff; // Bit P0.0~P0.7 IO direction: input
IO0SET = BIT_A0; // Set A0
state = _ReadData(); // X position
state |= (_ReadData() << 8); // Y position
IO0DIR |= 0xff; // Bit P0.0~P0.7 IO direction: output
return state;
}
#endif
static void
_LCDPortInit(void)
{
IO0DIR |= (0xff | BIT_A0 | BIT_nWR | BIT_nRD | BIT_nCS);
IO0SET = (BIT_nWR | BIT_nRD | BIT_nCS);
}
#else // If we are not using above CPUs
#error "CPU type not specified or not supported"
#endif
//
// 顯示存儲器清零
//
// 輸入:無
//
// 輸出:無
//
static void
_ClearMemory(void)
{
INT32U i;
//
// 光標方向向右,指針指向零地址
//
_LCDCom(CSR_RIGHT);
_LCDCom(CSRW);
_LCDData(0);
_LCDData(0);
//
// 顯存中數(shù)據(jù)全部清零
//
_LCDCom(MWRITE);
for (i = 0; i < 32 * 1024; i++)
{
_LCDData(0x00);
}
}
//
// 設置光標
//
// 輸入: x 橫坐標
// y 縱坐標
//
// 輸出: 無
//
// 注意: 由于只能字節(jié)尋址,橫坐標必須被8相除
//
void
_SetCursor(
IN INT32U x,
IN INT32U y
)
{
BYTE low, high;
INT32U actualAddr;
x = x / 8;
actualAddr = y * AP + x + GRAPHICS_BASE_ADDR;
low = LOBYTE(actualAddr);
high = HIBYTE(actualAddr);
_LCDCom(CSRW);
_LCDData(low);
_LCDData(high);
}
//
// 固定位置顯示字模
//
// 輸入: x 橫軸坐標
// y 縱軸坐標
// width 字模寬度(單位:8像素)
// hight 字模高度
// p 字模頭指針
//
// 輸出: 1
//
static int
_FixedDispCode(
IN INT32U x,
IN INT32U y,
IN INT32U width,
IN INT32U hight,
IN const BYTE* p
)
{
int i, j;
const BYTE* pWork;
_LCDCom(CSR_DOWN);
//
// 橫軸方向循環(huán)
//
for (i = 0; i < width; i++)
{
pWork = p + i;
if (x + i * 8 < _XRefreshLimit)
{
//
// 縱軸方向循環(huán)
//
_SetCursor(x + i * 8, y);
_LCDCom(MWRITE);
for (j = 0; j < hight; j++)
{
_LCDData(
_Color ? *pWork : ~(*pWork)
);
pWork += width;
}
}
}
return 1;
}
//
// 通用字模顯示函數(shù)(字符寬度只能為8的倍數(shù))
//
// 輸入: x 橫軸方向坐標
// y 縱軸方向坐標
// width 字模寬度(單位:字節(jié))
// hight 字模高度
// p 字模頭指針
// fixPlace 是否固定位置顯示(如果采用固定位置顯示
// 方式,會有比較快的顯示速度)
//
// 輸出: 顯示成功與否標志
//
int
DispCode(
IN INT32U x,
IN INT32U y,
IN INT32U width,
IN INT32U hight,
IN const BYTE* p,
IN INT32U fixPlace
)
{
//
// 因為只顯示單個字符的一部分沒有多大意義,所以當字符
// 不能完全顯示時,干脆不顯示。
//
if (x + width * 8 > SCREEN_WIDTH
||
y + hight > SCREEN_HIGHT
||
p == NULL)
{
return -1;
}
//
// 判斷是采用固定顯示方式還是采用靈活顯示方式
// 如果采用靈活顯示方式,調(diào)用畫位圖函數(shù)畫出
//
if (fixPlace)
{
_FixedDispCode(
x,
y,
width,
hight,
p
);
}
else
{
DrawBitmap(
x,
y,
width * 8,
hight,
p
);
}
return 1;
}
//
// 清除顯示屏幕
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -