zoukankan      html  css  js  c++  java
  • 数码管无限循环

    #include"STC15F2K60S2.H"
    #include"intrins.h"
    #define uint unsigned int //预处理
    #define uchar unsigned char
    #define led_output P0  //输出数据
    sbit WR=P3^6;
    uchar code tabe[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //tabe定义错误led_line
    uchar code tabe1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};               //tabe1定义错误led_column
    uchar mack;
    void Delay100ms(unsigned int m) //@11.0592MHz 延时
    {
    unsigned char i, j, k;
    unsigned int z;
    for(z=m;z>0;z--)
    {
    _nop_();
    _nop_();
    i = 5;
    j = 52;
    k = 195;
    do
    {
    do
    {
    while (--k);
    } while (--j);
    } while (--i);
    }
    }

    void show( )
    {
    P2=0xff;//打开段选控制Y7
    led_output=tabe[mack%10];//亮
    P2&=0x1f; //关闭U7锁存器
    P2=0xdf;//打开位选控制Y6
    led_output=tabe1[mack%9];//
    WR=0; //始终为0
    P2&=0x1f; //关闭U8锁存器
    Delay100ms(10);
    }
    void main( )
    {
    while(1)
    {
    show( );//数码管显示
    mack++;//显示的数值自动加一
    Delay100ms(10);
    if(mack==10)//判断mack为99时,给它清0
    mack=0;
    }
    }

    第一种方法 //无限从左到右0到9

    如果 要右到左,改位选的位置,缺点是两个变量,不能无限亮 mack==90;b不能解决问题

    改了延时,用了for语句

    #include"STC15F2K60S2.H"
    #include"intrins.h"
    #define uint unsigned int
    #define uchar unsigned char
    #define led_output P0

    #define led_duan_and_wei P2 //共阳极数码管
    sbit WR=P3^6;
    uchar code tabe[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段选,1,2,3,4,5,6,7,8,9//tabe定义错误led_line
    uchar code tabe1[ ]={0x080,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // 显示位选第八位到一位          //tabe1定义错误led_column
    uchar mack; //显示数码管的数

    void Delay100ms(unsigned int data1) //@11.0592MHz 延时子程序 变量data1
    {
    unsigned int i, j; //定义i,j
    for(i=0;i<=data1;i++) //判断
    {
    for(j=0;j<=32700;j++) //判断
    }
    }

    void show( )
    {
    led_duan_and_wei=0xff;//打开段选控制Y7信号
    led_output=tabe[mack%10];//取余选择亮的段选数据
    led_duan_and_wei&=0x1f; //清零,关闭U7锁存器

    led_duan_and_wei=0xdf;//打开位选控制Y6
    led_output=tabe1[mack%8];//选位选的位
    led_duan_and_wei&=0x1f; //关闭U8锁存器
    }
    void main( )
    {
    WR=0; //始终为0

    while(1)
    {
    show( );//数码管显示
    mack++;//显示的数值自动加一
    Delay100ms(10);
    if(mack==90)//判断mack为90时,给它清0
    mack=0;
    }
    }

    学习时,改程序时要把程序重新建立项目,这样可以保留自己思路,自己怎么修改的,自己的思考

    第三种方法,改进方法

    #include<STC15F2K60S2.H>//分开控制段和位,段选和位选不同,要分开控制,num和index可以融合成一个,变量相同,add1和add2变量不同
    #include"intrins.h"                            //注意共阳极数码管的原理
    #define uint unsigned int //预处理
    #define uchar unsigned char
    #define led_output P0
    #define led_duan_and_wei P2 //共阳极数码管
    unsigned char add1,add2;    //变量
    unsigned int num=52700,index=52700;//可以合并成一个变量,在数码管的位选和段选相同时,2的n次方可以用&,比如8段8位,2的3次方add&=0x07,num和index也可以融成一个变量
    uchar code tabe[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段选,1,2,3,4,5,6,7,8,9 //tabe定义错误led_line
    uchar code tabe1[ ]={0x080,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // 显示位选第八位到第一位          //tabe1定义错误led_column
    void main( )
    {
    while(1)
    {
    num++;
    if(num>=52700)
    {
    num=0;
    led_output=tabe1[add2];//选位选的位
    led_duan_and_wei=0xdf;//打开位选控制Y6
    led_duan_and_wei&=0x1f;//关闭U8锁存器
    add2++;
    if(add2>=8)
    {
    add2=0;
    }
    }

    index++;
    if(index>=52700)
    {
    index=0;
    led_output=tabe[add1];//取余选择亮的段选数据
    led_duan_and_wei=0xff;//打开段选控制Y7信号
    led_duan_and_wei&=0x1f; //清零,关闭U7锁存器
    add1++;
    if(add1>=10)
    {
    add1=0;
    }
    }
    }
    }

  • 相关阅读:
    联赛模拟测试22 D. 简单计算
    联赛模拟测试22 B. 分组配对 倍增+二分
    斜率优化DP总结
    洛谷 P5490 【模板】扫描线
    容斥原理学习笔记
    联赛模拟测试20 C. Weed 线段树
    联赛模拟测试20 B. Walk (建图)
    联赛模拟测试20 A. Simple (数学)
    洛谷 P2617 Dynamic Rankings 树套树
    社区团购模式
  • 原文地址:https://www.cnblogs.com/296389183yy/p/8688185.html
Copyright © 2011-2022 走看看