博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FourDigitDisplay
阅读量:2300 次
发布时间:2019-05-09

本文共 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/

你可能感兴趣的文章
php源码之路第四章第一节( 函数的内部结构)
查看>>
【Day36】PHP定时任务获取微信access_token
查看>>
数据库行转列的sql语句 (抛砖引玉)
查看>>
Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
查看>>
如何将tomcat控制台输出的内容直播用日志文件保存起来(Log4j)
查看>>
DB2 的 case when then else end 条件分支的处理
查看>>
POI读取Excel(兼容Excel2003、Excel2007)
查看>>
ActionContext(Struts中的Action类里)和ServletActionContext(HttpServlet类里的)【区别】小结
查看>>
关于ActionContext.getContext()的用法心得
查看>>
Struts2+JQuery.uploadify插件实现带进度的多文件上传示例【也可以设置去掉进度条的显示】
查看>>
用java存oracle数据库的date类型精确到秒【java.sql.Date 和java.util.Date的区别】
查看>>
jquery-easyui实现页面布局和增删改查操作(SSH2框架支持)
查看>>
EasyUI--datebox设置默认时间【dateTimeBox类似】
查看>>
easyui datetimebox处理【前台传递到后台是string类型,但是后台定义的是java.util.date,如何自动转换数据类型】
查看>>
jquery easyui 对于开始时间小于结束时间的判断示例
查看>>
java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
查看>>
jQuery.validator.addMethod自定义验证方法【在表单验证中的使用 $("#appEdit_Form").validate({rules : {},messages:{}】
查看>>
jQuery怎么获取一些属性值类似的控件,又怎么遍历他们呢?
查看>>
WARN com.opensymphony.xwork2.ognl.OgnlValueStack异常的解决办法[提交按钮使用了图片并设置name属性,对应action无gettersetter]
查看>>
一般操作需要导入的jquery包(jquery.js包)和 jquery操作select下拉列表(取值及设置选中某一个option)
查看>>