打印
[KungFu8位 MCU]

分享下例程,数码管实验

[复制链接]
6644|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sparrow054|  楼主 | 2021-6-19 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
KF8F312单片机的P1端口P10-P17连接七段数码管的a,b,c,d,e,f,g,dp。
P24-P27分别接显示位(个位,十位,百位,千位)的公共端, 该数码管为共阴
数码管,所以若要点亮数码管,首先将该位的显示公共端置低电平,然后将要显
示的那一段置高电平。


驱动数码管使用到了P1、P2端口,所以首先需将P1、P2端口方向设置为
输出。由于个十百千位共用了P1端口,所以只能分时显示各位,先显示第一位,
再显示第二位,依次循环,由于人眼的视觉停留,快速的切换显示位便无法察觉
到。数值计数累加先加个位,如果个位的值加到10,那么个位归零,十位加1,
以此类推。加到10000的时候将每一位清零。

程序主要包含以下几块:
① 器件初始化子函数
② 数码管显示子函数
③ 主函数(数值累加循环显示)

#include<kf8f312.h>
/*********************宏定义******************************/
#define uchar unsigned char
#define uint unsigned int
/*********************宏定义结束**************************/
/*********************全局变量****************************/
uchar const Arr_num[] = {0X3F,
0X06,
0X5B,
0X4F,
0X66,
0X6D,
0X7D,
0X07,
0X7F,
0X6F
}; //共阴接法
uchar Unit, Decade, Hundred, Thousand; //定义个十百千位
/*********************全局变量结束************************/
/******************函数声明*******************************/
void Init_fun();
void Display();
void Delay_200us();
/******************函数声明结束***************************/
/************************
* 函数名 :init_fun
* 函数功能:初始化函数
* 入口参数:无
* 返回 :无
************************/
void Init_fun()
{
OSCCTL = 0x60; //设置为8M
/*********端口初始化***********/
TR0 = 0x08; //设置P03端口为输入
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0;
P1 = 0;
P2 = 0xF0; //关闭数码管位选端
}

/************************
* 函数名 :display
* 函数功能:数码管显示
* 入口参数:显示数字
* 返回 :无
************************/
void Display()
{
uint i; // 控制显示时长,确定自增的速度
for(i = 0; i < 500; i++)
{
P2 = 0XE0; //打开数码管的个位
P1 = Arr_num[Unit];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0XD0; //打开数码管的十位
P1 = Arr_num[Decade];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0XB0; //打开数码管的百位
P1 = Arr_num[Hundred];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0X70; //打开数码管的千位
P1 = Arr_num[Thousand];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
}
}

/************************
* 函数名 :Delay_200us
* 函数功能:短时间延时
* 入口参数:无
* 返回 :无
************************/
void Delay_200us()
{
uchar i = 60;
while(--i);
}
/************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
************************/
void main()
{
Unit = Decade = Hundred = Thousand = 0;
Init_fun();
while(1)
{
Unit++; //个位加1
if(Unit == 10) //如果个位的值加到10,那么个位归零,
十位加1,以下以此类推
{
Unit = 0;
Decade++;
if(Decade == 10)
{
Decade = 0;
Hundred++;
if(Hundred == 10)
{
Hundred = 0;
Thousand++;
if(Thousand == 10)
{
Thousand = 0;
}
}
}
}
Display(); //显示函数调用
}



使用特权

评论回复
沙发
树上的小鸟| | 2021-6-21 20:14 | 只看该作者
谢谢楼主分享

使用特权

评论回复
板凳
两只袜子| | 2021-6-22 11:29 | 只看该作者
很不错,值得借鉴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

128

主题

725

帖子

2

粉丝