MAX7456寄存器读不出来
本来昨天直接显示是没有问题的。今天手闲想要改变下0地址的字符,结果没有变成想要字符,变成了下图:(图是网友的,非常相似)
然后想要将其更改为空白,发现写字符存储器一直不成功。
试了几遍后,突然显示的也没有了,显示不出来了。
用串口测试发现程序只要碰到读寄存器就过去了。
附我的源程序:
#include<reg52.h>
#include "max7456.h"
sbit SPI_CS =P3^4;
sbit SPI_MOSI =P3^5;
sbit SPI_CLK =P2^7;
sbit SPI_MISO =P2^6;
#define DATA_BUF_LENGTH 968
unsigned char date={0x00,0x70,0x20,0x71,0x20,0x72,0x20,0xff,0xff};
unsigned char r_data={0x00,0x70,0X55,0X55,0X55,
0X55,0X55,0X55,
0X55,0X45,0X55,
0X55,0X21,0X55,
0X40,0X20,0X01,
0X2A,0XAA,0XA8,
0X20,0X20,0X08,
0X21,0X21,0X48,
0X20,0X20,0X08,
0X2A,0XAA,0XA8,
0X20,0X20,0X08,
0X45,0X21,0X51,
0X55,0X21,0X55,
0X55,0X21,0X55,
0X55,0X21,0X55,
0X55,0X45,0X55,
0X55,0X55,0X55,
0X55,0X55,0X55};
void spiWriteReg(unsigned char regAddr,unsigned char regData); //函数声明
unsigned char spiReadReg (unsigned char regAddr);
void spiWriteRegAutoIncr(unsigned char regData);
void spiWriteCM();
void spiWriteFM();
void Delay()
{
unsigned int i;
for(i=0;i<1000;i++);
}
void max7456_init()
{
Delay();
spiWriteReg(DM_MODE_WRITE,0x40); //写DMM=1;8位工作模式
spiWriteReg(VIDEO_MODE_0_WRITE,SW_RESET);//对其进行复位操作
while(!(spiReadReg(STATUS_READ)&0x40)); //若退出循环,表示初始化完成
spiWriteReg(DM_MODE_WRITE,0x40); //写DMM=1;8位工作模式
spiWriteReg(VIDEO_MODE_0_WRITE,0x64); //PAL,外同步等的设置
}
void main()
{
max7456_init();
spiWriteFM();
Delay();
spiWriteCM();
spiWriteReg(0x03,0x16); //图像整体下移6个象素
while(1);
}
void spiWriteReg(unsigned char regAddr,unsigned char regData) //寄存器地址,配置数据
{
unsigned char SPICount;
unsigned char SPIData;
SPI_CS = 1;
SPI_CLK = 0;
SPIData = regAddr;
SPI_CS = 0;
for (SPICount = 0; SPICount < 8; SPICount++)
{
if (SPIData & 0x80)
SPI_MOSI = 1;
else
SPI_MOSI = 0;
SPI_CLK = 1;
SPI_CLK = 0;
SPIData <<= 1;
}
SPIData = regData;
for (SPICount = 0; SPICount < 8; SPICount++)
{
if (SPIData & 0x80)
SPI_MOSI = 1;
else
SPI_MOSI = 0;
SPI_CLK = 1;
SPI_CLK = 0;
SPIData <<= 1;
}
SPI_CS = 1;
SPI_MOSI = 0;
}
unsigned char spiReadReg (unsigned char regAddr) //读寄存器的数据
{
unsigned char SPICount;
unsigned char SPIData;
SPI_CS = 1;
SPI_CLK = 0;
SPIData = regAddr;
SPI_CS = 0;
for (SPICount = 0; SPICount < 8; SPICount++)
{
if(SPIData & 0x80)
SPI_MOSI = 1;
else
SPI_MOSI = 0;
SPI_CLK = 1;
SPI_CLK = 0;
SPIData <<= 1;
}
SPI_MOSI = 0;
SPIData = 0;
for (SPICount = 0; SPICount < 8; SPICount++)
{
SPIData <<=1;
SPI_CLK = 1;
if(SPI_MISO)
SPIData =SPIData+1; //修改过的
SPI_CLK = 0;
}
SPI_CS = 1;
return ((unsigned char)SPIData);
}
void spiWriteRegAutoIncr(unsigned char regData) //自增模式下写寄存器
{
unsigned char SPICount;
unsigned char SPIData;
SPI_CS = 1;
SPI_CLK = 0;
SPIData = regData;
SPI_CS = 0;
for (SPICount = 0; SPICount < 8; SPICount++)
{
if(SPIData & 0x80)
SPI_MOSI = 1;
else
SPI_MOSI = 0;
SPI_CLK = 1;
SPI_CLK = 0;
SPIData <<= 1;
}
SPI_MOSI = 0;
}
void spiWriteCM()//写显示存储器 // 0x01:character memory address msb
{
unsigned int Index = 0x0001;
spiWriteReg(DM_MODE_WRITE,0x40); //写DMM=1;8位工作模式
spiWriteReg(VIDEO_MODE_0_WRITE,0x64); //关闭显示
spiWriteReg(DM_ADDRH_WRITE,0x01); // 写DMAH;写显示字符地址
spiWriteReg(DM_ADDRL_WRITE,0x88); // 写DMAL;由DMAH和DMAL确定显示起始位置
spiWriteReg(DM_MODE_WRITE ,0x41); // 写DMM=0x41开启8位递增操作模式
do
{
if(date==0xFF)
{
break;
}
spiWriteRegAutoIncr(date);
Index+=2;
} while(Index < 0x03C1); // 0x03C1 = 961
spiWriteRegAutoIncr(0xFF);
spiWriteReg(DM_MODE_WRITE,0x40); //写DMM=1;8位工作模式
spiWriteReg(DM_ADDRH_WRITE,0x03);// 写DMAH 写显示字符的属性
spiWriteReg(DM_ADDRL_WRITE,0x88);// 写DMAL 由DMAH+DMAL确定显示起始地址
spiWriteReg(DM_MODE_WRITE,0x41); // 写DMM=0x41开启8位递增操作模式
Index = 0x0002;
do
{
if(date==0xFF)
{
break;
}
spiWriteRegAutoIncr(date);
Index += 2;
} while(Index < 0x03C1);
spiWriteRegAutoIncr(0xFF);
spiWriteReg(VIDEO_MODE_0_WRITE,0x6c); //打开显示
}
void spiWriteFM() //写字符存储器
{
unsigned char Index;
spiWriteReg(DM_MODE_WRITE,0x40); //写DMM=1;8位工作模式
spiWriteReg(VIDEO_MODE_0_WRITE,0x64); //关闭显示
spiWriteReg(FM_ADDRH_WRITE,r_data); //确定写哪一行 CMAH=XX
for(Index = 0x00; Index < 0x36; Index++)
{
spiWriteReg(FM_ADDRL_WRITE,Index); //写地址CMAL=XX
spiWriteReg(FM_DATA_IN_WRITE,r_data); //写数据CMDI=XX
}
spiWriteReg(FM_MODE_WRITE, 0xA0); // 从映射存储器转移到字符存储器
while ((spiReadReg(STATUS_READ) & 0x20) != 0x00); // 等待写完成
spiWriteReg(VIDEO_MODE_0_WRITE,0x6c); //打开显示
}
自己顶一下! 把初始化那块删除点,重写0址址的就恢复正常了!
页:
[1]