/**************************************************************************************
动态数码管(共阴)显示实验
数码管从左至右显示0-7。
***************************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit KEY1=P2^5;
sbit KEY2=P2^6;
sbit KEY3=P2^7;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 display_mode;
bit scan_flag;//扫描标志位
u8 seg_reflash_flag;//定时标志位
u8 led_cnt;//定时刷新
u8 num=0;
bit fliter;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : DigDisplayModeOne
* 函数功能 : 数码管动态扫描函数,显示1位数字,需要在主函数中完善
显示左到右依次滚动显示 0~7
*******************************************************************************/
void DigDisplayModeOne(u8 num)
{
u8 i;
i=num;
P0=0x00;//消隐
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[i];//发送段
}
/*******************************************************************************
* 函 数 名 : DigDisplayModeTwo
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示,同时显示12345678
*******************************************************************************/
void DigDisplayModeTwo()
{
u8 i;
P0=0x00;//消隐
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[i+1];//发送段码
delay(10); //间隔一段时间扫描
}
}
/*******************************************************************************
* 函 数 名 : DigDisplayModeThree(u8 num,u8 fliter)
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示数字1
*******************************************************************************/
void DigDisplayModeThree()
{
u8 i;
P0=0x00;//消隐
for(i=0;i<8;i++){
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
if(fliter){
P0=smgduan[1];//发送段码
}else{
P0=0x00;
}
}
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void KeyScan(){
if(KEY1==0){
delay(10);
if (KEY1==0)
{
display_mode=0;
}
}
if(KEY2==0){
delay(10);
if (KEY2==0)
{
display_mode=1;
}
}
if(KEY3==0){
delay(10);
if (KEY3==0)
{
display_mode=2;
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
display_mode=0;
EA=1;//开总中断
TMOD=0X01;//定时器0的工作模式为模式1
TH0=0X4C;
TL0=0X00;//11.0592M晶振 50ms定时初值
ET0=1; //允许定时器1中断
TR0=1;//启动定时器0
P0=0x00;//消隐
while(1)
{
KeyScan();//按键扫描
if(display_mode==0){//模式1
if(scan_flag){//定时器定时一秒刷新
scan_flag=0;
if(num<7){//以下是显示0-7
num++;
DigDisplayModeOne(num);
}else{
num=0;
DigDisplayModeOne(num);
}
}
}else if(display_mode==1){
DigDisplayModeTwo();
}else if(display_mode==2){
DigDisplayModeThree();
if(scan_flag){
scan_flag=0;
fliter=~fliter;
}
}
}
}
void Timer0() interrupt 1
{
TH0=0XBB;
TL0=0X00;//重新装载定时初值
if (display_mode==0){
led_cnt=20;
}else if(display_mode==1){
led_cnt=20;
}else if(display_mode==2){
led_cnt=20;
}
if(++seg_reflash_flag>=led_cnt){
seg_reflash_flag=0;
scan_flag=1;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
proteus单片机仿真之动态数码管显示.zip (14个子文件)
proteus单片机仿真之动态数码管显示
程序
main.OBJ 8KB
八位数码管.lnp 46B
main.c 6KB
八位数码管.uvopt 72KB
八位数码管.uvproj 13KB
八位数码管_uvproj.bak 13KB
template.plg 21KB
main.LST 13KB
八位数码管.M51 11KB
八位数码管.hex 2KB
八位数码管 7KB
电路
动态数码管显示.DSN 140KB
Last Loaded 动态数码管显示.DBK 140KB
动态数码管显示.PWI 742B
共 14 条
- 1
资源评论
王雅普诺夫
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一个简单的步骤,说明如何使用Vue CLI来生成一个新的Vue项目,并附带一个简单的启动和构建脚本
- C++实现桶排序(源代码)
- 电子通信设计资料用单片机制作的直流稳压可调电源
- 一个基于命令行使用Spring Initializr生成Spring Boot项目的步骤,并附带一个简单的Maven构建和运行脚
- 电子通信设计资料用单片机制作的定时开关控制器
- 电子通信设计资料用单片机设计的测速表
- Swift5.1 官方中文教程 完整版.pdf
- 电子通信设计资料用单片机控制的出租车计价器
- ex-sqlist-1a.cpp
- com.xiaodao.orthodoxcalendar_202457104743.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功