不用开发板学习STM32
可设置电子时钟
1
实验环境介绍
• 实验环境
本次实验是通过Proteus+MDK一起模拟完成的。Proteus模拟实际电路,MDK编译代码。Proteus版本是8.9,MDK版本是5.36。需要注意的是,Proteus需要安装8.8以上版本,器件库里面要支持STM32F401VE。
• 实验目的
通过定时器3TIM3,计数,8位数码管,一个3*4的键盘来实现一个简单的可设置电子时钟。
2
硬件电路
Proteus电路
• 主控:
STM32F401VE,Cotex-M4内核,主频最大84MHz,程序空间512KB,FLASH空间96KB。
• 时钟:
没有用外部晶振,因为Proteus只支持一种时钟树,所以这里采用内部晶振,做实验够了。
• 复位电路:
没有配置相关外设电路,因为Proteus默认是有电压的,默认是复位的,毕竟是仿真软件,主要是验证程序功能。
• IO说明:
我们利用PD0~PD7以及PC0~PC7控制数码管、PE0~PE6控制键盘输入。
3
代码概述
MDK代码目录结构
• 代码目录概述:
USER文件夹:主要包含应用函数的.C文件以及中断函数.C。
HARDWARE文件夹:主要包含底层硬件驱动的.C文件。
CORE文件夹:主要包含STM32的启动的.S文件。
FWLIB文件夹:主要包含ST官方提供的标准外设驱动.C文件(不是HAL库哦)。
• 代码内容概述:
↓↓↓ 按键识别代码如下:
//判断按键是否按下
u8 iskeyinput(void)
{
GPIOE->ODR=0x000f;
if((KEYPORT&0x000f)==0x000f)
return 0;
else
return 1;
}
//按键识别
u8 key_identify(void)
{
u8 linecode=0,rowcode=0;
u8 i;
u8 scancode=0x00ef;
for(i=0;i<4;i++)
{
GPIOE->ODR=scancode;
if((KEYPORT&0x000f)==0x000f)
{
rowcode++;
scancode=scancode<<1|1;
}
else
{
if(line0==0)linecode=0;
if(line1==0)linecode=3;
if(line2==0)linecode=6;
if(line3==0)linecode=9;
break;
}
}
return linecode+rowcode;
}
//等待按键松开
void wait_key_release(u8 x)
{
while(1)
{
GPIOE->ODR=0x000f;
if(x==0)seg_disp2();
else seg_disp1(f);
if((KEYPORT&0x000f)==0x000f)
break;
}
}
//按键扫描
u8 key_Scan(u8 x)
{
u8 keycode=0;
if(iskeyinput())
{
delay_us(100);
if(iskeyinput())
{
keycode=key_identify()+1;
wait_key_release(x);
}
}
return keycode;
}
↓↓↓ 电子时钟事件计时代码如下:
void get_time(void)
{
if(bs>99)
{
bs=0;s++;
if(s==60)
{
s=0;m++;
if(m==60)
{
m=0;h++;
if(h==24)
{h = 0;}
date[0]=h/10;
date[1]=h%10;
}
date[2]=m/10;
date[3]=m%10;
}
date[4]=s/10;
date[5]=s%10;
}
date[6]=bs/10;
date[7]=bs%10;
}
↓↓↓ 更详细代码及工程文件,公众号回复关键字就能获取!!
4
实验结果展示
电子时钟效果
设置效果
可以看到,电子时钟能够正常计时并且通过*号按键切换成设置状态,再通过#号按键切换成正常计时状态,至此可设置电子时钟实验完成!!!