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}}}

原创粉丝点击