stallone 发表于 2013-6-23 17:26:17

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);        //打开显示                                                         
}

stallone 发表于 2013-6-23 19:35:51

自己顶一下!

stallone 发表于 2013-6-23 22:20:55

把初始化那块删除点,重写0址址的就恢复正常了!
页: [1]
查看完整版本: MAX7456寄存器读不出来