⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firstbb1.c

📁 带键盘控制的计时程序
💻 C
字号:
/*********************头文件预定义***********************/
#include<iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int

//数码管引脚顺序0-7:edhcgafb 
/*****管脚定义******/
/*   1  a  f   2  3  b    */
/*   e  d  h  c  g  4    */
/*********************/
uchar const SEG[10]={0x14,0x77,0x4c,0x45,0x27,
                      0x85,0x84,0x57,0x04,0x05};	//共阴数码管0-9段选
uchar const DIG[4]={0x40,0x20,0x10,0x08};	//4位位选

static uint c,cont=0,second=0,minute=0;
/**********************延时子程序************************/
/*void delay_ms(uint k)  //毫秒级延时子函数
{                                                  
	uint i,j;
	for(i=0;i<k;i++)
	{
		for(j=0;j<570;j++);
	}
}

/********************键盘读取子程序**********************/
uchar key_read(void)
{
	uchar lie; 
	uchar i; 
	 
	DDRC=0xff;	//PC口设为输出
	DDRD=0x00;	//PD口设为输入
	PORTC=0x00;	//PC口初始化输出0
    PORTD=0xff;	//PD口初始化为弱上拉输入
	for(i=0;i<10;i++);//延时等待
	lie=PIND; 
    PORTD=0xff;	//端口状态切换过渡 
	
	switch (lie) {/*将按键码转换成键值*/  
                 case  0xff: return 0;               
                 default : return 1;  
                }   
}
uchar get_key(void)
{ 
	unsigned char i; 
    static unsigned char j;//按键记录
        
    i = key_read(); 
    if (i == 0)//无有效按键按下
	{
		j = 0;//清除按键记录
        return 0;//程序退出
	} 

    	j = i;//保存本次采样结果
        //去按键颤抖  
          
       
			return i;   
    
} 

void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xF3; //setup
 TCNT1L = 0xCB;
 OCR1AH = 0x0C;
 OCR1AL = 0x35;
 OCR1BH = 0x0C;
 OCR1BL = 0x35;
 ICR1H  = 0x0C;
 ICR1L  = 0x35;
 TCCR1A = 0x00;
 TCCR1B = 0x04; //start Timer
}
/************************主程序**************************/
int main(void)
{
	CLI();
	DDRB=0xff;  //PB口设为输出
	DDRA=0xff;	//PA口设为输出
	PORTB=0xff; //PB口初始化输出1
	PORTA=0x00;	//PA口初始化输出0  数码管关闭
	
	TCNT0=0xe3;//<1ms的定时初值
	TCCR0=0x03;//定时器0的计数预分频取64
	
	timer1_init();
	
	TIMSK=0x05;//使能T/C0-1中断
	SREG=0x80;//使能中断
	SEI();
	while(1);		
}
/**************T/C0中断服务子程序********************/
#pragma interrupt_handler timer0_ovf_isr:10 
void timer0_ovf_isr(void)
{
 	 
	 SREG=0x80;//使能中断
	 TCNT0=0xe3;//重装1ms定时初值	
     if(++c>3) c=0; 					    	 
	 switch(c)
	 {
	  case 0: PORTB=SEG[cont];PORTA=DIG[0];break;
	  case 1: PORTB=SEG[second%10];PORTA=DIG[1];break;
	  case 2: PORTB=SEG[second/10];PORTA=DIG[2];break;	 
	  case 3: PORTB=SEG[minute];PORTA=DIG[3];break;	 
	  default: break; 
	 }
	 	 
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
	  		 SREG=0x80;//使能中断
				timer1_init();
	  		  	  if(get_key()==0)
			     {	 		
				 			 cont++;
							 if(cont==10) 
							 {
				 				   cont=0;
				 				   second++;
				  				    if(second==60)
									 {
									        second=0;
										   	minute++;
										    if(minute==10) minute=0;
									 }	
	          				 } 
				 }

				
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -