|
查资料时,有感于坛子里面关于这个片子的参考程序比较少,就用“最热门”的STM32做了个驱动,官方2.02库
直接贴代码了:
//Spi_Max7456.h
#include "stm32f10x_lib.h"
#include "stm32f10x_spi.h"
#define MAX7456_SPI SPI2//利用SPI2传输数据
#define MAX7456_SPICLK RCC_APB1Periph_SPI2 //spi2时钟
#define MAX7456_PCLK RCC_APB2Periph_GPIOB //spi数据与时钟控制口
#define MAX7456_SPI_PORT GPIOB
#define MAX7456_SCK GPIO_Pin_13
#define MAX7456_MOSI GPIO_Pin_15
#define MAX7546_CS GPIO_Pin_12
#define MAX7456_MISO GPIO_Pin_14
//MAX7456写寄存器
#define RADD1 0X80 //对于<0x10写地址,在读的时候要加0X80
#define VM0 0X00 //视频模式0寄存器
#define VM1 0X01 //视频模式1寄存器
#define HOS 0X02 //水平位置寄存器
#define VOS 0X03 //垂直位置寄存器
#define DMM 0X04 //显示存储器模式寄存器
#define DMAH 0X05 //显示存储器地址高位寄存器
#define DMAL 0X06 //显示存储器地址低位寄存器
#define DMDI 0X07 //显示存储器数据输入寄存器
#define CMM 0X08 //字符存储器模式寄存器
#define CMAH 0X09 //字符存储器地址高位寄存器
#define CMAL 0X0A //字符存储器地址低位寄存器
#define CMDI 0X0B //字符存储器数据输入寄存器
#define OSDM 0X0C //OSD插入复用寄存器
#define RB 0X10 //第N行亮度寄存器,0-13 0-15 根据不同制式 0X10+RB0-15
#define OSDBL_W_ADD 0X6C //OSD黑电平寄存器
#define OSDBL_R_ADD 0XEC //读寄存器地址
#define STAT 0XA0 //状态寄存器(只读) 实际上可以读任何一个0XA0-AF
#define DMDO 0XB0 //显示存储器输出寄存器(只读)
#define CMMO 0XC0 //字符存储器输出寄存器(只读)
void MAX7456_SYS_Init(void);
u8 MAX7456_Read_Reg(u8 add);
void MAX7456_Write_Char(u16 add,u8 chr);
void MAX7456_WriteAtt_Char(u16 add,u8 attribute);
void MAX7456_Write_Char_XY(u8 X,u8 Y,u8 chr);
void MAX7456_WriteAtt_XY(u8 X,u8 Y,u8 chr);
void MAX7456_Clear(void);
void MAX7456_Write_ASCII_Chr(u8 X,u8 Y,u8 chr);
void MAX7456_Write_ASCII_Char(u16 address, u8 c);
void MAX7456_Write_ASCII_String(u8 X,u8 Y,u8 *Str);
void Max7456_Learn_Char(u8 number, u8 *data);
void Max7456_Write_CustomChar(void);
void Max7456_Write_FileChar(void);
void Max7456_Display_AllChar(void);
void Max7456_Check_Custom(void);
//spi_max7456.c
#include "SPI_MAX7456.h"
#include "Chartar_Max7456.h"// 包含字库文件
#define MAX7456_CS_Low() GPIO_ResetBits(MAX7456_SPI_PORT, MAX7546_CS)
#define MAX7456_CS_Hight() GPIO_SetBits(MAX7456_SPI_PORT, MAX7546_CS)
#define MAX7456_StartSpi() MAX7456_CS_Low() //开始SPI
#define MAX7456_EndSpi() MAX7456_CS_Hight() //结束SPI
GPIO_InitTypeDef GPIO_InitStructure_MAX7456;//GPIO操作结构体
SPI_InitTypeDef SPI_InitStructure_MAX7456;//SPI结构体
//========================================================================
// 函数: void ZSBW_ARW_PORT_Init(void)
// 描述: 初始化操作端口和IO方向
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// First version
//========================================================================
void MAX7456_PORT_Init(void)
{
RCC_APB2PeriphClockCmd(MAX7456_PCLK,ENABLE);
RCC_APB1PeriphClockCmd(MAX7456_SPICLK,ENABLE);
//
GPIO_InitStructure_MAX7456.GPIO_Pin=MAX7456_SCK|MAX7456_MOSI|MAX7456_MISO;
GPIO_InitStructure_MAX7456.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure_MAX7456.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(MAX7456_SPI_PORT,&GPIO_InitStructure_MAX7456);
//
GPIO_InitStructure_MAX7456.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure_MAX7456.GPIO_Pin=MAX7546_CS;
GPIO_Init(MAX7456_SPI_PORT,&GPIO_InitStructure_MAX7456);
}
//========================================================================
// 函数: void ZSBW_ARW_PORT_Init(void)
// 描述: 初始化的SPI的相位,时钟等属性
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// First version
//========================================================================
void MAX7456_SPI_Init(void)
{
//
MAX7456_CS_Hight();
//
SPI_InitStructure_MAX7456.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure_MAX7456.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure_MAX7456.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;//max7456最高速率10M SPI最高时钟P/2=36M
SPI_InitStructure_MAX7456.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure_MAX7456.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure_MAX7456.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure_MAX7456.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure_MAX7456.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure_MAX7456.SPI_CRCPolynomial=7;
SPI_Init(MAX7456_SPI, &SPI_InitStructure_MAX7456);
//
SPI_Cmd(MAX7456_SPI,ENABLE);
}
//========================================================================
// 函数: void ZSBW_ARW_WriteByte(u8 Data)
// 描述: 写入一个字节的数据到
// 参数: 写入的字节
// 返回: 无
// 备注: 无
// 版本:
// First version
//========================================================================
u8 MAX7456_SPI_WriteByte(u8 Data)
{
/* Wait for SPI2 Tx buffer empty */
while (SPI_I2S_GetFlagStatus(MAX7456_SPI, SPI_I2S_FLAG_TXE) == RESET);
/* Send SPI2 data */
SPI_I2S_SendData(MAX7456_SPI, Data);
while (SPI_I2S_GetFlagStatus(MAX7456_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Read SPI2 received data */
Data = SPI_I2S_ReceiveData(MAX7456_SPI);
return Data;
}
//========================================================================
// 函数: void ZSBW_ARW_WriteByte(u8 Data)
// 描述: 从MAX7456读取一个字节
// 参数: 地址
// 返回: 无
// 备注: 无
// 版本:
// First version
//========================================================================
u8 MAX7456_SPI_ReadByte(void)
{
u8 Data=0;
/* Wait for SPI2 Tx buffer empty */
while (SPI_I2S_GetFlagStatus(MAX7456_SPI, SPI_I2S_FLAG_TXE) == RESET);
/* Send SPI2 data */
SPI_I2S_SendData(MAX7456_SPI, Data);
while (SPI_I2S_GetFlagStatus(MAX7456_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Read SPI2 received data */
Data = SPI_I2S_ReceiveData(MAX7456_SPI);
return Data;
}
//延时函数
void MAX7456_Delay_uS(void)
{
u8 i=100; //
while(i)
{
i--;
}
}
//延时毫秒
void MAX7456_Delay_mS(u32 mS)
{
u32 i=0;
for(i=0;i<mS;i++)
{
MAX7456_Delay_uS();
}
}
//MAX7456写入一个寄存器
void MAX7456_Write_Reg(u8 add,u8 data)
{
MAX7456_StartSpi();
MAX7456_SPI_WriteByte(add);//写入地址
MAX7456_SPI_WriteByte(data);//写入数据
MAX7456_EndSpi();
}
//MAX7456读入一个寄存器
u8 MAX7456_Read_Reg(u8 add)
{
u8 Data=0;
MAX7456_StartSpi();
MAX7456_SPI_WriteByte(add);//写入地址
Data=MAX7456_SPI_ReadByte();//读出数据
MAX7456_EndSpi();
return Data;
}
//========================================================================
// 函数: void MAX7456_SYS_Init(void)
// 描述: 初始化MAX7456
// 参数: 无
// 返回: 无
// 备注: 无
// 版本:
// First version
//========================================================================
void MAX7456_SYS_Init(void)
{
//
MAX7456_PORT_Init();//GPIO初始化
//
MAX7456_SPI_Init();//SPI初始化
//
MAX7456_Write_Reg(VM0,0x00);//关闭视频模式
//写入文件所有自定义字符 ,每个芯片未初始化前要调用。
//Max7456_Write_FileChar();
MAX7456_Delay_mS(1000);//延时
MAX7456_Write_Reg(VM0,0X40);//设置为PAL模式
MAX7456_Write_Reg(DMM,0X04);//清理显存
//
MAX7456_Delay_mS(1000);//延时
MAX7456_Write_Reg(DMM,0X40);//设置为8bit模式
MAX7456_Delay_mS(1000);
MAX7456_Write_Reg(VM0,0X48);
MAX7456_Delay_mS(1000);
MAX7456_Write_Reg(VM1,0X00);
MAX7456_Delay_mS(1000);
MAX7456_Write_Reg(OSDBL_W_ADD,(MAX7456_Read_Reg(OSDBL_R_ADD)|0X10));
MAX7456_Write_Reg(OSDM,0x2D);
}
void MAX7456_Write_Char(u16 add,u8 chr)
{
//
MAX7456_Write_Reg(DMAH, (add&0XFF00)>>8);
MAX7456_Write_Reg(DMAL, (add&0XFF));
MAX7456_Write_Reg(DMDI,chr);
}
void MAX7456_WriteAtt_Char(u16 add,u8 attribute)
{
//
MAX7456_Write_Reg(DMAH, ((add&0XFF00)>>8)|2);
MAX7456_Write_Reg(DMAL, (add&0XFF));
MAX7456_Write_Reg(DMDI,attribute);
}
void MAX7456_Write_Char_XY(u8 X,u8 Y,u8 chr)
{
//
u16 add=0;
add=((u16)Y)*30+X;
MAX7456_Write_Char(add,chr);
}
void MAX7456_WriteAtt_XY(u8 X,u8 Y,u8 chr)
{
//
u16 add=0;
add=((u16)Y)*30+X;
MAX7456_WriteAtt_Char(add,chr);
}
void MAX7456_Clear(void)
{
u16 memory_address = 0,i=0;
for (i = 0; i < 480; i++)
MAX7456_Write_Char(memory_address++, 0);
}
void MAX7456_Write_ASCII_Char(u16 address, u8 c)
{
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
else if (c == '0') c = 10; // remap zero
else if (c >= 65 && c <= 90) c -= 54; // remap big letters
else if (c >= 97 && c <= 122) c -= 60; // remap small letters
else if (c == '(') c = 63; // remap
else if (c == ')') c = 64; // remap
else if (c == '.') c = 65; // remap
else if (c == '?') c = 66; // remap
else if (c == ';') c = 67; // remap
else if (c == ':') c = 68; // remap
else if (c == ',') c = 69; // remap
else if (c == '\'') c = 70; // remap
else if (c == '/') c = 71; // remap
else if (c == '"') c = 72; // remap
else if (c == '-') c = 73; // remap minus
else if (c == '<') c = 74; // remap
else if (c == '>') c = 75; // remap
else if (c == '@') c = 76; // remap
MAX7456_Write_Char(address, c);
}
void MAX7456_Write_ASCII_Chr(u8 X,u8 Y,u8 chr)
{
MAX7456_Write_ASCII_Char(((X++)+(((u16)Y*30))),chr);
}
void MAX7456_Write_ASCII_String(u8 X,u8 Y,u8 *Str)
{
while(*Str)
{
MAX7456_Write_ASCII_Char(((X++)+(((u16)Y*30))),*Str);
Str++;
}
}
void Max7456_Learn_Char(u8 number, u8 *data)
{
u8 i=0;
// select character to write (CMAH)
MAX7456_Write_Reg(CMAH, number);
for (i = 0; i < 54; i++) {
// select 4pixel byte of char (CMAL)
MAX7456_Write_Reg(CMAL, i);
// write 4pixel byte of char (CMDI)
MAX7456_Write_Reg(CMDI, data);
}
// write to the NVM array from the shadow RAM (CMM)
MAX7456_Write_Reg(CMM, 0xa0);
// according to maxim writing to nvram takes about 12ms, lets wait longer
MAX7456_Delay_mS(1200);//修改延时看能否写入
}
//从字库文件中提取字符写入MAX7456
void Max7456_Write_FileChar(void)
{
u16 i=0;
for(i=0;i<=255;i++)
Max7456_Learn_Char(i,chars);
}
//将字库中的文件显示出来,以测试使用
void Max7456_Display_AllChar(void)
{
u16 i=0;
for(i=0;i<25;i++)
MAX7456_Write_Char_XY(i, 1, i);
for(i=25;i<50;i++)
MAX7456_Write_Char_XY(i-25, 2, i);
for(i=50;i<75;i++)
MAX7456_Write_Char_XY(i-50, 3, i);
for(i=75;i<100;i++)
MAX7456_Write_Char_XY(i-75, 4, i);
for(i=100;i<125;i++)
MAX7456_Write_Char_XY(i-100, 5, i);
for(i=125;i<150;i++)
MAX7456_Write_Char_XY(i-125, 6, i);
for(i=150;i<175;i++)
MAX7456_Write_Char_XY(i-150, 7, i);
for(i=175;i<200;i++)
MAX7456_Write_Char_XY(i-175, 8, i);
for(i=200;i<225;i++)
MAX7456_Write_Char_XY(i-200, 9, i);
for(i=225;i<250;i++)
MAX7456_Write_Char_XY(i-225, 10, i);
for(i=250;i<=255;i++)
MAX7456_Write_Char_XY(i-250, 11, i);
}
以上程序,MAX7456功能函数参考并抄袭了:
http://www.mylifesucks.de/oss/c-osd/
字库生成用的如下网站的脚本
http://www.mylifesucks.de/tools/max7456/
字库文件ourdev_477183.txt(文件大小:2K) (原文件名:Spi_Max7456.h.txt)
硬件配置:STM32F103XXX,外部8M晶振,PLL9
编译调试环境:Keil For ARM/Ulink2 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|