登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 数码管只显示有效位

[复制链接]
发表于 2022-1-8 22:17:10 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 数码管只显示有效位
开始时间: 2022-01-08
结束时间: 2022-01-08
本帖最后由 房一鹏 于 2022-1-8 22:41 编辑

数码管只显示有效位(只有程序)
#include<reg52.h>

sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;

unsigned char ledchar[]={
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char ledbuff[]={
        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

void main ()
{
        unsigned int cnt=0;
        unsigned long sec=0;
        unsigned char i=0;
        
        ENLED=0;
        TMOD=0x01;
        TH0=0xF5;
        TL0=0x55;
        TR0=1;
        
        while(1)
        {
                if(TF0==1)
                {
                        TF0=0;
                        TH0=0xF5;
            TL0=0x55;
                        cnt++;
                        if(cnt>=1000)
                        {
                                cnt=0;
                                sec++;
                                if(sec>=0){ledbuff[0]=ledchar[sec%10];}
                                if(sec>=10){ledbuff[1]=ledchar[sec/10%10];}
                                if(sec>=100){ledbuff[2]=ledchar[sec/100%10];}
                                if(sec>=1000){ledbuff[3]=ledchar[sec/1000%10];}
                                if(sec>=10000){ledbuff[4]=ledchar[sec/10000%10];}
                                if(sec>=100000){ledbuff[5]=ledchar[sec/100000%10];}
                        }
                        P0=0xFF;
                  switch(i)
                        {
                                case 0:
                          P20=1; P21=0; P22=1; i++; P0=ledbuff[0]; break;
                                case 1:
                          P20=0; P21=0; P22=1; i++; P0=ledbuff[1]; break;  
                                case 2:
                          P20=1; P21=1; P22=0; i++; P0=ledbuff[2]; break;
                                case 3:
                          P20=0; P21=1; P22=0; i++; P0=ledbuff[3]; break;
                                case 4:
                          P20=1; P21=0; P22=0; i++; P0=ledbuff[4]; break;
                                case 5:
                          P20=0; P21=0; P22=0; i=0; P0=ledbuff[5]; break;
                                default: break;
                  }
                }
        }
}

利用了中断之后的程序
#include<reg52.h>

sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;

unsigned char ledchar[]={
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};

unsigned char ledbuff[]={
        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

  unsigned int cnt=0;
        unsigned char i=0;
  unsigned char flag1s=0;

void main ()
{
  unsigned long sec=0;
        
        ENLED=0;
        TMOD=0x01;
        TH0=0xF5;
        TL0=0x55;
        TR0=1;
        EA=1;
        ET0=1;
        
        while(1)
        {
                        if(flag1s==1)
                        {
                                flag1s=0;
                                sec++;
                                if(sec>=0){ledbuff[0]=ledchar[sec%10];}
                                if(sec>=10){ledbuff[1]=ledchar[sec/10%10];}
                                if(sec>=100){ledbuff[2]=ledchar[sec/100%10];}
                                if(sec>=1000){ledbuff[3]=ledchar[sec/1000%10];}
                                if(sec>=10000){ledbuff[4]=ledchar[sec/10000%10];}
                                if(sec>=100000){ledbuff[5]=ledchar[sec/100000%10];}
                        }
                }
        }
void interruptTime() interrupt 1
{
        TH0=0xF5;
  TL0=0x55;
        cnt++;
        if(cnt>=1000)
        {
                cnt=0;
                flag1s=1;               
        }
        P0=0xFF;
        switch(i)
                        {
                                case 0:
                          P20=1; P21=0; P22=1; i++; P0=ledbuff[0];break;
                                case 1:
                          P20=0; P21=0; P22=1; i++; P0=ledbuff[1];break;
                                case 2:
                          P20=1; P21=1; P22=0; i++; P0=ledbuff[2];break;
                                case 3:
                          P20=0; P21=1; P22=0; i++; P0=ledbuff[3];break;
                                case 4:
                          P20=1; P21=0; P22=0; i++; P0=ledbuff[4];break;
                                case 5:
                          P20=0; P21=0; P22=0; i=0; P0=ledbuff[5];break;
                                default: break;
                  }
}关于金沙滩课后作业:
数码管从999999开始倒计时很简单,只需对之前写的程序改写就可以实现(sec=999999;之后的sec++改为sec--)即可。
采用定时器1,和采用定时器0一样,没有不同。




好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表