s3c2440的LCD字符显示
s3c2440的lcd基本裸机程序

//===================================================================== ========// File Name : 2440addr.h// Function : S3C2440 Define Address Register// History// 0.0 : Programming start (February 15,2002) -> SOP// Revision : 03.11.2003 ver 0.0 Attatched for 2440//===================================================================== ========#ifndef __2440ADDR_H__#define __2440ADDR_H__#ifdef __cplusplusextern "C" {#endif#include "option.h"// Memory control#define rBWSCON (*(volatile unsigned *)0x48000000) //Bus width & wait status#define rBANKCON0 (*(volatile unsigned *)0x48000004) //Boot ROM control#define rBANKCON1 (*(volatile unsigned *)0x48000008) //BANK1 control#define rBANKCON2 (*(volatile unsigned *)0x4800000c) //BANK2 cControl#define rBANKCON3 (*(volatile unsigned *)0x48000010) //BANK3 control#define rBANKCON4 (*(volatile unsigned *)0x48000014) //BANK4 control#define rBANKCON5 (*(volatile unsigned *)0x48000018) //BANK5 control#define rBANKCON6 (*(volatile unsigned *)0x4800001c) //BANK6 control#define rBANKCON7 (*(volatile unsigned *)0x48000020) //BANK7 control#define rREFRESH (*(volatile unsigned *)0x48000024) //DRAM/SDRAM refresh#define rBANKSIZE (*(volatile unsigned *)0x48000028) //Flexible Bank Size#define rMRSRB6 (*(volatile unsigned *)0x4800002c) //Mode register set for SDRAM#define rMRSRB7 (*(volatile unsigned *)0x48000030) //Mode register set for SDRAM// USB Host// INTERRUPT#define rSRCPND (*(volatile unsigned *)0x4a000000) //Interrupt request status#define rINTMOD (*(volatile unsigned *)0x4a000004) //Interrupt mode control#define rINTMSK (*(volatile unsigned *)0x4a000008) //Interrupt mask control#define rPRIORITY (*(volatile unsigned *)0x4a00000c) //IRQ priority control#define rINTPND (*(volatile unsigned *)0x4a000010) //Interrupt request status#define rINTOFFSET (*(volatile unsigned *)0x4a000014) //Interruot request source offset #define rSUBSRCPND (*(volatile unsigned *)0x4a000018) //Sub source pending#define rINTSUBMSK (*(volatile unsigned *)0x4a00001c) //Interrupt sub mask// DMA#define rDISRC0 (*(volatile unsigned *)0x4b000000) //DMA 0 Initial source#define rDISRCC0 (*(volatile unsigned *)0x4b000004) //DMA 0 Initial source control#define rDIDST0 (*(volatile unsigned *)0x4b000008) //DMA 0 Initial Destination#define rDIDSTC0 (*(volatile unsigned *)0x4b00000c) //DMA 0 Initial Destination control#define rDCON0 (*(volatile unsigned *)0x4b000010) //DMA 0 Control#define rDSTAT0 (*(volatile unsigned *)0x4b000014) //DMA 0 Status#define rDCSRC0 (*(volatile unsigned *)0x4b000018) //DMA 0 Current source#define rDCDST0 (*(volatile unsigned *)0x4b00001c) //DMA 0 Current destination#define rDMASKTRIG0 (*(volatile unsigned *)0x4b000020) //DMA 0 Mask trigger#define rDISRC1 (*(volatile unsigned *)0x4b000040) //DMA 1 Initial source#define rDISRCC1 (*(volatile unsigned *)0x4b000044) //DMA 1 Initial source control#define rDIDST1 (*(volatile unsigned *)0x4b000048) //DMA 1 Initial Destination#define rDIDSTC1 (*(volatile unsigned *)0x4b00004c) //DMA 1 Initial Destination control#define rDCON1 (*(volatile unsigned *)0x4b000050) //DMA 1 Control#define rDSTAT1 (*(volatile unsigned *)0x4b000054) //DMA 1 Status#define rDCSRC1 (*(volatile unsigned *)0x4b000058) //DMA 1 Current source#define rDCDST1 (*(volatile unsigned *)0x4b00005c) //DMA 1 Current destination#define rDMASKTRIG1 (*(volatile unsigned *)0x4b000060) //DMA 1 Mask trigger#define rDISRC2 (*(volatile unsigned *)0x4b000080) //DMA 2 Initial source#define rDISRCC2 (*(volatile unsigned *)0x4b000084) //DMA 2 Initial source control#define rDIDST2 (*(volatile unsigned *)0x4b000088) //DMA 2 Initial Destination#define rDIDSTC2 (*(volatile unsigned *)0x4b00008c) //DMA 2 Initial Destination control#define rDCON2 (*(volatile unsigned *)0x4b000090) //DMA 2 Control#define rDSTAT2 (*(volatile unsigned *)0x4b000094) //DMA 2 Status#define rDCSRC2 (*(volatile unsigned *)0x4b000098) //DMA 2 Current source#define rDCDST2 (*(volatile unsigned *)0x4b00009c) //DMA 2 Current destination#define rDMASKTRIG2 (*(volatile unsigned *)0x4b0000a0) //DMA 2 Mask trigger#define rDISRC3 (*(volatile unsigned *)0x4b0000c0) //DMA 3 Initial source#define rDISRCC3 (*(volatile unsigned *)0x4b0000c4) //DMA 3 Initial source control#define rDIDST3 (*(volatile unsigned *)0x4b0000c8) //DMA 3 Initial Destination#define rDIDSTC3 (*(volatile unsigned *)0x4b0000cc) //DMA 3 Initial Destinationcontrol#define rDCON3 (*(volatile unsigned *)0x4b0000d0) //DMA 3 Control#define rDSTAT3 (*(volatile unsigned *)0x4b0000d4) //DMA 3 Status#define rDCSRC3 (*(volatile unsigned *)0x4b0000d8) //DMA 3 Current source#define rDCDST3 (*(volatile unsigned *)0x4b0000dc) //DMA 3 Current destination#define rDMASKTRIG3 (*(volatile unsigned *)0x4b0000e0) //DMA 3 Mask trigger// CLOCK & POWER MANAGEMENT#define rLOCKTIME (*(volatile unsigned *)0x4c000000) //PLL lock time counter#define rMPLLCON (*(volatile unsigned *)0x4c000004) //MPLL Control#define rUPLLCON (*(volatile unsigned *)0x4c000008) //UPLL Control#define rCLKCON (*(volatile unsigned *)0x4c00000c) //Clock generator control#define rCLKSLOW (*(volatile unsigned *)0x4c000010) //Slow clock control#define rCLKDIVN (*(volatile unsigned *)0x4c000014) //Clock divider control#define rCAMDIVN (*(volatile unsigned *)0x4c000018) //USB, CAM Clock divider control// LCD CONTROLLER#define rLCDCON1 (*(volatile unsigned *)0x4d000000) //LCD control 1#define rLCDCON2 (*(volatile unsigned *)0x4d000004) //LCD control 2#define rLCDCON3 (*(volatile unsigned *)0x4d000008) //LCD control 3#define rLCDCON4 (*(volatile unsigned *)0x4d00000c) //LCD control 4#define rLCDCON5 (*(volatile unsigned *)0x4d000010) //LCD control 5#define rLCDSADDR1 (*(volatile unsigned *)0x4d000014) //STN/TFT Frame buffer start address 1#define rLCDSADDR2 (*(volatile unsigned *)0x4d000018) //STN/TFT Frame buffer start address 2#define rLCDSADDR3 (*(volatile unsigned *)0x4d00001c) //STN/TFT Virtual screen address set#define rREDLUT (*(volatile unsigned *)0x4d000020) //STN Red lookup table#define rGREENLUT (*(volatile unsigned *)0x4d000024) //STN Green lookup table#define rBLUELUT (*(volatile unsigned *)0x4d000028) //STN Blue lookup table#define rDITHMODE (*(volatile unsigned *)0x4d00004c) //STN Dithering mode#define rTPAL (*(volatile unsigned *)0x4d000050) //TFT Temporary palette#define rLCDINTPND (*(volatile unsigned *)0x4d000054) //LCD Interrupt pending#define rLCDSRCPND (*(volatile unsigned *)0x4d000058) //LCD Interrupt source#define rLCDINTMSK (*(volatile unsigned *)0x4d00005c) //LCD Interrupt mask#define rTCONSEL (*(volatile unsigned *)0x4d000060) //LPC3600 Control --- edited by junon#define PALETTE 0x4d000400 //Palette start address//Nand Flash#define rNFCONF (*(volatile unsigned *)0x4E000000) //NAND Flash configuration #define rNFCONT (*(volatile unsigned *)0x4E000004) //NAND Flash control#define rNFCMD (*(volatile unsigned *)0x4E000008) //NAND Flash command#define rNFADDR (*(volatile unsigned *)0x4E00000C) //NAND Flash address#define rNFDATA (*(volatile unsigned *)0x4E000010) //NAND Flash data#define rNFDATA8 (*(volatile unsigned char *)0x4E000010) //NAND Flash data#define NFDATA (0x4E000010) //NAND Flash data address#define rNFMECCD0 (*(volatile unsigned *)0x4E000014) //NAND Flash ECC for Main Area#define rNFMECCD1 (*(volatile unsigned *)0x4E000018)#define rNFSECCD (*(volatile unsigned *)0x4E00001C) //NAND Flash ECC for Spare Area#define rNFSTAT (*(volatile unsigned *)0x4E000020) //NAND Flash operation status#define rNFESTAT0 (*(volatile unsigned *)0x4E000024)#define rNFESTAT1 (*(volatile unsigned *)0x4E000028)#define rNFMECC0 (*(volatile unsigned *)0x4E00002C)#define rNFMECC1 (*(volatile unsigned *)0x4E000030)#define rNFSECC (*(volatile unsigned *)0x4E000034)#define rNFSBLK (*(volatile unsigned *)0x4E000038) //NAND Flash Start block address#define rNFEBLK (*(volatile unsigned *)0x4E00003C) //NAND Flash End block address//Camera Interface. Edited for 2440A#define rCISRCFMT (*(volatile unsigned *)0x4F000000)#define rCIWDOFST (*(volatile unsigned *)0x4F000004)#define rCIGCTRL (*(volatile unsigned *)0x4F000008)#define rCICOYSA1 (*(volatile unsigned *)0x4F000018)#define rCICOYSA2 (*(volatile unsigned *)0x4F00001C)#define rCICOYSA3 (*(volatile unsigned *)0x4F000020)#define rCICOYSA4 (*(volatile unsigned *)0x4F000024)#define rCICOCBSA1 (*(volatile unsigned *)0x4F000028)#define rCICOCBSA2 (*(volatile unsigned *)0x4F00002C)#define rCICOCBSA3 (*(volatile unsigned *)0x4F000030)#define rCICOCBSA4 (*(volatile unsigned *)0x4F000034)#define rCICOCRSA1 (*(volatile unsigned *)0x4F000038)#define rCICOCRSA2 (*(volatile unsigned *)0x4F00003C)#define rCICOCRSA3 (*(volatile unsigned *)0x4F000040)#define rCICOCRSA4 (*(volatile unsigned *)0x4F000044)#define rCICOTRGFMT (*(volatile unsigned *)0x4F000048)#define rCICOCTRL (*(volatile unsigned *)0x4F00004C)#define rCICOSCPRERA TIO (*(volatile unsigned *)0x4F000050)#define rCICOSCPREDST (*(volatile unsigned *)0x4F000054)#define rCICOSCCTRL (*(volatile unsigned *)0x4F000058)#define rCICOTAREA (*(volatile unsigned *)0x4F00005C)#define rCICOSTATUS (*(volatile unsigned *)0x4F000064)#define rCIPRCLRSA1 (*(volatile unsigned *)0x4F00006C)#define rCIPRCLRSA2 (*(volatile unsigned *)0x4F000070)#define rCIPRCLRSA3 (*(volatile unsigned *)0x4F000074)#define rCIPRCLRSA4 (*(volatile unsigned *)0x4F000078)#define rCIPRTRGFMT (*(volatile unsigned *)0x4F00007C)#define rCIPRCTRL (*(volatile unsigned *)0x4F000080)#define rCIPRSCPRERATIO (*(volatile unsigned *)0x4F000084)#define rCIPRSCPREDST (*(volatile unsigned *)0x4F000088)#define rCIPRSCCTRL (*(volatile unsigned *)0x4F00008C)#define rCIPRTAREA (*(volatile unsigned *)0x4F000090)#define rCIPRSTATUS (*(volatile unsigned *)0x4F000098)#define rCIIMGCPT (*(volatile unsigned *)0x4F0000A0)// UART#define rULCON0 (*(volatile unsigned *)0x50000000) //UART 0 Line control#define rUCON0 (*(volatile unsigned *)0x50000004) //UART 0 Control#define rUFCON0 (*(volatile unsigned *)0x50000008) //UART 0 FIFO control#define rUMCON0 (*(volatile unsigned *)0x5000000c) //UART 0 Modem control #define rUTRSTAT0 (*(volatile unsigned *)0x50000010) //UART 0 Tx/Rx status#define rUERSTAT0 (*(volatile unsigned *)0x50000014) //UART 0 Rx error status #define rUFSTAT0 (*(volatile unsigned *)0x50000018) //UART 0 FIFO status#define rUMSTAT0 (*(volatile unsigned *)0x5000001c) //UART 0 Modem status#define rUBRDIV0 (*(volatile unsigned *)0x50000028) //UART 0 Baud rate divisor#define rULCON1 (*(volatile unsigned *)0x50004000) //UART 1 Line control#define rUCON1 (*(volatile unsigned *)0x50004004) //UART 1 Control#define rUFCON1 (*(volatile unsigned *)0x50004008) //UART 1 FIFO control#define rUMCON1 (*(volatile unsigned *)0x5000400c) //UART 1 Modem control #define rUTRSTAT1 (*(volatile unsigned *)0x50004010) //UART 1 Tx/Rx status#define rUERSTAT1 (*(volatile unsigned *)0x50004014) //UART 1 Rx error status #define rUFSTAT1 (*(volatile unsigned *)0x50004018) //UART 1 FIFO status#define rUMSTAT1 (*(volatile unsigned *)0x5000401c) //UART 1 Modem status#define rUBRDIV1 (*(volatile unsigned *)0x50004028) //UART 1 Baud rate divisor #define rULCON2 (*(volatile unsigned *)0x50008000) //UART 2 Line control#define rUCON2 (*(volatile unsigned *)0x50008004) //UART 2 Control#define rUFCON2 (*(volatile unsigned *)0x50008008) //UART 2 FIFO control#define rUMCON2 (*(volatile unsigned *)0x5000800c) //UART 2 Modem control #define rUTRSTAT2 (*(volatile unsigned *)0x50008010) //UART 2 Tx/Rx status#define rUERSTAT2 (*(volatile unsigned *)0x50008014) //UART 2 Rx error status#define rUFSTAT2 (*(volatile unsigned *)0x50008018) //UART 2 FIFO status#define rUMSTAT2 (*(volatile unsigned *)0x5000801c) //UART 2 Modem status#define rUBRDIV2 (*(volatile unsigned *)0x50008028) //UART 2 Baud rate divisor#ifdef __BIG_ENDIAN#define rUTXH0 (*(volatile unsigned char *)0x50000023) //UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50000027) //UART 0 Receive buffer#define rUTXH1 (*(volatile unsigned char *)0x50004023) //UART 1 Transmission Hold#define rURXH1 (*(volatile unsigned char *)0x50004027) //UART 1 Receive buffer#define rUTXH2 (*(volatile unsigned char *)0x50008023) //UART 2 Transmission Hold#define rURXH2 (*(volatile unsigned char *)0x50008027) //UART 2 Receive buffer#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000023)=(unsigned char)(ch)#define RdURXH0() (*(volatile unsigned char *)0x50000027)#define WrUTXH1(ch) (*(volatile unsigned char *)0x50004023)=(unsigned char)(ch)#define RdURXH1() (*(volatile unsigned char *)0x50004027)#define WrUTXH2(ch) (*(volatile unsigned char *)0x50008023)=(unsigned char)(ch)#define RdURXH2() (*(volatile unsigned char *)0x50008027)#define UTXH0 (0x50000020+3) //Byte_access address by DMA#define URXH0 (0x50000024+3)#define UTXH1 (0x50004020+3)#define URXH1 (0x50004024+3)#define UTXH2 (0x50008020+3)#define URXH2 (0x50008024+3)#else //Little Endian#define rUTXH0 (*(volatile unsigned char *)0x50000020) //UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50000024) //UART 0 Receive buffer#define rUTXH1 (*(volatile unsigned char *)0x50004020) //UART 1 Transmission Hold#define rURXH1 (*(volatile unsigned char *)0x50004024) //UART 1 Receive buffer#define rUTXH2 (*(volatile unsigned char *)0x50008020) //UART 2 Transmission Hold#define rURXH2 (*(volatile unsigned char *)0x50008024) //UART 2 Receive buffer#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)#define RdURXH0() (*(volatile unsigned char *)0x50000024)#define WrUTXH1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch)#define RdURXH1() (*(volatile unsigned char *)0x50004024)#define WrUTXH2(ch) (*(volatile unsigned char *)0x50008020)=(unsigned char)(ch)#define RdURXH2() (*(volatile unsigned char *)0x50008024)#define UTXH0 (0x50000020) //Byte_access address by DMA#define URXH0 (0x50000024)#define UTXH1 (0x50004020)#define URXH1 (0x50004024)#define UTXH2 (0x50008020)#define URXH2 (0x50008024)#endif// PWM TIMER#define rTCFG0 (*(volatile unsigned *)0x51000000) //Timer 0 configuration#define rTCFG1 (*(volatile unsigned *)0x51000004) //Timer 1 configuration#define rTCON (*(volatile unsigned *)0x51000008) //Timer control#define rTCNTB0 (*(volatile unsigned *)0x5100000c)//Timer count buffer 0#define rTCMPB0 (*(volatile unsigned *)0x51000010) //Timer compare buffer 0#define rTCNTO0 (*(volatile unsigned *)0x51000014) //Timer count observation 0#define rTCNTB1 (*(volatile unsigned *)0x51000018) //Timer count buffer 1#define rTCMPB1 (*(volatile unsigned *)0x5100001c) //Timer compare buffer 1#define rTCNTO1 (*(volatile unsigned *)0x51000020) //Timer count observation 1#define rTCNTB2 (*(volatile unsigned *)0x51000024) //Timer count buffer 2#define rTCMPB2 (*(volatile unsigned *)0x51000028) //Timer compare buffer 2#define rTCNTO2 (*(volatile unsigned *)0x5100002c) //Timer count observation 2#define rTCNTB3 (*(volatile unsigned *)0x51000030) //Timer count buffer 3#define rTCMPB3 (*(volatile unsigned *)0x51000034) //Timer compare buffer 3#define rTCNTO3 (*(volatile unsigned *)0x51000038) //Timer count observation 3#define rTCNTB4 (*(volatile unsigned *)0x5100003c)//Timer count buffer 4#define rTCNTO4 (*(volatile unsigned *)0x51000040) //Timer count observation 4// USB DEVICE#ifdef __BIG_ENDIAN<ERROR IF BIG_ENDIAN>#define rFUNC_ADDR_REG (*(volatile unsigned char *)0x52000143) //Function address #define rPWR_REG (*(volatile unsigned char *)0x52000147) //Power management#define rEP_INT_REG (*(volatile unsigned char *)0x5200014b) //EP Interrupt pending and clear#define rUSB_INT_REG (*(volatile unsigned char *)0x5200015b) //USB Interrupt pending and clear#define rEP_INT_EN_REG (*(volatile unsigned char *)0x5200015f)//Interrupt enable#define rUSB_INT_EN_REG (*(volatile unsigned char *)0x5200016f)#define rFRAME_NUM1_REG (*(volatile unsigned char *)0x52000173) //Frame number lower byte#define rFRAME_NUM2_REG (*(volatile unsigned char *)0x52000177) //Frame number higher byte#define rINDEX_REG (*(volatile unsigned char *)0x5200017b) //Register index #define rMAXP_REG (*(volatile unsigned char *)0x52000183) //Endpoint max packet#define rEP0_CSR (*(volatile unsigned char *)0x52000187) //Endpoint 0 status#define rIN_CSR1_REG (*(volatile unsigned char *)0x52000187) //In endpoint control status#define rIN_CSR2_REG (*(volatile unsigned char *)0x5200018b)#define rOUT_CSR1_REG (*(volatile unsigned char *)0x52000193) //Out endpoint control status#define rOUT_CSR2_REG (*(volatile unsigned char *)0x52000197)#define rOUT_FIFO_CNT1_REG (*(volatile unsigned char *)0x5200019b) //Endpoint out write count#define rOUT_FIFO_CNT2_REG (*(volatile unsigned char *)0x5200019f)#define rEP0_FIFO (*(volatile unsigned char *)0x520001c3) //Endpoint 0 FIFO#define rEP1_FIFO (*(volatile unsigned char *)0x520001c7) //Endpoint 1 FIFO#define rEP2_FIFO (*(volatile unsigned char *)0x520001cb) //Endpoint 2 FIFO#define rEP3_FIFO (*(volatile unsigned char *)0x520001cf) //Endpoint 3 FIFO#define rEP4_FIFO (*(volatile unsigned char *)0x520001d3) //Endpoint 4 FIFO#define rEP1_DMA_CON (*(volatile unsigned char *)0x52000203) //EP1 DMA interface control#define rEP1_DMA_UNIT (*(volatile unsigned char *)0x52000207) //EP1 DMA Tx unit counter#define rEP1_DMA_FIFO (*(volatile unsigned char *)0x5200020b) //EP1 DMA Tx FIFO counter#define rEP1_DMA_TTC_L (*(volatile unsigned char *)0x5200020f) //EP1 DMA total Tx counter#define rEP1_DMA_TTC_M (*(volatile unsigned char *)0x52000213)#define rEP1_DMA_TTC_H (*(volatile unsigned char *)0x52000217)#define rEP2_DMA_CON (*(volatile unsigned char *)0x5200021b) //EP2 DMA interface control#define rEP2_DMA_UNIT (*(volatile unsigned char *)0x5200021f) //EP2 DMA Tx unit counter#define rEP2_DMA_FIFO (*(volatile unsigned char *)0x52000223) //EP2 DMA Tx FIFO counter#define rEP2_DMA_TTC_L (*(volatile unsigned char *)0x52000227) //EP2 DMA total Tx counter#define rEP2_DMA_TTC_M (*(volatile unsigned char *)0x5200022b)#define rEP2_DMA_TTC_H (*(volatile unsigned char *)0x5200022f)#define rEP3_DMA_CON (*(volatile unsigned char *)0x52000243) //EP3 DMA interface control#define rEP3_DMA_UNIT (*(volatile unsigned char *)0x52000247) //EP3 DMA Tx unit counter#define rEP3_DMA_FIFO (*(volatile unsigned char *)0x5200024b) //EP3 DMA Tx FIFO counter#define rEP3_DMA_TTC_L (*(volatile unsigned char *)0x5200024f) //EP3 DMA total Tx counter#define rEP3_DMA_TTC_M (*(volatile unsigned char *)0x52000253)#define rEP3_DMA_TTC_H (*(volatile unsigned char *)0x52000257)#define rEP4_DMA_CON (*(volatile unsigned char *)0x5200025b) //EP4 DMA interface control#define rEP4_DMA_UNIT (*(volatile unsigned char *)0x5200025f) //EP4 DMA Tx unit counter#define rEP4_DMA_FIFO (*(volatile unsigned char *)0x52000263) //EP4 DMA Tx FIFO counter#define rEP4_DMA_TTC_L (*(volatile unsigned char *)0x52000267) //EP4 DMA total Tx counter#define rEP4_DMA_TTC_M (*(volatile unsigned char *)0x5200026b)#define rEP4_DMA_TTC_H (*(volatile unsigned char *)0x5200026f)#else // Little Endian#define rFUNC_ADDR_REG (*(volatile unsigned char *)0x52000140) //Function address #define rPWR_REG (*(volatile unsigned char *)0x52000144) //Power management#define rEP_INT_REG (*(volatile unsigned char *)0x52000148) //EP Interrupt pending and clear#define rUSB_INT_REG (*(volatile unsigned char *)0x52000158) //USB Interrupt pending and clear#define rEP_INT_EN_REG (*(volatile unsigned char *)0x5200015c) //Interrupt enable #define rUSB_INT_EN_REG (*(volatile unsigned char *)0x5200016c)#define rFRAME_NUM1_REG (*(volatile unsigned char *)0x52000170) //Frame number lower byte#define rFRAME_NUM2_REG (*(volatile unsigned char *)0x52000174) //Frame number higher byte#define rINDEX_REG (*(volatile unsigned char *)0x52000178) //Register index #define rMAXP_REG (*(volatile unsigned char *)0x52000180) //Endpoint max packet#define rEP0_CSR (*(volatile unsigned char *)0x52000184) //Endpoint 0 status#define rIN_CSR1_REG (*(volatile unsigned char *)0x52000184) //In endpoint control status#define rIN_CSR2_REG (*(volatile unsigned char *)0x52000188)#define rOUT_CSR1_REG (*(volatile unsigned char *)0x52000190) //Out endpoint control status#define rOUT_CSR2_REG (*(volatile unsigned char *)0x52000194)#define rOUT_FIFO_CNT1_REG (*(volatile unsigned char *)0x52000198) //Endpoint out write count#define rOUT_FIFO_CNT2_REG (*(volatile unsigned char *)0x5200019c)#define rEP0_FIFO (*(volatile unsigned char *)0x520001c0) //Endpoint 0 FIFO#define rEP1_FIFO (*(volatile unsigned char *)0x520001c4) //Endpoint 1 FIFO#define rEP2_FIFO (*(volatile unsigned char *)0x520001c8) //Endpoint 2 FIFO#define rEP3_FIFO (*(volatile unsigned char *)0x520001cc) //Endpoint 3 FIFO#define rEP4_FIFO (*(volatile unsigned char *)0x520001d0) //Endpoint 4 FIFO#define rEP1_DMA_CON (*(volatile unsigned char *)0x52000200) //EP1 DMA interface control#define rEP1_DMA_UNIT (*(volatile unsigned char *)0x52000204) //EP1 DMA Tx unit counter#define rEP1_DMA_FIFO (*(volatile unsigned char *)0x52000208) //EP1 DMA Tx FIFO counter#define rEP1_DMA_TTC_L (*(volatile unsigned char *)0x5200020c) //EP1 DMA total Tx counter#define rEP1_DMA_TTC_M (*(volatile unsigned char *)0x52000210)#define rEP1_DMA_TTC_H (*(volatile unsigned char *)0x52000214)#define rEP2_DMA_CON (*(volatile unsigned char *)0x52000218) //EP2 DMA interface control#define rEP2_DMA_UNIT (*(volatile unsigned char *)0x5200021c) //EP2 DMA Tx unit counter#define rEP2_DMA_FIFO (*(volatile unsigned char *)0x52000220) //EP2 DMA Tx FIFO counter#define rEP2_DMA_TTC_L (*(volatile unsigned char *)0x52000224) //EP2 DMA total Tx counter#define rEP2_DMA_TTC_M (*(volatile unsigned char *)0x52000228)#define rEP2_DMA_TTC_H (*(volatile unsigned char *)0x5200022c)#define rEP3_DMA_CON (*(volatile unsigned char *)0x52000240) //EP3 DMA interface control#define rEP3_DMA_UNIT (*(volatile unsigned char *)0x52000244) //EP3 DMA Tx unit counter#define rEP3_DMA_FIFO (*(volatile unsigned char *)0x52000248) //EP3 DMA Tx FIFO counter#define rEP3_DMA_TTC_L (*(volatile unsigned char *)0x5200024c) //EP3 DMA total Tx counter#define rEP3_DMA_TTC_M (*(volatile unsigned char *)0x52000250)#define rEP3_DMA_TTC_H (*(volatile unsigned char *)0x52000254)#define rEP4_DMA_CON (*(volatile unsigned char *)0x52000258) //EP4 DMA interface control#define rEP4_DMA_UNIT (*(volatile unsigned char *)0x5200025c) //EP4 DMA Tx unit counter#define rEP4_DMA_FIFO (*(volatile unsigned char *)0x52000260) //EP4 DMA Tx FIFO counter#define rEP4_DMA_TTC_L (*(volatile unsigned char *)0x52000264) //EP4 DMA total Tx counter#define rEP4_DMA_TTC_M (*(volatile unsigned char *)0x52000268)#define rEP4_DMA_TTC_H (*(volatile unsigned char *)0x5200026c)#endif // __BIG_ENDIAN// WATCH DOG TIMER#define rWTCON (*(volatile unsigned *)0x53000000) //Watch-dog timer mode#define rWTDAT (*(volatile unsigned *)0x53000004) //Watch-dog timer data#define rWTCNT (*(volatile unsigned *)0x53000008) //Eatch-dog timer count// IIC#define rIICCON (*(volatile unsigned *)0x54000000) //IIC control#define rIICSTAT (*(volatile unsigned *)0x54000004) //IIC status#define rIICADD (*(volatile unsigned *)0x54000008) //IIC address#define rIICDS (*(volatile unsigned *)0x5400000c) //IIC data shift#define rIICLC (*(volatile unsigned *)0x54000010) //IIC multi-master line control// IIS#define rIISCON (*(volatile unsigned *)0x55000000) //IIS Control#define rIISMOD (*(volatile unsigned *)0x55000004) //IIS Mode#define rIISPSR (*(volatile unsigned *)0x55000008) //IIS Prescaler#define rIISFCON (*(volatile unsigned *)0x5500000c) //IIS FIFO control#ifdef __BIG_ENDIAN#define IISFIFO ((volatile unsigned short *)0x55000012) //IIS FIFO entry#else //Little Endian#define IISFIFO ((volatile unsigned short *)0x55000010) //IIS FIFO entry#endif//AC97, Added for S3C2440A#define rAC_GLBCTRL *(volatile unsigned *)0x5b000000#define rAC_GLBSTAT *(volatile unsigned *)0x5b000004#define rAC_CODEC_CMD *(volatile unsigned *)0x5b000008#define rAC_CODEC_STA T *(volatile unsigned *)0x5b00000C#define rAC_PCMADDR *(volatile unsigned *)0x5b000010#define rAC_MICADDR *(volatile unsigned *)0x5b000014#define rAC_PCMDATA *(volatile unsigned *)0x5b000018#define rAC_MICDA TA *(volatile unsigned *)0x5b00001C#define AC_PCMDATA 0x5b000018#define AC_MICDA TA 0x5b00001C// I/O PORT#define rGPACON (*(volatile unsigned *)0x56000000) //Port A control#define rGPADAT (*(volatile unsigned *)0x56000004) //Port A data#define rGPBCON (*(volatile unsigned *)0x56000010) //Port B control#define rGPBDAT (*(volatile unsigned *)0x56000014) //Port B data#define rGPBUP (*(volatile unsigned *)0x56000018) //Pull-up control B#define rGPCCON (*(volatile unsigned *)0x56000020) //Port C control#define rGPCDAT (*(volatile unsigned *)0x56000024) //Port C data#define rGPCUP (*(volatile unsigned *)0x56000028) //Pull-up control C#define rGPDCON (*(volatile unsigned *)0x56000030) //Port D control#define rGPDDAT (*(volatile unsigned *)0x56000034) //Port D data#define rGPDUP (*(volatile unsigned *)0x56000038) //Pull-up control D#define rGPECON (*(volatile unsigned *)0x56000040) //Port E control#define rGPEDAT (*(volatile unsigned *)0x56000044) //Port E data#define rGPEUP (*(volatile unsigned *)0x56000048) //Pull-up control E#define rGPFCON (*(volatile unsigned *)0x56000050) //Port F control#define rGPFDAT (*(volatile unsigned *)0x56000054) //Port F data#define rGPFUP (*(volatile unsigned *)0x56000058) //Pull-up control F#define rGPGCON (*(volatile unsigned *)0x56000060) //Port G control#define rGPGDAT (*(volatile unsigned *)0x56000064) //Port G data#define rGPGUP (*(volatile unsigned *)0x56000068) //Pull-up control G#define rGPHCON (*(volatile unsigned *)0x56000070) //Port H control#define rGPHDAT (*(volatile unsigned *)0x56000074) //Port H data#define rGPHUP (*(volatile unsigned *)0x56000078) //Pull-up control H#define rGPJCON (*(volatile unsigned *)0x560000d0) //Port J control#define rGPJDAT (*(volatile unsigned *)0x560000d4) //Port J data#define rGPJUP (*(volatile unsigned *)0x560000d8) //Pull-up control J#define rMISCCR (*(volatile unsigned *)0x56000080) //Miscellaneous control#define rDCLKCON (*(volatile unsigned *)0x56000084) //DCLK0/1 control#define rEXTINT0 (*(volatile unsigned *)0x56000088) //External interrupt control register 0 #define rEXTINT1 (*(volatile unsigned *)0x5600008c) //External interrupt control register 1 #define rEXTINT2 (*(volatile unsigned *)0x56000090) //External interrupt control register 2 #define rEINTFLT0 (*(volatile unsigned *)0x56000094) //Reserved#define rEINTFLT1 (*(volatile unsigned *)0x56000098) //Reserved#define rEINTFLT2 (*(volatile unsigned *)0x5600009c) //External interrupt filter control register 2。
S3C2410 LCD驱动学习心得-4

3. BMP和JPEG图形显示程序3.1 在LCD上显示BMP或JPEG图片的主流程图首先,在程序开始前。
要在nfs/dev目录下创建LCD的设备结点,设备名fb0,设备类型为字符设备,主设备号为29,次设备号为0。
命令如下:mknod fb0 c 29 0在LCD上显示图象的主流程图如图3.1所示。
程序一开始要调用open函数打开设备,然后调用ioctl获取设备相关信息,接下来就是读取图形文件数据,把图象的RGB值映射到显存中,这部分是图象显示的核心。
对于JPEG格式的图片,要先经过JPEG解码才能得到RGB 数据,本项目中直接才用现成的JPEG库进行解码。
对于bmp格式的图片,则可以直接从文件里面提取其RGB数据。
要从一个bmp文件里面把图片数据阵列提取出来,首先必须知道bmp文件的格式。
下面来详细介绍bmp文件的格式。
图3.13.2 bmp位图格式分析位图文件可看成由四个部分组成:位图文件头、位图信息头、彩色表和定义位图的字节阵列。
如图3.2所示。
图3.2文件头中各个段的地址及其内容如图3.3。
图3.3位图文件头数据结构包含BMP图象文件的类型,显示内容等信息。
它的数据结构如下定义:Typedef struct{int bfType;//表明位图文件的类型,必须为BMlong bfSize;//表明位图文件的大小,以字节为单位int bfReserved1;//属于保留字,必须为本0int bfReserved2;//也是保留字,必须为本0long bfOffBits;//位图阵列的起始位置,以字节为单位} BITMAPFILEHEADER;图3.4 位图文件头的数据结构(2)信息头中各个段的地址及其内容如图3.5所示。
图3.5位图信息头的数据结构包含了有关BMP图象的宽,高,压缩方法等信息,它的C语言数据结构如图3.6所示。
Typedef struct {long biSize;//指出本数据结构所需要的字节数long biWidth;//以象素为单位,给出BMP图象的宽度long biHeight;//以象素为单位,给出BMP图象的高度int biPlanes;//输出设备的位平面数,必须置为1int biBitCount;//给出每个象素的位数long biCompress;//给出位图的压缩类型long biSizeImage;//给出图象字节数的多少long biXPelsPerMeter;//图像的水平分辨率long biYPelsPerMeter;//图象的垂直分辨率long biClrUsed;//调色板中图象实际使用的颜色素数long biClrImportant;//给出重要颜色的索引值} BITMAPINFOHEADER;图3.6 BITMAPINFOHEADER数据结构(3)对于象素小于或等于16位的图片,都有一个颜色表用来给图象数据阵列提供颜色索引,其中的每块数据都以B、G、R的顺序排列,还有一个是reserved保留位。
基于ARM9处理器S3C2410的LCD显示系统设计

引言 硬件电路设计 系统软件设计 结束语
千锋嵌入式学院 最专业的嵌入式培训机构
S3C2410是三星公司生产的基于arm920T内核 的RISC微处理器,其主频可达203MHz[1],适用 于信息家电、PDA、手持设备、移动终端等领域, 本文介绍了基于S3C2410的显示系统的硬件电路 及驱动软件设计方法。 TFT-LCD模块的时序要求 本显示模块选用的LQ080V3DG01是Sharp公 司的TFT-LCD器件,该器件的分辨率为640×480, 控制时序图如图1所示,时间参数如表1所列[2]。
千锋嵌入式学院 最专业的嵌入式培训机构
千锋嵌入式学院 最专业的嵌入式培训机构
S3C2410处理器中的LCD控制器内含寄存器 LCDCOM1-LCDCON5。对于LQ080V3DG01,这些寄存 器的具体设置如下: (1)在LCDCON1中,CLKVAL是时钟参数,对于 LQ080V3DG01,该域值取1。PNRMODE是显示模式参数, 该域值取3,表示所用模块是TFT型,BPPMODE是每个象素 的数据位数参数,对于LQ080V3DG01模块,设计时可设置 成16bpp,所以此域值取12。 (2)在LCDCON2中,VBPD对应于表1中的H参数, 该域值取32。LINEVAL对应于表1中的I参数,该域值取479, VFPD对应于表1中的J参数,该域值取9,VSPW对应于表1 中的G参数,该域值取1。
千锋嵌入式学院 最专业的嵌入式培训机构
在该显示系统的硬件电路中,S3C2410与LCD 模块的连接是关键,S3C2410内部自带一个LCD驱 动控制器,其接口可以与单色、灰度、彩色STN型 和彩色TFT型的LCD直接相连,但需要根据所连接 TFT LCD 的LCD的类型设置相应寄存器中的显示模式(见下 节Q080V3DG01要求其电源电压Vdd典型值 为3.3V/5V,并且LCD数据和控制信号的高电平输 入电压Vih在2.3-5.5V范围内,低电平输入电压Vil 则在-0.3-0.9V范围内,故可以直接与S3C2410相 连,其电路图如图2所示。
S3C2440的LCD控制器的配置与应用

0 引 言
传 统 的 发 光 二 极 管 、 码 管和 L D等 交 互 手 段 已经 远 远 数 E 不 能 满足 现 实 的需 求 , L D液 晶 显 示 以 其 高 像 素 显示 、 寸 而 C 尺 大 、 量 轻等 优 势 迅 速 普 及 , 重 已成 为大 多数 情 况 下 人 机 交 互 的
Ab t a t T er ai drq i me t f u n ma hn tra e e ci e ec re t mb d e y t m.T k nt eS ms n ’ 2 s r c : h ly a u r e t n e e n s h ma - c i e n e fc s s s r di t u r n o i id b n h e e d ds se a e a u g S 一 h 3
给 出 了可方便移 植的程序 代码 、 具体 的 配置参数 以及相 关函数 。 实验 结果表 明 了该接 口软件设 计 的正确性 和 实用性 。
关 键 词 : 入 式 ; 人 机 交 互 界 面 ;¥ C 4 0 薄 膜 晶 体 管 液 晶 ; 液 晶 显 示 嵌 3 24 ;
中 图法分 类号 : P 6 . T 38 3 3
文献标 识码 : A
文 章编号 :0 072 (00 1-4 00 10 —0 4 2 1) 127 -3
Co f u ain a da p iai no n g rto n p l t f i c o LCD o t l r a e n S 4 0 c n r l s do 3 o eb C2 4
S3C2440裸机LCD及触摸屏应用开发

22科技资讯 SC I EN C E & TE C HN O LO G Y I NF O R MA T IO N 信 息 技 术随着各种控制系统监控界面要求的提高,触摸屏和彩色LC D屏的应用越来越受到用户的欢迎。
本文以配有3.5寸触摸屏和彩色LCD屏的32位计算机S3C2440为硬件平台,以“风帆旋转角度控制系统”的具体案例开发为背景,详细介绍在S3C2440裸机上开发LC D及触摸屏应用的方法和具体过程,经实践证明按本方法可快速开发L C D 及触摸屏监控界面且可靠性好。
1 LCD 显示函数库开发一般S3C2440开发板配套开发资料包含PutPixel(U32x,U32y,U32c)单象素显示函数,可在此基础上开发LC D显示函数库graph.h,以便用显示接口函数开发各种应用程序。
L CD 显示函数库如表1所示,各L C D 显示接口函数在本文案例应用的方法作如下简介。
以画直线、画矩形、画填充矩形和画填充圆函数为基础,编写风帆绘制风帆状态绘制函数和实时曲线绘制,利用Glib_Sail ( )在LCD屏上显示风帆当前状态图,利用Act_Curve( )绘制风帆角度实时曲线;把0~9数码和小数点制作成12×16的位图,并用BM P图片转换软件转化成数据,建立数码库sm_1216.h,以便数值显示函数显示数值;由于建立文字库工作量大,且要显示的中文字符较少,所以把连在一起要显示的文字和按钮都做成位图,并转化建立文字图片库zf_6522.h和按钮图片库anniu_7034.h,以便图片显示函数显示文字和触摸按钮。
2 触摸屏应用函数库开发一般S3C2440开发板配套开发资料中包含触摸屏触摸中断服务函数,该函数获取当前触摸点的坐标(xdata,ydata),可在此基础上开发触摸屏应用函数库Touchpanel.h,以方便开发各种应用程序。
本文应用触摸屏需完成任务有:通过触摸完成控制系统参数设定(风帆设定角度),还需通过触摸启动或停止按钮完成控制系统的启停状态的转换。
嵌入式Linux下S3C2410的调色板彩色显示

嵌入式Linux下S3C2410的调色板彩色显示对于一个显示设备,数据的更新率正比于画面的像素数和颜色深度的乘积。
在系统中,受处理器资源配置和运算能力的制约,当用法大辨别率显示时(如在一些屏幕尺寸较大的终端上,往往需要640×480以上),需要降低显示的颜色深度。
否则,因为数据处理负担过重会造成画面的颤动和不连贯。
这时,调色板技术将发挥重要作用。
9内核的在国内的嵌入式领域有着广泛的应用,芯片中带有控制器,可支持多种辨别率、多种色彩深度的LCD显示输出。
在此,将S3C2410的调色板技术,以及嵌入式Linux系统下调色板显示的实现办法举行分析。
1 S3C2410调色板技术概述1.1 调色板的概念在计算机图像技术中,一个像素的色彩是由它的R,G,B重量表示的,每个重量又经过量化,一个像素总的量化级数就是这个显示系统的色彩深度。
量化级数越高,可以表示的色彩也就越多,终于的图像也就越逼真。
当量化级数达到16位以上时,被称为真彩色。
但是,量化级数越高,就需要越高的数据宽度,给处理器带来的负担也就越重;量化级数在8位以下时,所能表达的色彩又太少,不能够满足用户特定的需求。
为了解决这个问题,可以实行调色板技术。
所谓调色板,就是在低色彩深度的模式下,在有限的像素值与RGB色彩之间建立对应关系的一个线性表。
比如说,从全部的16位彩色中抽取一定数量的色彩,编制索引。
当需要用法某种彩色时,不需要对这种色彩的RGB重量举行描述,只需要引用它的索引号,就可以用法户选取自己需要的色彩。
索引号的编码长度远远小于RGB重量的编码长度,因此在彩色显示的同时,也大大减轻了系统的负担。
以256色调色板为例,调色板中存储256种色彩的RGB值,每种色彩的RGB值是16位。
用这256种色彩编制索引时,从OOH~FFH只需要8位数据宽度,而每个索引所对应的色彩却是16位宽度的色彩信息。
第1页共4页。
S3C2440_LCD中文

15 LCD控制器概述:S3C2440的LCD控制器由由一个逻辑单元组成,它的作用是:把LCD图像数据从一个位于系统内存的video buffer传送到一个外部的LCD驱动器。
LCD控制器使用一个基于时间的像素抖动算法和侦速率控制思想,可以支持单色,2-bit per pixel(4级灰度)或者4-bit-pixel(16级灰度)屏,并且它可以与256色(8BPP)和4096色(12BPP)的彩色STN LCD连接。
它支持1BPP,2BPP,4BPP,8BPP的调色板TFT彩色屏并且支持64K色(16BPP)和16M色(24BPP)非调色板真彩显示。
LCD控制器是可以编程满足不同的需求,关于水平,垂直方向的像素数目,数据接口的数据线宽度,接口时序和刷新速率。
特征:STN LCD屏:----支持3种扫描方式的屏:4位双扫,4位单扫和8位单扫。
----支持单色(1BPP),4级灰度(2BPP),16级灰度(4BPP)。
----支持256色,4096色的彩色STN LCD屏----支持多种屏幕分辨率典型的应用:640*480,320*240,160*160和其他最大的虚拟屏幕可达4M在256色模式下,最大的虚拟屏幕分辨率:4096*1024,2048*2048,1024*4096和其它TFT LCD屏:----支持1,2,4,8BPP调色板显示模式----支持64K(16BPP),64M(24BPP)色非调色板模式----支持多种屏幕分辨率:典型的应用:640*480,320*240,160*160和其他最大的虚拟屏幕可达4M在64K色模式下,最大屏幕分辨率:2048*1024通用特征:LCD控制器有一个专用的DMA,用来从位于系统存储器中的视频缓冲区取得图像数据,它的特征也包括如下所示:----专用的中断功能((INT_FrSyn and INT_FiCnt)----系统存储器被用作显示存储器----支持多种的虚拟显示屏(支持硬件水平/垂直滚屏)----可编程的时序控制,用于不同的LCD----支持大端,小端模式,也支持WinCE数据格式----支持2种型号的SEC TFT LCD屏(SAMSUNG 3.5” Portrait / 256K Color /Reflective and Transflective a-Si TFT LCD) LTS350Q1-PD1: TFT LCD panel with touch panel and front light unit (Reflective type) LTS350Q1-PD2: TFT LCD panel onlyLTS350Q1-PE1: TFT LCD panel with touch panel and front light unit (Transflective type)LTS350Q1-PE2: TFT LCD panel onlyNOTE: WinCE不支持12位的数据封装格式请检查WinCE是否可以支持12位的彩色模式外部接口信号:LCD控制器方块图:S3C2440 LCD控制器被用来传送视频数据和生成必要的控制信号,比如VFRAME, VLINE, VCLK, VM, 等等。
六 ARM9(S3C2440)的LCD显示-理论知识

六ARM9(S3C2440)的LCD 显示-理论知识
今天和大家一起讨论一下S3C2440 的LCD 显示的问题,希望大家能够多多指教,我说的不对的地方希望大家及时帮我改正,以使我可以增长知识,才
能不至于给别人的学习带来不便,呵呵下面先看一下我从别人那转过来的一篇
文章,我觉得很有用,看完之后我再说一下自己对这一块的了解,也可以先看
看我的理解(下面红字标出)再看开始的这篇文章,因为我说的更通俗,
O(∩_∩)O 哈哈~。
1. LCD 工作的硬件需求:
要使一块LCD 正常的显示文字或图像,不仅需要LCD 驱动器,而且还需要
相应的LCD 控制器。
在通常情况下,生产厂商把LCD 驱动器会以COF/COG 的形式与LCD 玻璃基板制作在一起,而LCD 控制器则是由外部的电路来实现,现在很多的MCU 内部都集成了LCD 控制器,如S 3C2410/2440 等。
通过LCD 控制器就可以产生LCD 驱动器所需要的控制信号来控制STN/TFT 屏了。
2. S3C2440 内部LCD 控制器结构图:
我们根据数据手册来描述一下这个集成在S3C2440 内部的LCD 控制器:
a:LCD 控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS 寄存器组成;
b:REGBANK 由17 个可编程的寄存器组和一块256*16 的调色板内存组成,它们用来配置LCD 控制器的;
c:LCDCDMA 是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD 驱动器,通过使用这个DMA 通道,视频数据在不需要CPU 的干预。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s3c2440的LCD字符显示在上一篇文章中,我们详细介绍了如何驱动LCD,对于在LCD屏上呈现各种简单的图形已经不是一件高不可攀的难事。
但如何绘制字符呢?其实每一字符就是一幅图像,字符的大小对应于图像的大小,字符的笔画对应于图像的内容。
那么如何把字符转换为图像呢?简单的方法是使用“字模提取”之类的软件,它能够把任意的字符转换为一个字节型的数组,数组元素中的每一位代表LCD上的一个像素点,当为1时,表示该位置为字符的一个笔画,需要上色,而为0时,表示不是笔画,不需要上色。
例如,一个字符想要在16×16的面积上显示,即该字符的宽和高各为16个像素,因为每一个像素用一位来表示,因此用字模提取软件生成的字节型数组,一共有16×16÷8=32个字节。
在字模提取的过程中,还要注意取模的顺序,顺序不同,得到的数组就不同,一般来说是从字符的左上角开始,从左向右,从上到下取模,这样程序编写上会方便一些。
相同字体大小的中文字符和ASCII码字符的宽度还有所不同,一般ASCII码字符的宽度是中文字符宽度的一半,所以显示中文字符的程序和显示ASCII码字符的程序还略有不同。
当把一个字符取模变成一个数组后,只要对该数组中每个元素的每一位依次进行判断,对值为1的位和值为0的位进行不同的上色处理,即可完成一个字符的绘制。
下面的程序给出了一个简单的显示中文字符和ASCII字符的例子,我是用PCtoLCD这款软件来提取程序中想要显示的字符的。
#define U32 unsigned int#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits#define rGPCCON (*(volatile unsigned *)0x56000020) //Port C control#define rGPCDAT (*(volatile unsigned *)0x56000024) //Port C data#define rGPCUP (*(volatile unsigned *)0x56000028) //Pull-up control C#define rGPDCON (*(volatile unsigned *)0x56000030) //Port D control#define rGPDDAT (*(volatile unsigned *)0x56000034) //Port D data#define rGPDUP (*(volatile unsigned *)0x56000038) //Pull-up control D#define rGPGCON (*(volatile unsigned *)0x56000060) //Port G control#define rGPGDAT (*(volatile unsigned *)0x56000064) //Port G data#define rGPGUP (*(volatile unsigned *)0x56000068) //Pull-up control G#define rLCDCON1 (*(volatile unsigned *)0x4d000000) //LCD control 1#define rLCDCON2 (*(volatile unsigned *)0x4d000004) //LCD control 2#define rLCDCON3 (*(volatile unsigned *)0x4d000008) //LCD control 3#define rLCDCON4 (*(volatile unsigned *)0x4d00000c) //LCD control 4#define rLCDCON5 (*(volatile unsigned *)0x4d000010) //LCD control 5#define rLCDSADDR1 (*(volatile unsigned *)0x4d000014) //STN/TFT Frame buffer start address 1#define rLCDSADDR2 (*(volatile unsigned *)0x4d000018) //STN/TFT Frame buffer start address 2#define rLCDSADDR3 (*(volatile unsigned *)0x4d00001c) //STN/TFT Virtual screen address set#define rLCDINTMSK (*(volatile unsigned *)0x4d00005c) //LCD Interrupt mask#define rTCONSEL (*(volatile unsigned *)0x4d000060) //LPC3600 Control --- edited by junon#define LCD_WIDTH 320#define LCD_HEIGHT 240#define VSPW (3-1)#define VBPD (15-1)#define VFPD (12-1)#define HSPW (30-1)#define HBPD (38-1)#define HFPD (20-1)#define LINEVAL (LCD_HEIGHT-1) #define HOZV AL (LCD_WIDTH-1)//for LCDCON1#define CLKVAL_TFT 6#define MV AL_USED 0#define PNRMODE_TFT 3#define BPPMODE_TFT 13//#define VIDEO_OUT 0//for LCDCON5#define BPP24BL 0#define INVVCLK 0#define INVVLINE 1#define INVVFRAME 1#define INVVD 0#define INVVDEN 0#define PWREN 1#define BSWP 0#define HWSWP 0volatile U32 LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];unsigned char zhao[]= //赵{0x08, 0x00, 0x08, 0x00, 0x08, 0x04, 0x7E, 0x84, 0x08, 0x48, 0x08, 0x28, 0xFF, 0x10, 0x08, 0x10,0x28, 0x28, 0x2F, 0x28, 0x28, 0x44, 0x28, 0x84, 0x58, 0x00, 0x48, 0x00, 0x87, 0xFE, 0x00, 0x00};unsigned char chun[]= //春{0x01, 0x00, 0x01, 0x00, 0x3F, 0xFC, 0x01, 0x00, 0x1F, 0xF8, 0x02, 0x00, 0xFF, 0xFE, 0x04, 0x20,0x08, 0x18, 0x3F, 0xEE, 0xC8, 0x24, 0x0F, 0xE0, 0x08, 0x20, 0x08, 0x20, 0x0F, 0xE0, 0x00, 0x00};unsigned char jiang[]= //江{0x20, 0x00, 0x10, 0x00, 0x13, 0xFC, 0x00, 0x40, 0x88, 0x40, 0x48, 0x40, 0x50, 0x40, 0x10, 0x40,0x10, 0x40, 0x20, 0x40, 0xE0, 0x40, 0x20, 0x40, 0x20, 0x40, 0x2F, 0xFE, 0x20, 0x00, 0x00, 0x00,};unsigned char ASCII_A[]= //A{0x00, 0x00, 0x00, 0x10, 010, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00};unsigned char ASCII_R[]= //R{0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00};unsigned char ASCII_M[]= //M{0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00};//绘制背景void Brush_Background( U32 c){int x,y ;for( y = 0 ; y < LCD_HEIGHT ; y++ ){for( x = 0 ; x < LCD_WIDTH ; x++ ){LCD_BUFFER[y][x] = c ;}}}//绘制像素点void PutPixel(U32 x,U32 y, U32 c ){LCD_BUFFER[y][x] = c;}//绘制大小为16×16的中文字符void Draw_Text16(U32 x,U32 y,U32 color,const unsigned char ch[]) {unsigned short int i,j;unsigned char mask,buffer;for(i=0;i<16;i++){mask=0x80; //掩码buffer=ch[i*2]; //提取一行的第一个字节for(j=0;j<8;j++){if(buffer&mask){PutPixel(x+j,y+i,color); //为笔画上色}mask=mask>>1;}mask=0x80; //掩码buffer=ch[i*2+1]; //提取一行的第二个字节for(j=0;j<8;j++){if(buffer&mask){PutPixel(x+j+8,y+i,color); //为笔画上色}mask=mask>>1;}}}//绘制大小为8×16的ASCII码void Draw_ASCII(U32 x,U32 y,U32 color,const unsigned char ch[]) {unsigned short int i,j;unsigned char mask,buffer;for(i=0;i<16;i++){mask=0x80;buffer=ch[i];for(j=0;j<8;j++){if(buffer&mask){PutPixel(x+j,y+i,color);}mask=mask>>1;}}}//LCD初始化void LCD_Init(){rGPCUP = 0x00000000;rGPCCON = 0xaaaa02a9;rGPDUP = 0x00000000;rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]rLCDCON1=(CLKV AL_TFT<<8)|(MV AL_USED<<7)|(PNRMODE_TFT<<5)|(BPPMODE_TF T<<1)|0;rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);rLCDCON3=(HBPD<<19)|(HOZV AL<<8)|(HFPD);rLCDCON4=(HSPW);rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3) |(BSWP<<1) | (HWSWP);rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(LCD_WIDTH*LCD_HEIGHT*4))>>1 );rLCDSADDR3=LCD_WIDTH*4/2;rLCDINTMSK|=(3); // MASK LCD Sub InterruptrTCONSEL = 0; // Disable LPC3480rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disablerGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWRENrGPGDAT = rGPGDAT | (1<<4) ;rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3); // PWRENrLCDCON5=rLCDCON5&(~(1<<5))|(0<<5); // INVPWREN}void Main(void){LCD_Init();rLCDCON1|=1; //开启LCD显示Brush_Background(0xFFFFFF); //绘制白色背景//绘制黑色字符Draw_Text16(50,100,0x0,zhao);Draw_Text16(66,100,0x0,chun);Draw_Text16(82,100,0x0,jiang);Draw_ASCII(50,120,0x0,ASCII_A);Draw_ASCII(58,120,0x0,ASCII_R);Draw_ASCII(66,120,0x0,ASCII_M);while(1){;}}看了上面的程序,有人可能会问,如果要在程序中显示大量的中文字符,是不是要把这些字符都取模啊?回答是肯定的,但前人已经为我们完成了这一步,做成了数据库,并且进行了编码,只要按照编码规则调用该库文件,就可以检索到相要的字符。