本文共 6450 字,大约阅读时间需要 21 分钟。
/********************************************************************** 硬件资源:瑞萨R5F211B4程序编制:林华电子商行淘宝店网址:http://shop70189212.taobao.com本程序实现功能:定时器X产生时间,分别显示秒和分钟 学习1天24小时程序设计/***********************************************************************/#include "sfr_R81B.h" //Definition of R8C/1B SFR#define _Disableint asm("Fclr I") //I标志位为0,则禁止所有的可屏蔽中断#define _Enableint asm("Fset I") //I标志位置1,表示打开总中断控制#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define LOW ((_Bool) 0)#define HIGH ((_Bool) 1)#define Clock p1_0#define Data p1_1#define DS1 p1_7#define DS2 p1_6#define DS3 p1_5#define DS4 p1_4uint second; //到1秒钟计时uint delay0; //四位数码管中间小数点闪烁时间uchar minute; //分钟到小时计时uchar hour; //1天24小时计时uchar second0; //秒到分钟计时uchar display0_bak; //uchar display_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; //f1 prcr=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写0 txck1=0;txck0=0; //f1 prex=120-1; //t=((100*120)/12M)s tx=100-1; txic=6; //中断优先级6 txs=1; //定时器开始计数 } /************************************************************************** 程序名称:定时器X中断处理 **************************************************************************/#pragma INTERRUPT TimerXInt(vect=22)void TimerXInt(void){ display(); display_count0 += 1;//显示位数+1 if(display_count0 > 3) //四位显示完吗 { display_count0 = 0;//清零 重新开始显示 } second++; //秒单元计时 delay0++; //小数点闪烁计时 if(second > 1000) //定时器1ms中断1次,1S=1000*1ms=1s { second = 0;//清零 重新开始 second0++; //秒单位+1 if(second0 > 59)//60秒到吗 { second0 = 0;//到 秒清零 minute++;//分钟单位+1 if(minute > 59)//60分钟到吗 { minute = 0; //是 分钟清零 hour++;//小时单位+1 if(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 } } }
转载地址:http://tfuib.baihongyu.com/