📄 lcm.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 + -