⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 platform.c

📁 本代码包含已经移植好的UCGUI代码,控制器是S3C44B0,通过UCGUI,在LCD上图片显示.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdarg.h>
#include <string.h>
#include "inc\44b.h"
#include "inc\platform.h"
#include "inc\common.h"

extern int printf();

void Timer_Start(int divider) //0:16us,1:32us 2:64us 3:128us
{
rWTCON=((MCLK/1000000-1)<<8)|(divider<<3);
rWTDAT=0xffff;
rWTCNT=0xffff;
// 1/16/(65+1),nRESET & interrupt disable
rWTCON=((MCLK/1000000-1)<<8)|(divider<<3)|(1<<5);
}

int Timer_Stop(void)
{
// int i;
rWTCON=((MCLK/1000000-1)<<8);
return (0xffff-rWTCNT);
}

void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
  rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;
}

void Reset()
{
  typedef (*FUNC)(void);
  FUNC fp;
  fp=(FUNC)0x0;
  fp();
}

void Delay(int time)
{
  static int DelayLoopCount = 400;
  int i,adjust=0;
  if(time==0)
  {
    time=200;
    adjust=1;
    DelayLoopCount=400;
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
    rWTDAT=0xffff;    rWTCNT=0xffff;   
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
  }
  for(;time>0;time--)
    for(i=0;i<DelayLoopCount;i++);
  if(adjust==1)
  {
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
    i=0xffff-rWTCNT;
    DelayLoopCount=8000000/(i*64);
  }
}

//***************************************************************************
#define MVAL_USED (0)  
#define MVAL    (13)    
#define INVCLK    (0) 
#define INVFRAME  (0) 
#define INVLINE   (0)   
#define CLKVAL_SL (8)   //VCLK=MCLK/(CLKVAL*2)    (CLKVAL >= 2)
#define M5D(n) ((n) & 0x1fffff)
unsigned char Bmp[9600];    

void LcdInit(void)
{
  int i;
  for (i=0;i<sizeof(Bmp);i++) Bmp[i]=0xF0;
  rPCOND=0xaaaa;
  rLCDCON1=(2)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
    //下降沿装载视频数据,禁止视频输出,LCD FIFO清空;行、帧信号取反;
    //4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
  rLCDCON2=(239)|(79<<10)|(10<<21);
    //垂直点数为240,水平点数320=(80字),LINEBLANK=10
  rLCDSADDR1= (0x0<<27) | ( ((uint)Bmp>>22)<<21 ) | M5D((uint)Bmp>>1);
    // 黑白模式, LCDBANK, LCDBASEU
  rLCDSADDR2= (1<<29) | (M5D((uint)Bmp + ((320/8)*(240)))>>1) | (MVAL<<21);
  rLCDSADDR3= (320/16) | ( 0<<9 );   
  rLCDCON1=(3)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
}

void PortInit(void)
{
  //  PORT A GROUP
  /*  BIT   9   8   7   6   5   4   3   2   1   0 */
  /*  A24   A23 A22 A21 A20 A19 A18 A17 A16 A0  */        
  /*  0   1 1 1 1 1 1 1 1 1 */
  rPCONA = 0x0ff; 
  rPDATA = 0x0ff;

  // PORT B GROUP
  /*  BIT 10  9   8   7   6   5   4   3   2   1   0   */
  /*  /CS5  /CS4  /CS3  /CS2  /CS1  nWBE3 nWBE2 /SRAS /SCAS SCLK  SCKE  */
  /*  EXT   NIC   USB   IDE   SMC   NC    NC    Sdram Sdram Sdram Sdram */
  /*      0,        0,   0,   0,    1,    0,       0,     1,    1,    1,   1          */
  rPDATB = 0x7ff;
  rPCONB = 0x7ff;

         //改动 by yang 2003.5
  //PORT C GROUP
  //BUSWIDTH=16                         */
  /*  PC15    14    13    12    11    10    9   8 */
  /*  o   o   RXD1  TXD1  o   o   o   o */
  /*  NC    NC    Uart1 Uart1 NC    NC    NC    NC  */
  /*   11   11    11    11    11    11    01    00  */

  /*  PC7   6   5   4   3   2   1   0 */
  /*   o    o   o   o   o   o   o   o */
  /*   NC   NC    NC    NC    SMCALE  SMCCLE  SMCCE SMCRB*/
  /*   01   01    01    01    01    01    01    01  */
  rPDATC = 0x0000;  //All IO is low
//  rPCONC = 0xfff45555;  
	 rPCONC = 0xfff45500; //ZhaoIC: configure pc0-pc3 as sw input
//  rPUPC  = 0xFC00;  //PULL UP RESISTOR should be enabled to I/O
 rPUPC  = 0xFC0F; //ZhaoIC: disable pull pu resistor

  //PORT D GROUP
  /*  PORT D GROUP(I/O OR LCD)                    */
  /*  BIT7    6   5   4   3   2   1   0 */
  /*      VF    VM    VLINE VCLK  VD3   VD2   VD1   VD0 */
  /*     01   01    01    01    01    01    01    01  */
  rPDATD= 0x55;
  rPCOND= 0xaaaa; 
  rPUPD = 0x00;
  //These pins must be set only after CPU's internal LCD controller is enable
///////////////////////////////////////////////////// 
  //PORT E GROUP 
  /*  Bit 8   7   6   5   4   3   2   1   0   */
  /*    ENDLAN  LED3  LED2  LED1  LED0  BEEP  RXD0  TXD0  CLKOUT  */ 
  /*      00    01    01    01    01    01    10    10    00    */
  rPDATE  = 0x157;
  rPCONE  = 0x5528; 
  rPUPE = 0xff;
  
 //PORT F GROUP
  /*  Bit8    7   6   5    4    3   2   1   0   */   
  /*  IISCLK  IISDI IISDO IISLRCK Input Input Input IICSDA  IICSCL  */
  /*  100   100   100   100   00    01    01    10    10    */
  rPDATF = 0x0;
  rPCONF = 0x24915a;
  rPUPF  = 0x1E3;

  //PORT G GROUP
  /*  BIT7    6   5   4   3   2   1   0  */
  /*  INT7    INT6    INT5    INT4    INT3    INT2    INT1    INT0  */
  /*    S3    S4    S5    S6    NIC   EXT   IDE   USB */
  /*      11      11      11      11      11      11      11      11       */
  rPDATG = 0xFF;
  rPCONG = 0xFFFF;
  rPUPG  = 0x00;  //should be enabled  

  rSPUCR=0x7;  //D15-D0 pull-up disable

  /*定义非Cache区*/
  rNCACHBE0 = 0xc0002000; 

  /*所有的外部硬件中断为低电平触发*/
  rEXTINT=0x0044;
}

void IsrInit(void)
{
  rINTCON=0x5;        //Non-vectored,IRQ enable,FIQ disable //
  rINTMOD=0x0;        //All=IRQ mode//
  rINTMSK=~(BIT_GLOBAL);  //Default value=0x7ffffff//
}

void Uart0Init(int mclk,int baud)
{
  if(mclk == 0) mclk = MCLK;

  rUFCON0 = 0x00;     //禁止使用FIFO
  rUMCON0 = 0x0;     //禁止使用FIFO
  rULCON0 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位
  rUCON0 = 0x245;    
   
  //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
  rUBRDIV0 = ( (int)(mclk/16./baud + 0.5) -1 );
  //UBRDIVn = ((int)(MCLK/16/baud + 0.5) -1)  波特率与系统主时钟计算公式
  Delay(1);   //延时若干个100us
}


void Uart1Init(int mclk,int baud)
{
  if(mclk == 0) mclk = MCLK;

  rUFCON1 = 0x0;     //禁止使用FIFO
  rUMCON1 = 0x0;     //禁止使用FIFO
  rULCON1 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位
  rUCON1 = 0x245;
   
  //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
  rUBRDIV1 = ( (int)(mclk/16./baud + 0.5) -1 );
  //UBRDIVn = ((int)(MCLK/16/baud + 0.5) -1)  波特率与系统主时钟计算公式
 Delay(1);   //延时若干个100us
}

static int whichUart=0;

void Uart_Init(int mclk,int baud)
{
    int i;
    if(mclk==0)
	mclk=MCLK;
    rUFCON0=0x0;     //FIFO disable
    rUFCON1=0x0;
    rUMCON0=0x0;
    rUMCON1=0x0;
//UART0
    rULCON0=0x3;     //Normal,No parity,1 stop,8 bit
    rUCON0=0x245;    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
    rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 ); 
   

//UART1
    rULCON1=0x3;
    rUCON1=0x245;
    rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );

    for(i=0;i<100;i++);
}

void Port_Init(void)
{
    //ADB V1.0 B/D Status
    //USB D12SUSPD 
    //    PC0
    //LED D0  D1  D2
    //	  PC1 PC2 PC3
    //KEY K0  K1  K2  K3
    //	  PG4 PG5 PG6 PG7

    //CAUTION:Follow the configuration order for setting the ports. 
    // 1) setting value 
    // 2) setting control register 
    // 3) configure pull-up resistor.  
	     
    //16bit data bus configuration  
    //PORT A GROUP
    //rPCONA[9:0]
    //|BIT9  |.......................................................|BIT0
    //|ADDR24|ADDR23|ADDR22|ADDR21|ADDR20|ADDR19|ADDR18|ADDR17|ADDR16|ADDR0		      
    //|     0|     1|	  1|     1|     1|     1|     1|	 1|     1|    1
    rPCONA=0x1ff;	

    //PORT B GROUP
    //rPCONB[10:0]
    //|BIT10|....................................................|BIT0
    //|nGCS5|nGCS4|nGCS3|nGCS2|nGCS1|nWBE3|nWBE2|nSRAS|nSCAS|SCLK|SCKE
    //|    1|    1|    1|	 1|    1|    1|    1|	 1|    1|   1|   1
    rPDATB=0x3ff;
    rPCONB=0x3ff;
    
    //PORT C GROUP
    //BUSWIDTH=16
    //PORT C GROUP
    //rPCONC[31:0]
    //|GPC15|....................................................................|    GPC0
    //|BIT31|....................................................................|    BIT0
    //|nCTS0|nRTS0|RXD1|TXD1|nCTS1|nRTS1|nEL|nDISP|  ADS7843I/O   |LED2|LED1|LED0|D12SUSPD
    //|   00|   00|  11|  11|   00|   00| 01|   01| 00| 01| 01| 00|  01|  01|  01|      01
    //rPUPC[15:0]
    //|    0|    0|   1|   1|    0|    0|  0|    0|  0|  0|  0|  0|   0|   0|   0|       0
    rPDATC=0xffff;	//All I/O Is High
    rPCONC=0x0f051455;	
    rPCONC|=(0xff<<8);
    rPUPC=0x3000;	//PULL UP RESISTOR should be enabled to I/O
     rPUPC|=(0xf<<4);

    //PORT D GROUP
    //rPCOND
    //| BIT15|.........................|BIT0 
    //|VFRAME|VM|VLINE|VCLK|VD3|VD2|VD1|VD0
    //|    10|00|   10|	 10| 10| 10| 10| 10  
    rPDATD=0xff;
    rPCOND= 0x8aaa;
     rPCOND|=(0xaaaa);	
	rPUPD = 0xbf;
	   rPUPD|=(0xff);
	//These pins must be set only after CPU's internal LCD controller is enable
	
	//rPCOND=0xaaaa;	
    //rPUPD=0xff;

    //PORT E GROUP
    //rPCONE
    //| BIT17 |..............................|BIT0
    //|CODECLK|PE7|PE6|BEEP|PE4|PE3|RXD0|TXD0| PE0
    //|     10| 00| 00|  01| 00| 00|  10|  10|  00
    //|rPUPE[7:0]
    //        |  0|  0|   0|  0|  0|   1|   1|   0
    rPDATE=0x1ff;  	//All I/O Is High
    rPCONE=0x20428;	//All NC is INPUT	
    rPUPE=0x06;	//PE8 do not have programmable pull-up resistor.  

    //PORT F GROUP
    //rPCONF[21:0]
    //| BIT21|....................................|  BIT0
    //|IISCLK|PF7|IISDO|IISLRCK|PF4|PF3|PF2|IICSDA|IICSCL
    //|   100|000|  100|    100| 00| 00| 00|    10|    10
    //rPUPF[8:0]
    //|     1|  0|    1|      1|  0|  0|  0|     1|     1
    rPDATF=0x1ff;	//All I/O Is High
    rPCONF=0x20900a;//All NC is INPUT
    rPUPF=0x163;

    //PORT G GROUP
    //rPCONG[15:0]
    //|BIT15|....................................|   BIT0
    //| KEY3|KEY2|KEY1|KEY0|EXINT3|EXINT2|NET_INT|USB_INT
    //|   11|  11|  11|  11|    11|    11|     11|     11
    rPDATG=0xff;
    rPCONG=0x00ff;	//KEY0~KEY3定义为I/O,采用查询方式
    			//rPCONG=0xffff,KEY0~KEY3定义为中断,	
    			
    rPUPG=0x0;		//should be enabled  
    
    rSPUCR=0x7; 	//D15-D0 pull-up disable
    
	rEXTINT=0x0;	//All EXTINT0-7 Low level interrupt
	
	//Define the Non_Cache area
	rNCACHBE0=(((Non_Cache_End)>>12)<<16)|((Non_Cache_Start)>>12); 
}
void Uart_Select(int ch)
{
    whichUart=ch;
}

char GetChar(uint8 ch)
{
    if(ch == 0)
    {     
    while(!(rUTRSTAT0 & 0x1));    //等待直到接受到一个数据
    return rURXH0;
    }
    else
    {
    while(!(rUTRSTAT1 & 0x1));    //等待直到接受到一个数据
    return  rURXH1;
    }
}
//***************************************************************************

/****************************************************************************
【功能说明】检查串行口是否收到字符并返回,ch为0从UART0收取,ch为1从UART1收取
****************************************************************************/
char GetKey(uint8 ch)
{
    if(ch == 0)
    {     
    if(rUTRSTAT0 & 0x1)   //如果收到字符就返回该字符
          return rURXH0;
    else  return 0;   //如果没有收到字符就返回0
    }
    else
    {
    if(rUTRSTAT1 & 0x1)   //如果收到字符就返回该字符
        return rURXH1;
    else  return 0;   //如果没有收到字符就返回0
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -