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

📄 amp506.c

📁 PS/2键盘源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************** (C) COPYRIGHT 2008 FUDANTIANXIN********************
* File Name          : AMP506.c
* Author             : 上海复旦天欣科教仪器有限公司 周春明 ZCM
* Version            : V1.0
* Date               : 11/5/2008
* Description        : FD-STM32-B实验箱:LCD(AM-320240N1TMQW-W0H)
********************************************************************************
* 接口:
*       使用STM32的FSMC的BANK1的第四部分,即外部地址为0X6C000000
*     A0接LCD的RS引脚,控制数据和命令
*******************************************************************************/
//#include "stm32f10x_lib.h"
#include "AMP506.h"
#include "AMP506_font.h"
#include "main.h"

/****************************************************************************
* 名    称:void AMP506_Initializtion()
* 功    能:初始化 AMP506 控制器
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:AMP506_Initializtion();
****************************************************************************/
void AMP506_Initializtion(void)
{

 /* 配置LCD的控制引脚 --------------------------------------------*/
  AMP506_CtrlLinesConfig();

/* 配置FSMC的并行接口 -------------------------------------*/
  AMP506_FSMCConfig();

  AMP506_Delay(100); 
/* Start Initial Sequence ----------------------------------------------------*/
  AMP506_Command_Write(R64, 0x12); /*[7:6]保留
                             [5] PLL control pins to select out frequency range
                                 0: 20MHz ~ 100MHz 1: 100MHz ~ 300MHz
                             [4:3] Reserved
                             [2:1] Output Driving Capability
                                 00: 4mA 01: 8mA 10: 12mA 11: 16mA
                             [0] Output slew rate
                                 0: Fast 1: Slow*/
  AMP506_Command_Write(R65, 0x01);  //Set PLL=40Mhz * (0x42) / (0x41)
  AMP506_Command_Write(R66, 0x01);  /*0x41 [7:6] Reserved [5:0] PLL Programmable
                              pre-divider, 6bit(1~63)
                              0x42 [7:6] Reserved [5:0] PLL Programmable loop
                              divider, 6bit(1~63)*/
  AMP506_Command_Write(R0,  0x00);//REG[0:7]为配置窗口大小 
  AMP506_Command_Write(R1,  0x00); 
  AMP506_Command_Write(R2,  0x01); 
  AMP506_Command_Write(R3,  0x3f); 
  AMP506_Command_Write(R4,  0x00); 
  AMP506_Command_Write(R5,  0x00); 
  AMP506_Command_Write(R6,  0x01); 
  AMP506_Command_Write(R7,  0xe0); 
  AMP506_Command_Write(R8,  0x01);   //REG[8:9]用来计算RAM的行地址
  AMP506_Command_Write(R9,  0x40); 
  AMP506_Command_Write(R10, 0x00);  //REG[10:12]为MEMERY写开始地址
  AMP506_Command_Write(R11, 0x00); 
  AMP506_Command_Write(R12, 0x00); 
  
  AMP506_Command_Write(R16, 0x0D); 
  AMP506_Command_Write(R17, 0x05); 
  AMP506_Command_Write(R18, 0x00); 
  AMP506_Command_Write(R19, 0x00); 
  AMP506_Command_Write(R20, 0x00);
  AMP506_Command_Write(R21, 0x10);
  AMP506_Command_Write(R22, 0x00);
  AMP506_Command_Write(R23, 0x38);
  AMP506_Command_Write(R24, 0x01);
  AMP506_Command_Write(R25, 0x40);
  AMP506_Command_Write(R26, 0x01);
  AMP506_Command_Write(R27, 0xB8);
  AMP506_Command_Write(R28, 0x00);
  AMP506_Command_Write(R29, 0x00);
  AMP506_Command_Write(R30, 0x00);
  AMP506_Command_Write(R31, 0x08);
  AMP506_Command_Write(R32, 0x00);
  AMP506_Command_Write(R33, 0x12);
  AMP506_Command_Write(R34, 0x00);
  AMP506_Command_Write(R35, 0xF0);
  AMP506_Command_Write(R36, 0x01);
  AMP506_Command_Write(R37, 0x09);
  AMP506_Command_Write(R38, 0x00);  //REG[38:40]为MEMERY读开始地址
  AMP506_Command_Write(R39, 0x00);
  AMP506_Command_Write(R40, 0x00);
  
  AMP506_Command_Write(R41, 0x01);
  
  AMP506_Command_Write(R45, 0x08);   //控制LCD的电源开或关
  
  AMP506_Command_Write(R48, 0x00);  //REG[48:49]为水平偏移地址
  AMP506_Command_Write(R49, 0x00);
  AMP506_Command_Write(R50, 0x00);  //REG[50:51]为垂直偏移地址
  AMP506_Command_Write(R51, 0x00);  
  AMP506_Command_Write(R52, 0x01);  //REG[52:53]为在MEMERY中的水平分辨率
  AMP506_Command_Write(R53, 0x40);
  AMP506_Command_Write(R54, 0x01);  //REG[54:55]为在MEMERY中的垂直分辨率
  AMP506_Command_Write(R55, 0xE0); 
}

/****************************************************************************
* 名    称:void AMP506_SetCursor(u16 x,u16 y)
* 功    能:设置屏幕座标
* 入口参数:x      行座标
*           y      列座标
* 出口参数:无
* 说    明:
* 调用方法:AMP506_SetCursor(10,10);
****************************************************************************/
void AMP506_SetCursor(u16 Xpos,u8 Ypos)
{
  if((Xpos<320)&(Ypos<240))
  {
    u32 MemeryAddr;
    MemeryAddr = Ypos*320+Xpos;
    AMP506_Command_Write(R10, (MemeryAddr>>16)&0x03);  //REG[10:12]为MEMERY写开始地址
    AMP506_Command_Write(R11, (MemeryAddr>>8)&0xff); 
    AMP506_Command_Write(R12, MemeryAddr); 
  }
}

/****************************************************************************
* 名    称:void AMP506_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)
* 功    能:设置窗口区域
* 入口参数:StartX     行起始座标
*           StartY     列起始座标
*           EndX       行结束座标
*           EndY       列结束座标
* 出口参数:无
* 说    明:
* 调用方法:AMP506_SetWindows(0,0,100,100);
****************************************************************************/
void AMP506_SetWindows(u16 S_X,u16 S_Y,u16 E_X,u16 E_Y)
{
  AMP506_80Mode_Command_SendAddress(0x00); //使用连续写的方式,配置了REG[0]~REG[7]
  AMP506_80Mode_Command_SendData((S_X)>>8);
  AMP506_80Mode_Command_SendData(S_X);
  AMP506_80Mode_Command_SendData((E_X-1)>>8);
  AMP506_80Mode_Command_SendData(E_X-1);
  AMP506_80Mode_Command_SendData(S_Y>>8);
  AMP506_80Mode_Command_SendData(S_Y);
  AMP506_80Mode_Command_SendData((E_Y-1)>>8);
  AMP506_80Mode_Command_SendData(E_Y-1);
}

/****************************************************************************
* 名    称:void AMP506_Clear(u16 dat)
* 功    能:将屏幕填充成指定的颜色,如清屏,则填充 0xffff
* 入口参数:dat      填充值
* 出口参数:无
* 说    明:
* 调用方法:AMP506_Clear(0xffff);
****************************************************************************/
void AMP506_Clear(u16 Dat16bit)
{
  u32 k,l;
  AMP506_SetWindows(0,0,320,240);  //设定显示区域
  AMP506_SetCursor(0,0);
  AMP506_80Mode_Command_SendAddress(0xc1); //_DisplayRAM_WriteEnable_
  for(k=0;k<240*2;k++)  //这里的*2是必须要写的,因为每行都是来回两趟。不写只能显示一半
  {
    for(l=0;l<320;l++)
    {
      AMP506_80Mode_16Bit_Memory_SendData(Dat16bit);  //为每个像素点填入颜色
    }
  }
  AMP506_80Mode_Command_SendAddress(0x80); // DisplayRAM_WriteDisable _
}

/****************************************************************************
* 名    称:u16 AMP506_GetPoint(u16 x,u16 y)
* 功    能:获取指定座标的颜色值
* 入口参数:x      行座标
*           y      列座标
* 出口参数:当前座标颜色值
* 说    明:
* 调用方法:i=AMP506_GetPoint(10,10);
****************************************************************************/
u16 AMP506_GetPoint(u16 x,u8 y)
{
  AMP506_SetCursor(x,y);
  return (0);
}

/****************************************************************************
* 名    称:void AMP506_SetPoint(u16 x,u16 y,u16 PointColor)
* 功    能:在指定座标画点
* 入口参数:x      行座标
*           y      列座标
*           point  点的颜色
* 出口参数:无
* 说    明:
* 调用方法:AMP506_SetPoint(10,10,0x0fe0);
****************************************************************************/
void AMP506_SetPoint(u16 x,u8 y,u16 PointColor)
{
  if ( (x>320)||(y>240) ) return;
  AMP506_SetCursor(x,y);

  // for(u8 i=0;i<2;i++)
   //{
   AMP506_80Mode_Command_SendAddress(0xc1); //_DisplayRAM_WriteEnable_
   AMP506_80Mode_16Bit_Memory_SendData(PointColor);
   AMP506_80Mode_Command_SendAddress(0x80); // DisplayRAM_WriteDisable _
   //}
}

/****************************************************************************
* 名    称:void AMP506_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic)
* 功    能:在指定座标范围显示一副图片
* 入口参数:StartX     行起始座标
*           StartY     列起始座标
*           EndX       行结束座标
*           EndY       列结束座标
            pic        图片头指针
* 出口参数:无
* 说    明:图片取模格式为水平扫描,16位颜色模式
* 调用方法:AMP506_DrawPicture(0,0,100,100,(u16*)demo);
****************************************************************************/
void AMP506_DrawPicture(u16 StartX,u8 StartY,u16 EndX,u8 EndY,uc8 *Dat8bit)
{
  u16  k,l,TempX,TempY;
  TempX=EndX-StartX;
  TempY=EndY-StartY;
  AMP506_SetWindows(StartX,StartY,EndX,EndY);
  AMP506_SetCursor(StartX,StartY);
  AMP506_80Mode_Command_SendAddress(0xc1); //_DisplayRAM_WriteEnable_
  for(k=0;k<TempY;k++)  
  {
    for(l=0;l<TempX;l++)
    {
      AMP506_80Mode_Command_SendData(*Dat8bit++); //送入高8位
      AMP506_80Mode_Command_SendData(*Dat8bit++); //送入低8位  //为每个像素点填入颜色
    }
  }
  AMP506_80Mode_Command_SendAddress(0x80); // DisplayRAM_WriteDisable _

}

/****************************************************************************
* 名    称:AMP506_DrawChar(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
* 功    能:在指定座标显示一个16x22点阵的ascii字符
* 入口参数:x          行座标
*           y          列座标
*           charColor  字符的颜色
*           bkColor    字符背景颜色
*           c          要显示的字符
* 出口参数:无
* 说    明:显示范围限定为可显示的ascii码
* 调用方法:AMP506_DrawChar(300, 200, Point ,0xffff ,0x0000);
****************************************************************************/
void AMP506_DrawChar(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
{
  u32 index = 0, i = 0;
  u16 Xaddress = 0;
  u8  Yaddress = 0;
  u8 j=0;
  u8 temp;
  Xaddress = Xpos;
  Yaddress = Ypos;
  
  for(index = 0; index <60; index++)
  {
    temp = c[index];
    for(i = 0; i < 8; i++)
    {
      if((temp & (1 << (7-i))) == 0x00)
      {
        for(j=0;j<4;j++)
        {
          AMP506_SetCursor(Xaddress, Yaddress);
          AMP506_80Mode_Command_SendAddress(0xc1); //开显示缓冲区的写使能
          AMP506_80Mode_16Bit_Memory_SendData(bkColor);
          AMP506_80Mode_Command_SendAddress(0x80); //关显示缓冲区的写使能
        }
      }
      else
      {
        for(j=0;j<4;j++)
        {
          AMP506_SetCursor(Xaddress, Yaddress);
          AMP506_80Mode_Command_SendAddress(0xc1); //开显示缓冲区的写使能
          AMP506_80Mode_16Bit_Memory_SendData(charColor);
          AMP506_80Mode_Command_SendAddress(0x80); //关显示缓冲区的写使能
        }
      }
     Xaddress++; 
    }
    if((Xaddress-Xpos) == 24)
    {
      Xaddress = Xpos;
      Yaddress = Yaddress+1;
    }
  }
}
/****************************************************************************
* 名    称:AMP506_DrawCharEn(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
* 功    能:在指定座标显示一个16x22点阵的ascii字符
* 入口参数:x          行座标
*           y          列座标
*           charColor  字符的颜色
*           bkColor    字符背景颜色
*           c          要显示的字符
* 出口参数:无
* 说    明:显示范围限定为可显示的ascii码
* 调用方法:AMP506_DrawCharEn(300, 200, Point ,0xffff ,0x0000);
****************************************************************************/
void AMP506_DrawCharEn(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
{
  u32 index = 0, i = 0;
  u16 Xaddress = 0;
  u8  Yaddress = 0;
  u8 j=0;
  u8 temp;
  Xaddress = Xpos;
  Yaddress = Ypos;
  
  for(index = 0; index <44; index++)
  {
    temp = c[index];
    for(i = 0; i < 8; i++)
    {
      if((temp & (1 << (7-i))) == 0x00)

⌨️ 快捷键说明

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