搜索
bottom↓
回复: 2

MAX7456寄存器读不出来

[复制链接]

出0入0汤圆

发表于 2013-6-23 17:26:17 | 显示全部楼层 |阅读模式
本来昨天直接显示是没有问题的。
今天手闲想要改变下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[DATA_BUF_LENGTH]={0x00,0x70,0x20,0x71,0x20,0x72,0x20,0xff,0xff};
unsigned char r_data[56]={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[6]=1;8位工作模式
        spiWriteReg(VIDEO_MODE_0_WRITE,SW_RESET);//对其进行复位操作
        while(!(spiReadReg(STATUS_READ)&0x40));         //若退出循环,表示初始化完成

        spiWriteReg(DM_MODE_WRITE,0x40);        //写DMM[6]=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[6]=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[Index]==0xFF)
          {                                
                      break;
          }                                            
      spiWriteRegAutoIncr(date[Index]);                        
          Index+=2;                                                                                                         
   } while(Index < 0x03C1);                                     // 0x03C1 = 961
   spiWriteRegAutoIncr(0xFF);                                   

   spiWriteReg(DM_MODE_WRITE,0x40);                //写DMM[6]=1;8位工作模式
   spiWriteReg(DM_ADDRH_WRITE,0x03);  // 写DMAH 写显示字符的属性                                                              
   spiWriteReg(DM_ADDRL_WRITE,0x88);  // 写DMAL        由DMAH[0]+DMAL确定显示起始地址
   spiWriteReg(DM_MODE_WRITE,0x41);   // 写DMM=0x41开启8位递增操作模式                        

   Index = 0x0002;
   do
   {
      if(date[Index]==0xFF)
          {
         break;
          }
      spiWriteRegAutoIncr(date[Index]);
      Index += 2;
   } while(Index < 0x03C1);
   spiWriteRegAutoIncr(0xFF);
   spiWriteReg(VIDEO_MODE_0_WRITE,0x6c);        //打开显示
}

void spiWriteFM()        //写字符存储器
{
     unsigned char Index;
         spiWriteReg(DM_MODE_WRITE,0x40);        //写DMM[6]=1;8位工作模式   
     spiWriteReg(VIDEO_MODE_0_WRITE,0x64);        //关闭显示        
     spiWriteReg(FM_ADDRH_WRITE,r_data[1]);                                       //确定写哪一行 CMAH[7:0]=XX              
                                                               
     for(Index = 0x00; Index < 0x36; Index++)
     {
          spiWriteReg(FM_ADDRL_WRITE,Index);                                          //写地址  CMAL[7:0]=XX               
          spiWriteReg(FM_DATA_IN_WRITE,r_data[Index + 2]);       //写数据  CMDI[7:0]=XX
     }
     spiWriteReg(FM_MODE_WRITE, 0xA0);                          // 从映射存储器转移到字符存储器                                                            
     while ((spiReadReg(STATUS_READ) & 0x20) != 0x00);          // 等待写完成
         spiWriteReg(VIDEO_MODE_0_WRITE,0x6c);        //打开显示                                                         
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-6-23 19:35:51 | 显示全部楼层
自己顶一下!

出0入0汤圆

 楼主| 发表于 2013-6-23 22:20:55 | 显示全部楼层
把初始化那块删除点,重写0址址的就恢复正常了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表