;************************************************************************** ; 标题: 两位数码管计数演示(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.3.2 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过,数码管为8位共阳 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** dis_0 equ 30h ;30单元存储个位值 dis_1 equ 31h ;31单元存储十位值 count equ 32h ;32单元为计数器 org 0000h ajmp start org 0030h start: mov count,#0 ;计数器清0 mov p2,#0xff ;关所有数码管 lop: lcall display ;调用显示子程序 inc count ;计数器加1 mov a,count ;计数器值送入a cjne a,#100,lop ;未计到100继续计数 ajmp start ;计到100则重新开始循环 display: ;显示子程序 mov a,count ;计数器值送入a(被除数) mov b,#10 ;除数10送入b div ab ;a除以b mov dis_0,b ;余数b(个位值)送入个位存储单元 mov dis_1,a ;商a(十位值)送入十位存储单元 ;以上是将计数值个位十位分开 ;以下是将分开的个位十位分别在两个数码管上显示 mov r0,#200 ;用于延长每个数(两位)的显示时间 d_lop: mov dptr,#table ;数码管段码表首址送入dptr mov a,dis_0 ;取个位值 movc a,@a+dptr ;个位数对应的段码送入a中 mov p0,a ;段码送入P0口 mov p2,#0x7f ;开个位显示(P2.7口控制个位数码管) lcall d_1ms ;延时1ms使两位数码管动态显示时能看清 mov a,dis_1 ;取十位值 movc a,@a+dptr ;十位数对应的段码送入a中 mov p0,a ;段码送入P0口 mov p2,#0xbf ;开十位显示(P2.6口控制十位数码管) 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; // 个位值 uchar data dis_1; // 十位值 uchar data count; // 计数器 void main() { count = 0; // 计数器清零 P2 = 0xff; // 关所有数码管 while(count != 100) { display(); // 调用显示子程序 count++ ; // 计数器加1 } } void display() // 显示子程序 { uchar data i = 200; // 用于延长每个数(两位)的显示时间 dis_1 = count / 10; // 计数器十位分离出来赋绐dis_1 dis_0 = count % 10; // 计数器个位分离出来赋绐dis_0 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作用同上 } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); }

评论