;************************************************************************** ; 标题: 四位数码管计数演示(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.3.2 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过,数码管为8位共阳 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start org 0030h start: mov 30h,#0 ;30单元存储个位值 mov 31h,#0 ;31单元存储十位值 mov 32h,#0 ;32单元存储百位值 mov 33h,#0 ;33单元存储千位值 mov p2,#0xff ;关所有数码管 mov dptr,#table ;数码管段码表首址送入dptr lop: lcall display ;调用显示子程序 inc 30h ;个位值加1 mov a,30h ;个位值送入a cjne a,#10,over ;个位未到10则结束此次循环 mov 30h,#0 ;个位到10清零 inc 31h ;十位值加1(个位到10的进位) mov a,31h ;十位值送入a cjne a,#10,over ;十位未到10则结束此次循环 mov 31h,#0 ;十位到10清零 inc 32h ;百位值加1(十位到10的进位) mov a,32h ;百位值送入a cjne a,#10,over ;百位未到10则结束此次循环 mov 32h,#0 ;百位到10清零 inc 33h ;千位值加1(百位到10的进位) mov a,33h ;千位值送入a cjne a,#10,over ;千位未到10则结束此次循环 mov 33h,#0 ;千位到10清零 over: ajmp lop ;循环 display: ;显示子程序 mov r0,#50 ;用于延长四位数的显示时间 d_lop: mov a,30h ;取个位值 movc a,@a+dptr ;个位数对应的段码送入a中 mov p0,a ;段码送入P0口 mov p2,#0x7f ;开个位显示(P2.7口控制个位数码管) lcall d_1ms ;延时1ms使四位数码管动态显示时能看清 mov a,31h ;取十位值 movc a,@a+dptr ;十位数对应的段码送入a中 mov p0,a ;段码送入P0口 mov p2,#0xbf ;开十位显示(P2.6口控制十位数码管) lcall d_1ms ;延时1ms作用同上 mov a,32h ;取百位值 movc a,@a+dptr ;百位数对应的段码送入a中 mov p0,a ;段码送入P0口 mov p2,#0xdf ;开百位显示(P2.5口控制十位数码管) lcall d_1ms ;延时1ms作用同上 mov a,33h ;取千位值 movc a,@a+dptr ;千位数对应的段码送入a中 mov p0,a ;段码送入P0口 mov p2,#0xef ;开千位显示(P2.4口控制十位数码管) lcall d_1ms ;延时1ms作用同上 djnz r0,d_lop ;延长每个四位数的显示时间 ret 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,0x80,0x90 ;段码表 ; 0 1 2 3 4 5 6 7 8 9 对应内容 end /************************************************************************** * 标题: 四位数码管计数演示(C51) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.3.2 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过,数码管为8位共阳 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> #define uchar unsigned char void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 void display(); // 显示子程序 uchar code dis_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表 // 0 1 2 3 4 对应内容 0x92,0x82,0xf8,0x80,0x90}; // 5 6 7 8 9 uchar data dis_0 = 0; // 个位值 uchar data dis_1 = 0; // 十位值 uchar data dis_2 = 0; // 百位值 uchar data dis_3 = 0; // 千位值 void main() { P2 = 0xff; // 关所有数码管 while(1) { display(); // 调用显示子程序 dis_0++; // 个位值加1 if(dis_0 != 10) // 个位未到10则结束此次循环 continue; dis_0 = 0; // 个位到10清零 dis_1++; // 十位值加1(个位到10的进位) if(dis_1 != 10) // 十位未到10则结束此次循环 continue; dis_1 = 0; // 十位到10清零 dis_2++; // 百位值加1(十位到10的进位) if(dis_2 != 10) // 百位未到10则结束此次循环 continue; dis_2 = 0; // 百位到10清零 dis_3++; // 千位值加1(百位到10的进位) if(dis_3 != 10) // 千位未到10则结束此次循环 continue; dis_3 = 0; // 千位到10清零 } } void display() // 显示子程序 { uchar data i = 50; // 用于延长每四位数的显示时间 while(i--) // 直到i减为0 { P0 = dis_code[dis_0]; // 取个位的段码 P2 = 0x7f; // 开个位显示(P2.7口控制个位数码管) delay_ms(1); // 延时1ms使四位数码管动态显示时能看清 P0 = dis_code[dis_1]; // 取十位的段码 P2 = 0xbf; // 开十位显示(P2.6口控制十位数码管) delay_ms(1); // 延时1ms作用同上 P0 = dis_code[dis_2]; // 取百位的段码 P2 = 0xdf; // 开百位显示(P2.5口控制十位数码管) delay_ms(1); // 延时1ms作用同上 P0 = dis_code[dis_3]; // 取千位的段码 P2 = 0xef; // 开千位显示(P2.4口控制十位数码管) delay_ms(1); // 延时1ms作用同上 } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); } /* 计数部分还可用如下方式实现 dis_0++; // 个位值加1 if(dis_0 == 10) // 个位未到10则结束 { dis_0 = 0; // 个位到10清零 dis_1++; // 十位值加1(个位到10的进位) if(dis_1 == 10) // 十位未到10则结束 { dis_1 = 0; // 十位到10清零 dis_2++; // 百位值加1(十位到10的进位) if(dis_2 == 10) // 百位未到10则结束 { dis_2 = 0; // 百位到10清零 dis_3++; // 千位值加1(百位到10的进位) if(dis_3 == 10) // 千位未到10则结束 dis_3 = 0; // 千位到10清零 } } } */

评论