OpenEdv-开源电子网

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

MAX7219驱动程序就是不对,应该是主程序的问题,求大佬指教,整个程序已附上

[复制链接]

3

主题

13

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-26
在线时间
7 小时
发表于 2019-12-5 23:37:45 | 显示全部楼层 |阅读模式
2金钱
#include "stm32f10x.h"
#include"stm32f10x_tim.h"
void bxl_Delay(u32 bxl_nCount);//延时函数
u32 bxl_Count;//无符号字符型 32
u8 bxl_time=0;//无符号字符型 8
#define bxl_START GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)//宏定义开始建
#define bxl_RST GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)//宏定义清零键
void bxl_Timer(void)//TIM 配置
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置 TIM0.01
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能 TIM2
TIM_DeInit(TIM2); //复位 TIM2 定时器,使之进入初始状态
TIM_TimeBaseStructure.TIM_Period=(100-1);//自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);//时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 向 上
计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除溢出中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //溢出中断使能
TIM_Cmd(TIM2,ENABLE); //计时器使能
}
void bxl_EXTI(void)//按键中断
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//复用时钟使能
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//中断引脚
EXTI_InitStructure.EXTI_Line=EXTI_Line1;//中断线 1
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断事件选择
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//中断触发方式
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能
EXTI_Init(&EXTI_InitStructure);常州大学本科生课程设计
24 页 共 37
}
void bxl_NVIC(void)//中断配置函数
{
NVIC_InitTypeDef NVIC_InitStructure;//TIM+ret 按键 NVIC 配置
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_1); //采用第一组
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //占先优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级零
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//采用第一组
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//占先优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//副优先级零
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_Init(&NVIC_InitStructure);
}
void bxl_GPIO(void)//按键端口
{
GPIO_InitTypeDef GPIO_InitStructure;//配置按键
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//端口时钟使能
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1;//配置引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;// 端 口 最 高 响 应 频 率
2MHZ
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void bxl_SPI1_Init(void) //串口配置
{
SPI_InitTypeDef SPI1_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;常州大学本科生课程设计
25 页 共 37
//配置 SPI1 管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,
ENABLE);//使能串口所需引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//使能串口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//配置引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 端 口 最 高 响 应 频 率
50MHZ
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;// 配 置 引

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 端 口 最 高 响 应 频 率
50MHZ
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
SPI1_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置 SPI
向或者双向的数据模式:SPI 设置为双线模式
SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;;// 定 义
波特率预分频的值:波特率预分频值为 64
SPI1_InitStructure.SPI_DataSize=SPI_DataSize_8b; //设置 SPI 的数据大小:SPI
送接收 8 位帧结构
SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置 SPI 工作模式,设置为
主模式
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从 MSB 位还
LSB 位开始:数据传输从 MSB 位开始
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //高位在前
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变
沿(上升或下降)数据被采样
SPI1_InitStructure.SPI_NSS = SPI_NSS_Hard; // 使用硬件模式,PA4 需要接高
电平
SPI1_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
SPI_I2S_DeInit(SPI1);//复位串口进入初始状态
SPI_Init(SPI1, &SPI1_InitStructure);常州大学本科生课程设计
26 页 共 37
SPI_Cmd(SPI1, ENABLE); //使能
}
void bxl_Write_Max7219(u8 bxl_address,u8 blx_dat)//写入数据
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //重置端口
SPI_I2S_SendData(SPI1, bxl_address); //写入地址,即数码管编号
bxl_Delay(1);//延时
SPI_I2S_SendData(SPI1, blx_dat); //写入数据,即数码管显示数字
bxl_Delay(1);//延迟
GPIO_SetBits(GPIOA, GPIO_Pin_3);//载入数据
}
void bxl_Init_MAX7219(void)//显示方式配置
{
bxl_Write_Max7219(0x09, 0xff); //译码方式:BCD
bxl_Write_Max7219(0x0a, 0x09); //亮度
bxl_Write_Max7219(0x0b, 0x02); //扫描界限;2 个数码管显示
bxl_Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
bxl_Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:
0
}
void bxl_GE()//个位显示
{
if(bxl_time%10==0) {bxl_Write_Max7219(0x01, 0x00);}//计时变量除以 10 余数为 0
显示 0
if(bxl_time%10==1) {bxl_Write_Max7219(0x01, 0x01);}//计时变量除以 10 余数为 1
显示 1
if(bxl_time%10==2) {bxl_Write_Max7219(0x01, 0x02);}//计时变量除以 10 余数为 2
显示 2
if(bxl_time%10==3) {bxl_Write_Max7219(0x01, 0x03);}//计时变量除以 10 余数为 3
显示 3
if(bxl_time%10==4) {bxl_Write_Max7219(0x01, 0x04);}//计时变量除以 10 余数为 4
显示 4
if(bxl_time%10==5) {bxl_Write_Max7219(0x01, 0x05);}//计时变量除以 10 余数为 5
显示 5
if(bxl_time%10==6) {bxl_Write_Max7219(0x01, 0x06);}//计时变量除以 10 余数为 6
显示 6常州大学本科生课程设计
27 页 共 37
if(bxl_time%10==7) {bxl_Write_Max7219(0x01, 0x07);}//计时变量除以 10 余数为 7
显示 7
if(bxl_time%10==8) {bxl_Write_Max7219(0x01, 0x08);}//计时变量除以 10 余数为 8
显示 8
if(bxl_time%10==9) {bxl_Write_Max7219(0x01, 0x09);}//计时变量除以 10 余数为 9
显示 9
}
void bxl_SHI()//十位显示
{
if(bxl_time/10==0) {bxl_Write_Max7219(0x02, 0x00);}//计时变量除以 10 取整部分
0 显示 0
if(bxl_time/10==1) {bxl_Write_Max7219(0x02, 0x01);}//计时变量除以 10 取整部分
1 显示 1
if(bxl_time/10==2) {bxl_Write_Max7219(0x02, 0x02);}//计时变量除以 10 取整部分
2 显示 2
if(bxl_time/10==3) {bxl_Write_Max7219(0x02, 0x03);}//计时变量除以 10 取整部分
3 显示 3
if(bxl_time/10==4) {bxl_Write_Max7219(0x02, 0x04);}//计时变量除以 10 取整部分
4 显示 4
if(bxl_time/10==5) {bxl_Write_Max7219(0x02, 0x05);}//计时变量除以 10 取整部分
5 显示 5
if(bxl_time/10==6) {bxl_Write_Max7219(0x02, 0x06);}//计时变量除以 10 取整部分
6 显示 6
if(bxl_time/10==7) {bxl_Write_Max7219(0x02, 0x07);}//计时变量除以 10 取整部分
7 显示 7
if(bxl_time/10==8) {bxl_Write_Max7219(0x02, 0x08);}//计时变量除以 10 取整部分
8 显示 8
if(bxl_time/10==9) {bxl_Write_Max7219(0x02, 0x09);}//计时变量除以 10 取整部分
9 显示 9
}
int main(void)
{
bxl_Timer();//TIM 配置
bxl_EXTI();//按键中断
bxl_NVIC();//中断配置函数
bxl_GPIO();//按键端口常州大学本科生课程设计
28 页 共 37
bxl_SPI1_Init();//串口配置
bxl_Init_MAX7219();//显示方式配置
bxl_Write_Max7219(0x01, 0x00); //初始清零
bxl_Write_Max7219(0x02, 0x00);//初始清零
while(1)
{
if(bxl_START==0){
while(1)//记时
{
bxl_GE();//个位显示
bxl_SHI();//十位显示
bxl_Delay(100);//延时 1
bxl_time=bxl_time+1;//加一秒
if(bxl_time==100)//到达 100 时重新计时
{
bxl_time=0;//归零
}
}
}
}
}
void bxl_Delay(u32 bxl_nCount)//延时一个数字为 0.01S
{
bxl_Count=bxl_nCount;//赋值
while(bxl_Count);//当值为 0 跳出
}
void TIM2_IRQHandler(void) //时钟中断子函数
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//计时到来
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清楚中断
bxl_Count--;//一直递减每减一次计时 0.01
}
}常州大学本科生课程设计
29 页 共 37
void EXTI0_IRQHandler(void)//归零中断子函数
{if(EXTI_GetITStatus(EXTI_Line1)==SET)//中断是否到来
{
EXTI_ClearITPendingBit(EXTI_Line1);//清除中断
EXTI_ClearFlag( EXTI_Line1); //清除
{
bxl_Write_Max7219(0x01, 0x00);//清零
bxl_Write_Max7219(0x02, 0x00);//清零
bxl_Write_Max7219(0x04, 0x00);//清零
bxl_time=0;//归零
}
}
}

MAX7219驱动数码管.rar

6.24 MB, 下载次数: 4

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-6 10:12:45 | 显示全部楼层
这代码是个狠人写的,还好不是显示8位
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-26
在线时间
7 小时
 楼主| 发表于 2019-12-6 16:14:03 | 显示全部楼层
nashui_sx 发表于 2019-12-6 10:12
这代码是个狠人写的,还好不是显示8位

能帮忙改下主程序嘛
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-6 17:41:58 | 显示全部楼层
沐晴 发表于 2019-12-6 16:14
能帮忙改下主程序嘛

是不是那种长条的8位数码管  背面有个MAX7219的模块
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-26
在线时间
7 小时
 楼主| 发表于 2019-12-6 19:44:25 | 显示全部楼层
nashui_sx 发表于 2019-12-6 17:41
是不是那种长条的8位数码管  背面有个MAX7219的模块

是是是,课设快要检查了,慌得一批,我觉得就是主程序部分有问题,求帮忙
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-6 20:16:00 | 显示全部楼层
沐晴 发表于 2019-12-6 19:44
是是是,课设快要检查了,慌得一批,我觉得就是主程序部分有问题,求帮忙

http://www.openedv.com/forum.php ... p;extra=#pid1029384
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 14:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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