📄 gt21lspi51.c
字号:
#include "reg51.h"
#include "intrins.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
sbit CS=P1^6; //片选
sbit SO=P1^3; //数据输出
sbit SI=P1^4; //数据输入
sbit SCK=P1^2; //时钟
void get_font_matrix(unsigned char msb , unsigned char lsb);
/********************************************************************/
/* 模块名称:模拟GT21L SPI接口参考程序 */
/* 文 件 名:模拟GT21L SPI接口参考程序.c */
/* 参考文档:无 */
/* 作 者: */
/* 版 本:V */
/* 日 期: */
/* 注 释:张海峰 */
/* 日 期:2007-04-04 */
/* 修改记录:无 */
/* 说 明:需要用户根据自己的MCU和I/O使用状况自己配置 */
/********************************************************************/
#define SPID_DO SO
#define SPICS_H() CS = 1
#define SPICS_L() CS = 0
#define SPICLK_H() SCK = 1
#define SPICLK_L() SCK = 0
#define SPID_H() SI =1
#define SPID_L() SI = 0
//by zhanghf
//全局变量用于读取快速读取汉字,以读取15*16点阵汉字为例
//请用户根据实际情况自行修改数组长度
unsigned char upperfont_32[32];
/********************************************************************/
/* 函数名称:void Send_Byte(unsigned char out) */
/* 函数功能:向GT21L系列芯片送一个字节数据 */
/* 参 数:out 向GT21L系列芯片送的一个字节数据值 */
/* 全局变量:无 */
/* 返 回 值:无 */
/* 调用前提:无 */
/* 副 作 用:无 */
/* 作 者: */
/* 日 期: */
/* 注 释:张海峰 */
/* 日 期:2007-04-04 */
/* 修改记录:无 */
/* 说 明:注意字节数据的输出顺序是先高位后低位,CLK信号是下降沿 */
/********************************************************************/
void Send_Byte(unsigned char out)
{
unsigned char i=0;
for (i = 0; i < 8; i++)
{
if ((out & 0x80) == 0x80) // check if MSB is high
SPID_H();
else
SPID_L(); // if not, set to low
SPICLK_L(); // toggle clock low
out = (out << 1); // shift 1 place for next bit
SPICLK_H(); // toggle clock high
}
}
/********************************************************************/
/* 函数名称:unsigned char Get_Byte() */
/* 函数功能:从GT21L系列芯片得到一个字节数据 */
/* 参 数:无 */
/* 全局变量:无 */
/* 返 回 值:从GT21L系列芯片得到的一个字节数据 */
/* 调用前提:无 */
/* 副 作 用:无 */
/* 作 者: */
/* 日 期: */
/* 注 释:张海峰 */
/* 日 期:2007-04-04 */
/* 修改记录:无 */
/* 说 明:需要用户根据自己的MCU和I/O使用状况自己 */
/* 配置SI(串行数据输入) */
/********************************************************************/
unsigned char Get_Byte()
{
unsigned char i = 0, in = 0, temp = 0;
for (i = 0; i < 8; i++)
{
SPICLK_L(); // toggle clock high
in = (in << 1); // shift 1 place to the left or shift in 0
SPICLK_H(); // toggle clock high
// by zhanghf
temp = SPID_DO; // 需要用户根据自己的MCU和I/O使用状况自己配置SI(串行数据输入)
if (temp == 1) // check to see if bit is high
in = in | 0x01; // if high, make bit high
}
return in;
}
/********************************************************************/
/* 函数名称:void HighSpeed_Read_Cont(unsigned long Dst, */
/* unsigned long no_bytes) */
/* 函数功能:快速从GT21L系列芯片读出所要的汉字点阵数据 */
/* 存于数组upperfont_32中 */
/* 参 数:Dst :数据在GT21L系列芯片中的地址 */
/* no_bytes :从GT21L芯片读出所要的汉字点阵数据的个数 */
/* 全局变量:upperfont_32[32]:用于快速读取汉字点阵数据 */
/* 返 回 值:无 */
/* 调用前提:无 */
/* 副 作 用:无 */
/* 作 者: */
/* 日 期: */
/* 注 释:张海峰 */
/* 日 期:2007-04-04 */
/* 修改记录:无 */
/* 说 明:由于用于快速读取汉字点阵数据的upperfont_32[32]全局变量*/
/* 为32字节,请用户根据实际情况自行修改数组长度 */
/********************************************************************/
void HighSpeed_Read_Cont(unsigned long Dst, unsigned long no_bytes)
{
unsigned long i = 0;
SPICS_L(); // enable device
Send_Byte(0x0B); // read command
Send_Byte(((Dst & 0xFFFFFF) >> 16)); // send 3 address bytes
Send_Byte(((Dst & 0xFFFF) >> 8));
Send_Byte(Dst & 0xFF);
Send_Byte(0xFF); //dummy byte
for (i = 0; i < no_bytes; i++) // read until no_bytes is reached
{
upperfont_32[i] = Get_Byte(); // receive byte and store at address 80H - FFH
}
SPICS_H(); // disable device
}
/********************************************************************/
/* 函数名称:void main() */
/* 函数功能:主程序 */
/* 参 数:无 */
/* 全局变量:无 */
/* 返 回 值:无 */
/* 调用前提:无 */
/* 副 作 用:无 */
/* 作 者: */
/* 日 期: */
/* 注 释:张海峰 */
/* 日 期:2007-04-04 */
/* 修改记录:无 */
/* 说 明:演示调用HighSpeed_Read_Cont子程序 */
/********************************************************************/
void main()
{
unsigned long addr;
addr = 0x20000;
HighSpeed_Read_Cont(addr,32);
get_font_matrix(0xb0,0xa1)
// 可以对全局变量upperfont_32[]该汉字进行处理了;
}
void get_font_matrix(unsigned char msb , unsigned char lsb)
{
//by zhanghf
//字库起始地址,可以在GT21L系列芯片的数据手册中查到,请用户根据实际情况自行修改
#define BASEADDR (0x0000)
unsigned long addr = BASEADDR;
//by zhanghf
//根据汉字内码算地址的公式,可以在GT21L系列芯片的数据手册中查到,请用户根据实际情况自行修改
if(msb>=0xa1 && msb<=0xab&&lsb>=0xa1)
addr= ((((unsigned long)msb)-0xa1)*94+(((unsigned long)lsb)-0xa1))*32+((unsigned long)BASEADDR);
else if(msb>=0xb0 && msb<=0xf7&&lsb>=0xa1)
addr= ((((unsigned long)msb)-0xb0)*94+(((unsigned long)lsb)-0xa1)+846)*32+((unsigned long)BASEADDR);
HighSpeed_Read_Cont(addr,32);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -