数码管无限循环
#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;
   }
  }
}
}
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号