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

📄 lcm.c

📁 这是一个uC/OS的系统驱动程序
💻 C
字号:
#include <includes.h>

void SpiInilize();                                            //  SPI初始化,设置时序波形、工作模式等
void SpiSendByte(unsigned int msg);                           //  向SPI发送字节
void ST7920Initlize();                                        //  ST7920初始化,参考st7920手册
void ST7920WriteByte( unsigned char type, unsigned int msg);  //  按照st7920串口时序向st7920发送字节数据/命令
void ST7920WriteString( unsigned char* string);               //  按照st7920串口时序向st7920发送字符串数据
void ST7920WriteChinese( unsigned int msg);                   //  按照st7920串口时序向st7920发送单个汉字
void ST7920SetLocation( unsigned int x, unsigned int y);      //  按照st7920串口时序向st7920发送位置信息
void ST7920LcmClear();                                        //  清屏


void  TaskLcm(void *p_arg)
{
  ST7920Initlize();

  while(1)
  {
    ST7920SetLocation(0,0);
    ST7920WriteString("基于ARM7硬件平台");

    ST7920SetLocation(1,0);
    ST7920WriteString("uC/OS 多任务,");

    ST7920SetLocation(2,0);
    ST7920WriteString("综合试验演示.");

    ST7920SetLocation(3,0);
    ST7920WriteString("WWW.ZZULI.EDU.CN");

    OSTimeDlyHMSM(0, 0, 10, 0);

    ST7920LcmClear();
  }

}


void SpiInilize()
{
  //  使能SPI时钟
  AT91F_SPI_CfgPMC();

  //  使能PIO时钟
  AT91F_PIOA_CfgPMC();

  //  复位SPI()
  AT91F_SPI_Reset(AT91C_BASE_SPI);

  //  程序控制KMX12864片选(注意此处,若直接采用SPI控制片选,液晶屏不显示数据)
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PA11_CS);

  //  为SPI0分配引脚
  AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA13_MOSI|AT91C_PA14_SPCK, 0);

  //  设置SPI主模式
  AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MODE_MR);

  //  设置SPI0工作模式
  AT91F_SPI_CfgCs(AT91C_BASE_SPI, AT91C_SPI_CS0, AT91C_SPI_MODE_CS0);

  //  允许SPI口
  AT91F_SPI_Enable(AT91C_BASE_SPI);

  //  禁止使能KMX12864
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PA11_CS);
}


void SpiSendByte(unsigned int msg)
{
  //  使能KMX12864 -- 一个命令字或数据字开始
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PA11_CS);

  AT91C_BASE_SPI->SPI_TDR = msg;
  while(!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){;}

  //  禁止使能KMX12864 -- 一个命令字或数据字结束
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PA11_CS);
  //  这个延时是必须的,保证ST7920能够正常处理
  OSTimeDlyHMSM(0, 0, 0, 10);
}

//  参考ST7920手册中《初始化》部分
void ST7920Initlize()
{
  SpiInilize();

  OSTimeDlyHMSM(0, 0, 0, 2);                                  //  Wait time > 40ms
  ST7920WriteByte(MSG_TYPE_COMM, ST7920_COMMAND_TYPE_BASIC);

  OSTimeDlyHMSM(0, 0, 0, 2);                                  //  Wait time > 100us
  ST7920WriteByte(MSG_TYPE_COMM, ST7920_COMMAND_TYPE_BASIC);

  OSTimeDlyHMSM(0, 0, 0, 2);                                  //  Wait time > 37us
  ST7920WriteByte(MSG_TYPE_COMM, ST7920_COMMAND_DISPLAY_ON);

  OSTimeDlyHMSM(0, 0, 0, 2);                                  //  Wait time > 100us
  ST7920WriteByte(MSG_TYPE_COMM, ST7920_COMMAND_CLEAR);

  OSTimeDlyHMSM(0, 0, 0, 2);                                  //  Wait time > 100us
  ST7920WriteByte(MSG_TYPE_COMM, ST7920_COMMAND_ENTRY_MODE);

  OSTimeDlyHMSM(0, 0, 0, 10);

}

//  参考ST7920手册《串行通讯时序》部分
void ST7920WriteByte( unsigned char type, unsigned int msg)
{
  SpiSendByte(0xF8|type<<1);    // 11111 + RW + RS + 0;  RS = 0:命令字 ;RS  = 1:数据字
  SpiSendByte(msg&0xF0);        //写数据的高4位
  SpiSendByte((msg&0x0F)<<4);   //写数据的低4位
}

void ST7920SetLocation( unsigned int x, unsigned int y)
{
  unsigned int address;

  if (x == 0) address = ST7920_DDRAM_ROW1 + y;
  else if (x == 1) address = ST7920_DDRAM_ROW2 + y;
  else if (x == 2) address = ST7920_DDRAM_ROW3 + y;
  else if (x == 3) address = ST7920_DDRAM_ROW4 + y;

  ST7920WriteByte(MSG_TYPE_COMM, address);
}


void ST7920WriteString( unsigned char* string)
{
  while(*string)
  {
    ST7920WriteByte(MSG_TYPE_DATA,*string);
    string++;
  }
}

void ST7920WriteChinese(unsigned int msg)
{

  ST7920WriteByte(MSG_TYPE_DATA,((0xFF00&msg)>>8));
  ST7920WriteByte(MSG_TYPE_DATA,((0xFF&msg)));
}

void ST7920LcmClear()
{
  ST7920WriteByte(MSG_TYPE_COMM, ST7920_COMMAND_CLEAR);
  OSTimeDlyHMSM(0, 0, 0, 2);
}




⌨️ 快捷键说明

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