📄 lcddisp.c
字号:
/* File:LCDDISP.C
* 功能:使用硬件SPI接口输出LCD显示。
****************************************************************************/
#include "option.h"
#include "..\inc\def.h"
#include "44b.h"
#include "44blib.h"
#include "clcd.h"
#include "picturemap.h"
U32 frameBuffer[76800];
typedef unsigned long uint32;
typedef unsigned char uint8;
typedef unsigned short uint16;
#define WIDTH 640
#define HIGHT 480
void delay(unsigned long dly);
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<500000; i++);
}
/****************************************************************************
* 名称:LCDIni()
****************************************************************************/
void LCDIni()
{
unsigned long int LINEBLANK=12;
unsigned long int HOZVAL=WIDTH*3/8-1;
unsigned long int LINEVAL=HIGHT-1;
unsigned long int MODESEL=3; //color mode
unsigned long int LCDBANK=(unsigned long int)(& frameBuffer)>>22;
unsigned long int LCDBASEU=((unsigned long int)(& frameBuffer)>>1)&0x1fffff;
unsigned long int BSWP=0;
unsigned long int MVAL=0;
unsigned long int OFFSIZE=0;
unsigned long int PAGEWIDTH=WIDTH*8/16;
unsigned long int LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1);
unsigned short int CLKVAL=2;
unsigned short int WLH=0;
unsigned short int WDLY=0;
unsigned short int MMODE=0;
unsigned short int DISMODE=2;
unsigned short int INVCLK=0;
unsigned short int INVLINE=0;
unsigned short int INFRAME=0;
unsigned short int INVVD=0;
unsigned short int ENVID=0;
//frameBuffer=(U32 (*)[120])malloc(76800+16); //480x640
// rNCACHBE0=( ( ( ((unsigned)0xc500000+76800+16)>>12 )+1 ) <<16)|((unsigned)0xc500000>>12);
// 管脚功能设置
rPCONC&=0xfffcffff;
rPCONC|=0x1ff<<8;
rPCOND&=0xffff0000;
rPCOND|=0xaaaa; //set lcd pin
rPDATC&=~(1<<8);
rLCDCON1=0x2c440;
// rLCDCON1=ENVID|(INVVD<1)|(INFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
rLCDCON2=LINEVAL|(HOZVAL<<10)|(LINEBLANK<<21);
rLCDCON3=0;
// rLCDSADDR1= (3<<27)|( ((unsigned int )&frameBuffer>>22)<<21 );
rLCDSADDR1=LCDBASEU|(LCDBANK<<21)|(MODESEL<<27);
rLCDSADDR2=(BSWP<<29)|(MVAL<<21)|LCDBASEL;
rLCDSADDR3=PAGEWIDTH|(OFFSIZE<<9);
rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
rDITHMODE=0x0;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
ENVID=1;
//rLCDCON1=0x3c441;
rLCDCON1=ENVID|(INVVD<1)|(INFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
//
}
void clrscr(){
int i;
for(i=0;i<WIDTH*HIGHT;i++)
frameBuffer[i]=0x0;
}
void Lcd_PutPixel(int x,int y,U8 rgb)
{
char *p =(char * )frameBuffer;
if(rgb==RED)
*(p+y*WIDTH+x)=0xe0;
if(rgb==GREEN)
*(p+y*WIDTH+x)=0x1c;
if(rgb==BLUE)
*(p+y*WIDTH+x)=0x3;
if(rgb==NOCOLOR)
*(p+y*WIDTH+x)=0x5a;
}
PutPixel(int x,int y,U8 rgb)
{
Lcd_PutPixel(x,y,rgb);
}
void DrawRectangle(U16 StartX,U16 StartY,U16 EndX, U16 EndY, U16 Clr)
{
int i,j;
for(i=StartX;i<EndX;i++)
for(j=StartY;j<EndY;j++)
Lcd_PutPixel(i,j,Clr);
}
void DrawXY(U16 StartX,U16 StartY,U16 EndX, U16 EndY, U16 Clr)
{
int i,j;
float k=(float)(EndY-StartY)/(float)(EndX-StartX);
for(i=StartX;i<=EndX;i++)
Lcd_PutPixel(i,StartY+(int)(k*(float)i),Clr);
}
void displaypicture(int startx,int starty,int index,int Clr )
{
int i,j,k,temp1,temp2;
char *p=(char *)frameBuffer;
// linex(0,0,20);
for(i=0;i<64;i++)
for(j=0;j<16;j++)
{
temp1 =picture[index][i][j];
for(k=0;k<8;k++)
if((temp1&(0x1<<(7-k)))!=0)
Lcd_PutPixel(starty+ j*8+k, startx+i,RED);
else
Lcd_PutPixel(starty+j*8+k, startx+i,NOCOLOR);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -