新手入门
- 积分
- 2
- 金钱
- 2
- 注册时间
- 2022-6-9
- 在线时间
- 0 小时
|
4金钱
本帖最后由 climberth 于 2022-6-9 09:46 编辑
1.我是用的正点原子NANO STM32F103RB板子实现代码的2.预期的功能是:
(1)通用定时器TIMx产生100ms的定时中断,驱动1个LED指示灯闪烁;(2)利用TIMx实现秒计时,最多计时59s,将当前的时间值显示在2位数码管上;按键1次,计时停止,再按键,计时从0开始。
3.存在的问题是:代码编译没有问题,但下载到板子上,两位数码管的个位不亮或者说亮度太暗。
备注:
我是在定时器中断里显示的数码管
timer.c文件代码
- #include "timer.h"
- #include "stdio.h"
- #include "led.h"
- #include "smg.h"
- #include "key.h"
- //共阴数字数组
- //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭
- u8 smg_num[] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e, 0x01, 0x00};
- u8 smg_wei = 0; //数码管位选
- u8 smg_duan = 0; //数码管段选
- int gewei=0;//数码管个位数值
- int shiwei=0;//数码管十位数值
- u8 t = 0; //KEY0状态,0为未按,1为按下
- //通用定时器中断初始化
- //这里时钟选择为APB1的2倍,而APB1为36M
- //arr:自动重装值。
- //psc:时钟预分频数
- //这里使用的是定时器2!
- int times=0;//计算中断次数
- int sec=0;//计算时间
-
- void TIM3_Init(u16 arr,u16 psc)
- {
- RCC->APB1ENR|=1<<1; //TIM2时钟使能
- TIM3->ARR=arr; //设定计数器自动重装值
- TIM3->PSC=psc; //预分频器设置
- TIM3->DIER|=1<<0; //允许更新中断
- TIM3->CR1|=0x01; //使能定时器2
- MY_NVIC_Init(0,3,TIM3_IRQn,2);//抢占0,子优先级3,组2
-
- }
- //定时器2中断服务函数
- void TIM3_IRQHandler(void) //TIM2中断
- {
- if(TIM3->SR&0X0001)//溢出中断
- {
-
- LED0=!LED0;
- t=KEY_Scan(1);
-
- printf("\r\n按键:%d \n\r",t);
- if(t==0)
- {
- times=times+1;
- sec=(100*times)/1000; //计算时间
- if(sec>=59)
- { //最大59
- sec=59;
- }
- // printf("\r\n时间:%d s\n\r",sec); //用于调试,最多59s
- gewei=sec%10;
- shiwei=sec/10;
- LED_Write_Data(smg_num[gewei],1);
- LED_Write_Data(smg_num[shiwei],0);
- LED_Refresh();//刷新显示
- }
- if(t==1)
- {
- LED_Write_Data(smg_num[gewei],1);
- LED_Write_Data(smg_num[shiwei],0);
- LED_Refresh();//刷新显示
- }
- if(t==2)
- {
- times=0;
- sec=0;
- gewei=0;
- shiwei=0;
- LED_Write_Data(smg_num[gewei],1);
- LED_Write_Data(smg_num[shiwei],0);
- LED_Refresh();//刷新显示
-
- }
-
- }
- TIM3->SR&=~(1<<0);//清除中断标志位
- }
复制代码
全部代码见附件,希望哪位兄弟姐妹可以帮忙解决,感激不尽!
|
最佳答案
查看完整内容[请看2#楼]
几个意见吧
1.乘除运算放到while(1)中去处理,中断直接调用结果.
2.我不知道你这个函数是什么意思?是不是个位暗,十位亮?不然感觉没天理啊.
LED_Write_Data(smg_num[gewei],1);
LED_Write_Data(smg_num[shiwei],0);
一般来说,2位的数码管,都是共用abcdefg端口的,然后一个公共脚区别.
所以你才把个位打开,然后立即关了去开十位,肯定是十位亮,个位看运气.
3.中断分次,
第一次点亮个位,十位的数据不管.
第二次,点亮十位,个位 ...
|