OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2679|回复: 3

新手小白!!!MAX7219驱动时总是显示数码管全亮,有源码,望好汉们看看问题

[复制链接]

3

主题

13

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-26
在线时间
7 小时
发表于 2020-3-13 18:23:19 | 显示全部楼层 |阅读模式
15金钱
这是一个关于MAX7219的驱动程序,我对照数据手册写的代码,通过GPIO端口模拟spi,基本的底层读写程序我写的也没啥问题啊,可就是数码管显示不对,一直在全亮,我也是刚接触32没多久,希望各位好汉能帮忙看一看,源码已经附上(max7219的时序实在sclk的上升沿采集数据的,并且是高位先行),再次感谢帮忙

自写2.zip

4.72 MB, 下载次数: 44

最佳答案

查看完整内容[请看2#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=303542&extra=
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-3-13 18:23:20 | 显示全部楼层
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-26
在线时间
7 小时
 楼主| 发表于 2020-3-13 18:24:16 | 显示全部楼层
#include "max7219.h"
#include "SysTick.h"

//定义Max7219端口


//sbit Max7219_pinCLK = P2^2;
//sbit Max7219_pinCS  = P2^1;
//sbit Max7219_pinDIN = P2^0;

//--------------------------------------------
//功能:向MAX7219(U3)写入字节
//入口参数:DATA
//出口参数:无
//说明:
static void Write_Max7219_byte(uint8_t  DATA)         
{

            uint8_t  i;   
                Max7219_pinCS=0;               
            for(i=8;i>=1;i--)
          {                  
            Max7219_pinCLK=0;
            Max7219_pinDIN=((DATA&0x80)>>7);
//                  Delay_us(1);
            DATA=DATA<<1;
            Max7219_pinCLK=1;
//                     Delay_us(1);

           }                                 
}
//-------------------------------------------
//功能:向MAX7219写入数据
//入口参数:address、dat
//出口参数:无
//说明:
void Write_Max7219(uint8_t  address,uint8_t  dat)
{

     Max7219_pinCS=0;
         Write_Max7219_byte(address);           //写入地址,即数码管编号
   Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
         Max7219_pinCS=1;        

}

void Init_MAX7219(void)
{
                GPIO_InitTypeDef   GPIO_InitStruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);
       
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//GPIO_ResetBits(GPIOB,GPIO_Pin_6);
       
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//GPIO_ResetBits(GPIOB,GPIO_Pin_7);
       
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB,&GPIO_InitStruct);
Max7219_pinCS  =1;  
Write_Max7219(0x09, 0x00);       //译码方式:BCD码
Write_Max7219(0x0a, 0x09);       //亮度
Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示
Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
Write_Max7219(0x0f, 0x01);       //显示测试:1;测试结束,正常显示:0
Delay_us(0xffff);
Write_Max7219(0x0f, 0x00);
}
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-26
在线时间
7 小时
 楼主| 发表于 2020-3-13 18:24:44 | 显示全部楼层
/***********************************
* 文件名  :main.c
* 描述    :1个LED在 SysTick 的控制下,以500ms的频率闪烁。         
* 实验平台:MINI STM32开发板 基于STM32F103C8T6
* 库版本  :ST3.0.0

*********************************************************/
#include "stm32f10x.h"
#include "SysTick.h"
#include "led.h"
#include "max7219.h"
//#include  "time.h"
void Delay_xms(uint16_t  x);
//uint8_t temp=1;

uint8_t i,j;
uint16_t   disp1[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //0 1 2 3 4 5 6 7 8 9
//uint16_t disp1[]={0x7E,0x30,0x6D,0x79,        // 0, 1, 2, 3
//                                      0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x01,0x00};//带小数点


int main(void)
{
        SysTick_Init();
Delay_xms(50);
Init_MAX7219();       
       

       
// Timer_Config(9999,7199);
  
while(1)
{
         
//  Write_Max7219(1,04);
//  Write_Max7219(0x02,0x08);
//       
//        Write_Max7219(0x03,*(disp1+2));
//        Write_Max7219(0x04,*disp1+3);
//        Write_Max7219(0x05,*disp1+4);
//        Write_Max7219(0x06,*disp1+5);
//        Write_Max7219(0x07,*disp1+6);
//        Write_Max7219(0x08,*disp1+7);
//         if(temp)
//         {
////         
         for(i=1;i<9;i++)
  { Write_Max7219(i,disp1[i-1]);
    Delay_xms(3000);
         }
//          for(temp)
//  {
//   for(i=1;i<9;i++)
//    Write_Max7219(i,disp1[j][i-1]);

  }  
}



void Delay_xms(uint16_t  x)
{
uint16_t  i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 10:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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