:使用两个数码管,并从01开始,每隔1s数码管加1,:#include<>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2^6;//段选,申明锁存器1的锁存端sbitwela=P2^7;//位选,申明锁存器2的锁存端ucharcodetable[]=//共阴极数码管编码{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddelayms(uintxms)//延时xms{uinti,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}voiddisplay(uchar,uchar);ucharnum,num1=1,shi,ge=1;//赋初值voidmain(){TMOD=0x10;//设定时器1方式1定时50ms,循环20次实现1s延时TH1=(65536-50000)/256;//装初值TL1=(65536-50000)%256;EA=1;//开总中断ET1=1;//开定时器1中断TR1=1;//启动定时器1while(1)//在这里不停的对数码管动态扫描等待中断发生{display(shi,ge);}}voiddisplay(ucharshi,ucharge)//显示子函数{dula=1;P0=table[shi];//送段选数据dula=0;P0=0xff;//消影,送位选数据前关闭所有显示,防止打开位选锁存时wela=1;//原来段选数据通过位选锁存器造成混乱P0=0xfe;//送位选数据wela=0;delayms(5);//延时dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(5);}voidT1_time()interrupt3{ TH1=(65536-50000)/256;//重装初值TL1=(65536-50000)%256;num++;if(num==20)//20次循环,50ms20次=1s{num=0;//到20次以后清零重新再计数20次 num1++;//数码管显示加1 if(num1==61)//数码管显示到60后又从01开始 num1=1; shi=num1/10;//把两位数分离后分别送数码管显示十位和个位 ge=num1%10; }} 0000HAJMP 000BH //定时器0的中断入口地址AJMP 0030H Main:MOVR0,#1 //初始值从01开始 MOV R4,#20 //循环20次来实现1s延时 MOV DPTR,#TABLE //表头地址送给DPTR MOV TMOD,#01H//定时器0方式1定时50ms MOV TH0,#03CH//赋初值 MOV TL0,#0B0H SETB EA //开总中断 SETB ET0 //
数码管动态显示C语言和汇编程序 来自淘豆网www.taodocs.com转载请标明出处.