;************************************************************************** ; 标题: 多位数码管动态显示软延时实现(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.2.21 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过,数码管为8位共阳 ; anl 30h,#07h起如下作用 ; mov a,30h ;取循环控制变量 ; cjne a,#8,lop ;未到8则继续 ; mov 30h,#0 ;到8后清0 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start org 0030h start: mov 30h,#0 ;30单元为显示值(查段码表时的偏址)兼循环控制,初始为0 mov 31h,#0xfe ;31单元为位码(选通各位数码管),初值为11111110 mov dptr,#table ;段码表首址 lop: mov a,30h ;取欲显示值 movc a,@a+dptr ;对应段码表中码值送入a mov p0,a ;段码送入P0口 mov p2,31h ;位码(在31h单元中)送入P2口 lcall d_1ms ;动态显示各位间隔为1ms mov a,31h ;取位码到a rl a ;位码循环左移以选通下一个数码管 mov 31h,a ;更改后的位码送回31h单元 inc 30h ;30单元加1以显示下一个数(循环控制加1) anl 30h,#0x07 ;使30单元增到8时自动归0(控制30单元在0~7之间) ajmp lop ;循环 d_1ms: ;延时1ms子程序@12M(1.001ms) mov r7,#250 ;1+(1+1+2)*250=1001 temp: nop nop djnz r7,temp ret table: db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ;段码表 ; 0 1 2 3 4 5 6 7 对应内容 db 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e ; 8 9 a b c d e f end /************************************************************************** * 标题: 多位数码管动态显示软延时实现(C51) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.2.21 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过,数码管为8位共阳,循环用while * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> #include <intrins.h> #define uchar unsigned char void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 uchar code dis_code[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //段码表 // 0 1 2 3 4 5 6 7 //对应内容 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 8 9 a b c d e f void main() { uchar data i = 0x00; // 循环控制变量兼偏移量,初值为0 uchar data j = 0xfe; // 位码(选通各位数码管),初值为11111110 while(1) { P2 = j; // 位码送入P2口显示 P0 = dis_code[i]; // 段码表中取值送P0口 delay_ms(1); // 动态显示各位间隔为1ms j = _crol_(j,1); // 位码循环左移1位选通下一数码管 i++; // 偏移量加1取下一段码(循环控制加1) i &= 0x07; // 偏量增到8时自动归0(控制在0~7之间循环) } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); } /************************************************************************** * 标题: 多位数码管动态显示软延时实现(C51) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.2.21 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过,数码管为8位共阳,循环用for * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> #include <intrins.h> #define uchar unsigned char void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 uchar code dis_code[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //段码表 // 0 1 2 3 4 5 6 7 //对应内容 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 8 9 a b c d e f void main() { uchar data i = 0x00; // 循环控制变量兼偏移量,初值为0 uchar data j = 0xfe; // 位码(选通各位数码管),初值为11111110 while(1) { for(i = 0; i < 8; i++) { P2 = j; // 位码送入P2口显示 P0 = dis_code[i]; // 段码表中取值送P0口 delay_ms(1); // 动态显示各位间隔为1ms j = _crol_(j,1); // 位码循环左移1位选通下一数码管 } } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); }

评论