用于MAX7456隨屏顯示器SPI
寫字符存儲(chǔ)器程序
向字符存儲(chǔ)器寫一個(gè)字符的程序如下,每個(gè)字符占用18行,每行12像素,共216像素。由于每個(gè)字節(jié)定義4個(gè)像素,因此定義每一個(gè)字符需要54字節(jié)。字符數(shù)據(jù)位于程序入口處的data[] (與上述寫顯示存儲(chǔ)器的程序類似)。
寫字符存儲(chǔ)器時(shí)需要進(jìn)行一些附加說明,存儲(chǔ)器為非易失,因此,寫存儲(chǔ)器大約需要12ms,由MAX7456執(zhí)行。只有完整的54字節(jié)字符才可以寫入字符存儲(chǔ)器。
該器件包含一個(gè)54字節(jié)映射存儲(chǔ)器。首先把需要寫入的字符數(shù)據(jù)寫入映射存儲(chǔ)器,然后器件將該數(shù)據(jù)裝載到NVM字符存儲(chǔ)器。
用來寫字符存儲(chǔ)器的寄存器有以下幾種:
- 字符存儲(chǔ)器模式 = 0x08。向寄存器寫0xA0,使器件把映射存儲(chǔ)器的內(nèi)容裝載到NVM字符存儲(chǔ)器。
- 字符存儲(chǔ)器地址高位 = 0x09。包括了即將寫入字符的地址。
- 字符存儲(chǔ)器地址低位 = 0x0A。
- 字符存儲(chǔ)器數(shù)據(jù)輸入 = 0x0B。
- Status = 0xA0,讀取該寄存器以決定何時(shí)可以寫入字符存儲(chǔ)器。
在程序入口處,data[1]包括即將寫入字符的地址,data[2...54]包括字符數(shù)據(jù)。
向NVM字符存儲(chǔ)器寫字符時(shí),首先寫字符地址。然后將每個(gè)字節(jié)寫入映射存儲(chǔ)器。寫映射存儲(chǔ)器時(shí)沒有自動(dòng)遞增模式,所以每次寫操作必須寫入映射存儲(chǔ)器地址。向字符存儲(chǔ)器模式寄存器寫0xA0,可以把映射存儲(chǔ)器的內(nèi)容裝載到NVM字符存儲(chǔ)器。然后器件將狀態(tài)寄存器第5位置高,表明不能寫入字符存儲(chǔ)器。完成后,器件將該位復(fù)位至低。數(shù)據(jù)從映射存儲(chǔ)器移向字符存儲(chǔ)器時(shí)不能寫映射存儲(chǔ)器。
為了避免出現(xiàn)顯示器閃爍,在寫字符存儲(chǔ)器之前程序禁止了OSD。
/*************************************************************************************** spiWriteFM** Writes to the Character Memory (54 bytes) from "data" extern**************************************************************************************/void spiWriteFM(){unsigned char Index;spiWriteReg(VIDEO_MODE_0_WRITE,spiReadReg(VIDEO_MODE_0_READ) 0xF7); // Clear bit 0x08 to DISABLE the OSD displayspiWriteReg(FM_ADDRH_WRITE,data[1]); // Write the address of the character to be written// MAX7456 glyph tile definition// length = 0x36 = 54 bytes // MAX7456 64-byte Shadow RAM accessed // through FM_DATA_.. FM_ADDR.. contains a single // character/glyph-tile shapefor(Index = 0x00; Index 0x36; Index++){spiWriteReg(FM_ADDRL_WRITE,Index); // Write the address within the shadow RAMspiWriteReg(FM_DATA_IN_WRITE,data[Index + 2]); // Write the data to the shadow RAM}spiWriteReg(FM_MODE_WRITE, 0xA0); // MAX7456 "Font Memory Mode" write 0xA0 triggers// copy from 64-byte Shadow RAM to NV array.while ((spiReadReg(STATUS_READ) 0x20) != 0x00); // Wait while NV Memory status is BUSY// MAX7456 0xA0 status bit 0x20: NV Memory Status// Busy/~Ready}
MAX7456頭文件
下面列出了MAX7456的頭文件,以下代碼決定了器件的寄存器映射。
/*************************************************************************************** spiWriteRegAutoIncr** Writes to an 8-bit register with the SPI port by using the MAX7456's autoincrement mode**************************************************************************************/// MAX7456 VIDEO_MODE_0 register#define VIDEO_MODE_0_WRITE 0x00#define VIDEO_MODE_0_READ 0x80#define VIDEO_MODE_0_40_PAL 0x40#define VIDEO_MODE_0_20_NoAutoSync 0x20#define VIDEO_MODE_0_10_SyncInt 0x10#define VIDEO_MODE_0_08_EnOSD 0x08#define VIDEO_MODE_0_04_UpdateVsync 0x04#define VIDEO_MODE_0_02_Reset 0x02#define VIDEO_MODE_0_01_EnVideo 0x01// VIDEO MODE 0 bitmap#define NTSC 0x00#define PAL 0x40#define AUTO_SYNC 0x00#define EXT_SYNC 0x20#define INT_SYNC 0x30#define OSD_EN 0x08#define VERT_SYNC_IMM 0x00#define VERT_SYNC_VSYNC 0x04#define SW_RESET 0x02#define BUF_EN 0x00#define BUF_DI 0x01// MAX7456 VIDEO_MODE_1 register#define VIDEO_MODE_1_WRITE 0x01#define VIDEO_MODE_1_READ 0x81// MAX7456 DM_MODE register#define DM_MODE_WRITE 0x04#define DM_MODE_READ 0x84// MAX7456 DM_ADDRH register#define DM_ADDRH_WRITE 0x05#define DM_ADDRH_READ 0x85// MAX7456 DM_ADDRL register#define DM_ADDRL_WRITE 0x06#define DM_ADDRL_READ 0x87// MAX7456 DM_CODE_IN register#define DM_CODE_IN_WRITE 0x07#define DM_CODE_IN_READ 0x87// MAX7456 DM_CODE_OUT register#define DM_CODE_OUT_READ 0xB0// MAX7456 FM_MODE register#define FM_MODE_WRITE 0x08#define FM_MODE_READ
評(píng)論