STC学习:八位数码管滚动显示

程序运行效果说明
程序设计目标:8个数码管数值从右往左循环移动显示。
测试方法说明:只需要一个电路板,将程序下载到STC板子上后,看到8个数码管从左到右分别显示0到7的八个数字,隔一段时间后显示1到8,接着是2到9,再接着是3到0……重复这样的规律显示,达到的效果是0到9这10个数字循环向左移动。

程序相关电路及工作原理说明
在这里插入图片描述
本电路图由8个数码管及相应的控制电路组成。图中LED部分不属于本程序控制范围。但是由于P2^3是数码管与发光二极管的共用引脚,因此在此列出。8个LED数码管是否显示由位选线决定。要控制8个LED数码管的显示需要3位二进制码表示,并且电路图中与P2.0、P2.1、P2.2对应的SEL0、SEL1和SEL2就是用于控制8个数码管显示的位选引脚。SEL0、SEL1、SEL2组合的值为多少,则对应第几个数码管显示。 确定要显示的数码管之后需要确定具体显示的数值,依据其对应的数码管八段中的段位来决定。每个LED数码管八段定义如下图所示:
在这里插入图片描述

代码如下:

#include "STC15F2K60S2.H"
#define uint unsigned int
#define uchar unsigned char
sbit sbtSel0=P2^0; //
sbit sbtSel1=P2^1; //
sbit sbtSel2=P2^2; //位选的三个引脚控制位
//变量定义
uchar ucDig1Tmp;
uchar ucDig2Tmp;
uchar ucDig3Tmp;
uchar ucDig4Tmp;
uchar ucDig5Tmp;
uchar ucDig6Tmp;
uchar ucDig7Tmp;
uchar ucDig8Tmp;//show_wi(i=1,2,3,4,......,8)分别是从左到右的各个数码管上显示的数字
uchar ucSeg7State;
uchar ucCount;
uchar arrSegSelect[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//段选
uchar arrDigSelect[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//位选
void Init()//初始化函数
{
    P2M0=0xff;
    P2M1=0x00;
    P0M0=0xff;
    P0M1=0x00;//P0,P2都设置为推挽输出
    ucSeg7State=0;
    ucCount=0;
    ucDig1Tmp=0;//最开始数码管从左到右显示0-7
    ucDig2Tmp=1;
    ucDig3Tmp=2;
    ucDig4Tmp=3;
    ucDig5Tmp=4;
    ucDig6Tmp=5;
    ucDig7Tmp=6;
    ucDig8Tmp=7;
    TMOD=0x01;             //定时器0,方式1
    ET0=1;                  //开启定时器中断
    TH0=(65535-1000)/256; //定时器0的高八位设置
    TL0=(65535-1000)%256;//定时器的低八位设置
    TR0 = 1;                 //启动定时器
    EA = 1;                  //开启总中断
}
//定时器T0中断服务函数
void T0_Process()interrupt 1 //把数码管的显示提到中断里面来了
{
    TH0=(65535-1000)/256;//重新装载定时器0的初始值,为了下一次定时器溢出做准备
    TL0=(65535-1000)%256;
    ucSeg7State++;//这变量两个作用:具有下面分频作用,和扫描过程中显示第ucSeg7State个数码管的作用
    if(ucSeg7State==8)//进行分频,每中断八次才让ucCount的值加一次
    {
        ucSeg7State=0;
        ucCount++;
    }
    if(ucCount==100)//考虑到扫描频率很高这里再次分频,ucCount加到100才执行
    {
        ucCount=0;
        ucDig1Tmp++;//让从左往右各个数码管上的数字都加一
        ucDig2Tmp++;
        ucDig3Tmp++;
        ucDig4Tmp++;
        ucDig5Tmp++;
        ucDig6Tmp++;
        ucDig7Tmp++;
        ucDig8Tmp++;
    }
    P0=0;//让数码管显示更加好,不受上一次P0赋值的影响
    P2=arrDigSelect[ucSeg7State];//位选,选第ucSeg7State个数码管
    switch(ucSeg7State)//每次中断显示一个数码管
    {
        case 0:
            P0=arrSegSelect[ucDig1Tmp%10];
            break;//从左到右,第一个数码管显示
        case 1:
            P0=arrSegSelect[ucDig2Tmp%10];
            break;//从左到右,第二个数码管显示
        case 2:
            P0=arrSegSelect[ucDig3Tmp%10];
            break;//从左到右,第三个数码管显示
        case 3:
            P0=arrSegSelect[ucDig4Tmp%10];
            break;//从左到右,第四个数码管显示
        case 4:
            P0=arrSegSelect[ucDig5Tmp%10];
            break;//从左到右,第五个数码管显示
        case 5:
            P0=arrSegSelect[ucDig6Tmp%10];
            break;//从左到右,第六个数码管显示
        case 6:
            P0=arrSegSelect[ucDig7Tmp%10];
            break;//从左到右,第七个数码管显示
        default:
            P0=arrSegSelect[ucDig8Tmp%10];
            break;//从左到右,第八个数码管显示
    }
}
//主函数
void main()
{
    Init();//初始化
    while(1);
}

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布布要成为最负责的男人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值