数码管无限循环

#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;
}
}
}
}

原文地址:https://www.cnblogs.com/296389183yy/p/8688185.html