/*************************************************
*功能描述: CEPARK CAN开发板-数码管显示中断计数
*说明:每按一次中断按键,计数值加一,在数码管上显示
*版本:v2.00
*声明:程序来自网络,欢迎网友交流改进
* 活跃论坛,共同进步
*作者:协成电子 、hnrain
*时间:2010/09/14
*邮箱:hnrain1004@gmail.com ,HQL19982003@163.com ,qq:87675298
*网站:bbs.cepark.com ;写程序如果有问题,可以在这里讨论
*我们的口号:让不懂can的学习者,也能轻松玩转can
*推荐教材:
饶运涛,邹继军《现场总线 CAN 原理与应用技术》.北京:北京航空航天大学出版社 (这本书,看着不错)
周立功《增强型80c51单片机速成与实战》还有周立功写的一些can通信程序算法很不错,值得学习
本程序,融入了那么一点点点点点,他们的编程思想,哈哈....仅供学习用
****************************************************/
#include <reg52.h>
#include <intrins.h>
#include <config.h>
//数码管段码显示:0~f,不亮
uint8 code LED_Disp[] = {0xc0,0xde,0xa2,0x8a,0x9c,0x89,0x81,0xda,0x80,0x88,
0x90,0x85,0xe1,0x86,0xa1,0xb1,0xff};
sfr LedPort = 0x80; //段选段P0
sfr LedCtrl = 0xa0; //位选段P2
uint8 Txd_data;
uint8 DisBuff[4];
//INT0为计数按键
void INT0_Counter(void) interrupt 0
{
EA = 0;
Txd_data++; //计数单元加1
EA = 1;
}
void mDelay(uint16 mtime)
{
for(; mtime > 0; mtime--)
{
uint8 j = 244;
while(--j);
}
}
//初始化CPU
void CPU_init(void)
{
IT0 = 1;//外部中断0负边沿触发
EX0 = 1;//打开外部中断0
EA = 1; //打开总中断
}
void LED_Disp_Seg7()
{
LedCtrl = LedCtrl | 0xf0;
DisBuff[0] = Txd_data%10;//取个位数
DisBuff[1] = Txd_data%100/10; //取十位数
// DisBuff[2] = Rxd_data%10; //百位数
// DisBuff[3] = Rxd_data%100/10; //千位数
LedPort = LED_Disp[DisBuff[0]];
LedCtrl = LedCtrl & 0x7f;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[1]];
LedCtrl = LedCtrl & 0xbf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
#if 0
LedPort = LED_Disp[DisBuff[2]];
LedCtrl = LedCtrl & 0xdf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[3]];
LedCtrl = LedCtrl & 0xef;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
#endif
}
void main(void)
{
CPU_init();
_nop_();
while(1)
{
mDelay(5);
LED_Disp_Seg7();
}
}
|