资源描述
· **************************************************************************
· * 标题: 四位数码管对外部中断0响应计数(C51)
· * 作者: wentao
·
· * 日期: 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; // 关所有数码管
·
· IT0 = 1; // 外部中断0下降沿触发
· EA = 1; // 开总中断
· EX0 = 1; // 开外部中断0
·
· while(1)
· {
· display(); // 调用显示子程序等待中断
· }
· }
·
· void int_0() interrupt 0 // 外部中断0中断服务程序
· {
· 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清零
· }
· }
· }
· }
·
· 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++);
· }
展开阅读全文