FourDigitDisplay
来源:互联网 发布:c语言运算符号优先级 编辑:程序博客网 时间:2024/06/15 03:53
/********************************************************************** 硬件资源:瑞萨R5F211B4程序编制:林华电子商行淘宝店网址:http://shop70189212.taobao.com本程序实现功能:定时器X产生时间,分别显示秒和分钟 学习1天24小时程序设计/***********************************************************************/#include "sfr_R81B.h" //Definition of R8C/1B SFR#define_Disableintasm("Fclr I") //I标志位为0,则禁止所有的可屏蔽中断#define_Enableintasm("Fset I") //I标志位置1,表示打开总中断控制#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#defineLOW((_Bool) 0)#defineHIGH((_Bool) 1)#defineClockp1_0#defineDatap1_1#defineDS1p1_7#defineDS2p1_6#defineDS3p1_5#defineDS4p1_4uintsecond;//到1秒钟计时uintdelay0;//四位数码管中间小数点闪烁时间ucharminute;//分钟到小时计时ucharhour;//1天24小时计时ucharsecond0;//秒到分钟计时uchardisplay0_bak;//uchardisplay_count0;//显示位计数_Bool flash_bit0;//小数点闪烁标志位uchar near display_buffer[]={0,0,0,0};//显示缓冲区,上电默认显示0000uchar far display0[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};void InitClock(void);//初始化时钟void Init_IO(void);//初始化IO口void InitTimerX(void);//初始化X定时器void display(void);//四个数码管显示void flash_light(void);//四位数码管中间小数点闪烁void main(void) {_Disableint; //禁止全局中断 InitClock(); //外部部高速振荡器Init_IO(); //IO口初始化InitTimerX(); //定时器X初始化_Enableint; //允许全局中断 while(1){asm("NOP\nNOP\nNOP\nNOP"); } }/************************************************************************程序名称:系统时钟初始化 选主时钟 1分频************************************************************************/void InitClock(void){ prcr=0x01; //关闭和时钟相关的保护寄存器,允许修改时钟 cm13=1; //XIN-XOUT引脚cm15 =1; //XIN-XOUT引脚使用高驱动能力cm05=0; //开始振荡asm("NOP\nNOP\nNOP\nNOP");asm("NOP\nNOP\nNOP\nNOP");ocd2=0x00; //使用主时钟作为系统时钟 cm16=0;cm17=0;cm06=0; //f1prcr=0; //打开保护寄存器}/*************************************************************************函数原型: Init_IO*功能 :初始化IO口 pd1_0 = 1 output =0 input 默认0 input************************************************************************/void Init_IO(void){ pd1 = 0xf3; //p1_0 pd1_1 pd1_4 pd1_5 pd1_6 pd1_7=1为输出口p1 = 0x00;//输出0 }/************************************************************************ 定时器X:定时1ms初始化设置************************************************************************/void InitTimerX(void){txs=0; //定时器X停止计数txmr=0x00; //定时器X寄存器txmr写0txck1=0;txck0=0; //f1prex=120-1; //t=((100*120)/12M)stx=100-1;txic=6; //中断优先级6txs=1; //定时器开始计数 } /************************************************************************** 程序名称:定时器X中断处理 **************************************************************************/#pragma INTERRUPT TimerXInt(vect=22)void TimerXInt(void){display();display_count0 += 1;//显示位数+1if(display_count0 > 3) //四位显示完吗{display_count0 = 0;//清零 重新开始显示}second++;//秒单元计时delay0++; //小数点闪烁计时if(second > 1000) //定时器1ms中断1次,1S=1000*1ms=1s{second = 0;//清零 重新开始second0++; //秒单位+1if(second0 > 59)//60秒到吗{second0 = 0;//到 秒清零minute++;//分钟单位+1if(minute > 59)//60分钟到吗{minute = 0;//是 分钟清零hour++;//小时单位+1if(hour > 23)//24小时到吗{hour = 0;//到 清零重新开始}}}}display_buffer[3] = second0%10;//十进制秒个位display_buffer[2] = second0/10;//十进制秒十位display_buffer[1] = minute%10;//十进制分钟个位display_buffer[0] = minute/10;//十进制分钟十位ir_txic=0; //无中断请求标志 } /*******************************************************************************程序名称: 164发送一个字节, 功能描述:上升沿锁存数据输入变量: data 发送数据 输出变量:无影响标志位:无********************************************************************************/void send_data(uchar data_164){ uchar i; for(i = 0;i < 8;i++) //连续发送0-7位{if(data_164 & 0x80)//判断BYTE.7是高电平还是低电平 {Data = HIGH;//高电平=1}else{Data = LOW;//低电平=0}data_164 <<= 1;//数据左移1位Clock = LOW;//置时钟低电平asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");Clock = HIGH;//置时钟高电平asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");}}/************************************************************************程序名称:7SEG4DIGIT显示 功能描述:串行发送数据 位选直接P14-P17驱动输入变量: 输出变量:影响标志位:************************************************************************/void display(void){DS1 = 1;//关千位 DS2 = 1;//关百位 DS3 = 1;//关十位 DS4 = 1; //关个位switch(display_count0){ case 0: //千位显示 display0_bak = display0[display_buffer[display_count0]]; //根据数字查表千位数据 flash_light(); // 中间小数点闪烁0.5S亮0.5S灭 send_data(display0_bak);//串行发送数据给74HC164 DS1 = 0; //开千位 DS2 = 1;//关百位 DS3 = 1;//关十位 DS4 = 1; //关个位 break; case 1: //百位显示 display0_bak = display0[display_buffer[display_count0]];//根据数字查表百位数据 flash_light(); //中间小数点闪烁:0.5S亮0.5S灭 send_data(display0_bak);//串行发送数据给74HC164 DS1 = 1;//关千位 DS2 = 0;//开百位 DS3 = 1;//关十位 DS4 = 1; //关个位 break; case 2: //十位显示display0_bak = display0[display_buffer[display_count0]];//根据数字查表十位数据flash_light(); //中间小数点闪烁0.5S亮0.5S灭send_data(display0_bak);//串行发送数据给74HC164 DS1 = 1;//关千位 DS2 = 1;//关百位 DS3 = 0;//开十位 DS4 = 1; //关个位 break;case 3://个位显示display0_bak = display0[display_buffer[display_count0]];//根据数字查表个位数据flash_light(); //中间小数点闪烁0.5S亮0.5S灭send_data(display0_bak);//串行发送数据给74HC164 DS1 = 1;//关千位 DS2 = 1;//关百位 DS3 = 1;//关十位 DS4 = 0; //开个位 break;default:asm("NOP");asm("NOP");break;}}/***********************************************************************程序名称:小数点闪烁 功能描述:小数点0.5秒周期闪烁输入变量: 无 输出变量:无 影响标志位:flash_bit0灯亮灭转换标志 ************************************************************************/void flash_light(void){if(!flash_bit0){display0_bak &= 0x7f; //点亮小数点if(delay0 > 500)//0.5秒到吗?{delay0 = 0;//是,清零flash_bit0 = 1;//置灭标志}}else{display0_bak |= 0x80;//灭灯if(delay0 > 500)//0.5秒到吗?{delay0 = 0;//是 清零flash_bit0 = 0;//置亮标志0}}}