工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->微机单片机电路图->单片机综合电路图->多位数码管动态显示定时器中断实现-----LED driving method

多位数码管动态显示定时器中断实现-----LED driving method

作者:dolphin时间:2012-11-22

・ ;**************************************************************************
・ ;标题:多位数码管动态显示定时器中断实现(汇编)
・ ;软件:KeilA51V8.00
・ ;芯片:AT89X51
・ ;说明:实验板实测通过,数码管为8位共阳
・ ;**************************************************************************
・ org0000h
・ ajmpstart
・ org000bh;定时器0的中断入口地址
・ ajmptime0;跳到定时器0的中断服务程序处
・ org0030h
・ start:mov30h,#0;30单元为显示值(查段码表时的偏址)兼循环控制,初始为0
・ mov31h,#0xfe;31单元为位码(选通各位数码管),初值为11111110
・ movp2,#0xff;关所有数码管
・ movdptr,#table;段码表首址
・ movtmod,#00000001b;定时/计数器0工作于方式1
・ movth0,#0xfc
・ movtl0,#0x18;预置定时常数64536(fc18)
・ setbea;开总中断
・ setbet0;定时/计数器0允许中断
・ setbtr0;启动定时/计数器0
・ ajmp$;原地等待中断
・ time0:;定时器0的中断服务程序
・ clrea;关总中断
・ pushacc;保护现场
・ pushpsw
・ mova,30h;取欲显示值
・ movca,@a+dptr;对应段码表中码值送入a
・ movp0,a;段码送入P0口
・ movp2,31h;位码(在31h单元中)送入P2口
・ mova,31h;取位码到a
・ rla;位码循环左移以选通下一个数码管
・ mov31h,a;更改后的位码送回31h单元
・ inc30h;30单元加1以显示下一个数(循环控制加1)
・ anl30h,#0x07;使30单元增到8时自动归0(控制30单元在0~7之间)
・ movth0,#0xfc;重置定时常数
・ movtl0,#0x18
・ poppsw
・ popacc
・ setbea;开总中断
・ reti
・ table:db0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8;段码表
・ ;01234567对应内容
・ db0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
・ ;89abcdef
・ end

・ /**************************************************************************
・ *标题:多位数码管动态显示定时器中断实现(C51)
・ *软件:KeilC51V8.02
・ *芯片:AT89X51
・ *说明:实验板实测通过,数码管为8位共阳
・ *声明:自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!
・ **************************************************************************/
・ #include
・ #include
・ #defineucharunsignedchar
・ ucharcodedis_code[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,//段码表
・ //01234567//对应内容
・ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
・ //89abcdef
・ uchardatai=0x00;//循环控制变量兼偏移量,初值为0
・ uchardataj=0xfe;//位码(选通各位数码管),初值为11111110
・ voidmain()
・ {
・ P2=0xff;//关所有数码管
・ TMOD=0x01;//定时/计数器0工作于方式1
・ TH0=0xfc;//装载定时常数64536(fc18)
・ TL0=0x18;
・ EA=1;//开总中断
・ ET0=1;//定时/计数器0允许中断
・ TR0=1;//启动定时/计数器0
・ while(1);//执行主程序,等待中断
・ }
・ voidtime0(void)interrupt1//T/C0中断服务程序(延时1ms)
・ {
・ P2=j;//位码送入P2口显示
・ P0=dis_code[i];//段码表中取值送P0口
・ j=_crol_(j,1);//位码循环左移1位选通下一数码管
・ i++;//偏移量加1取下一段码(循环控制加1)
・ i=0x07;//偏量增到8时自动归0(控制在0~7之间循环)
・ TH0=0xfc;//重新装载定时常数
・ TL0=0x18;

・ }

多位数码管动态显示定时器中断实现LED driving method



评论

技术专区