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

📄 counter1.11.c

📁 在数码管上显示按键的次数(按键瞬间计数
💻 C
字号:
/*****************************Copyright(c)***************************
**----------------------------File Info-------------------------

** File name:		按键LED显示Version1.11
** Created by:		邵峰sshaofeng@163.com
** Descriptions:	在数码管上显示按键的次数(按键瞬间计数,按下时仍然显示)
** Date:                2008-9-10
*******************************************************************/

#include <mega16.h>                          //Atmel16的头文件
#include <delay.h>                           //CVAVR的特色delay function.    
#define K1 0x02                              //按键K1与PC.1相连    
//#define K1 1<<6                            //按键K1与PC.4相连,试验时一直显示01,奇怪?因为板子故障,C.2~PC.5四个端口不正常,一直置低电平;
//const char dig0 = 0x40, dig1 = 0x80;/* dig2=0x10, dig3=0x08, dot=0x20*/        //定义静态变量
#define dig0 (1<<6)                          //推荐用这种形式,简单形象
#define dig1 (1<<7)
int i;				         //定义变量类型及赋初值    
unsigned char BCD0, BCD1;
char segconv[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90/*,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf*/};  

/********************************************************************
** 函数名称 :port_init()
** 函数功能 :端口初始化
** 入口参数 :无
** 出口参数 :无
********************************************************************/
 void port_init(void)                       // the initialization function
{
           PORTA = 0x00;             	//设全为低
           DDRA  = 0xFF;                     //设置为输出
           PORTB = 0xFF;			//B口对应数码管7端控制端,且共阳极,若给低一开始便导通,因此置高
           DDRB  = 0xFF;                     //设置为输出
           PORTC = 0xFF;                     //set the default
           DDRC  = 0x00;                     //C口设置为输入
           PORTD = 0x00;                     //LED高电平有效,则初始化时给低电平
           DDRD  = 0xFF;                     
}

/********************************************************************
** 函数名称: BinToBCD() 
** 功能描述: 预给值分位函数
** 入口参数 :预给数值
** 出口参数 :无
********************************************************************/
void BinToBCD(int data)      	         //十进制函数
{
           BCD0=0;                           //BCD0、1、2、3分别为个十百千位
           BCD1=0;			//设初值
           if(data>=10)				    
              {
                        BCD1=data/10;	//商给十位
                        data=data%10;	//余给个位
              }		
           BCD0=data;	
}

/********************************************************************
** 函数名称: dispseg() ;
** 功能描述: 按位显示八段LED数;
** 入口参数 :无
** 出口参数 :无
********************************************************************/
void dispseg(void)
{
           PORTB=segconv[BCD0];	      //本实验板为共阳极,而表为共阴极的表,故用~符号取反后,再送值。
           PORTA=dig0;                    //送数(打开个位LED位选,高电平有效)
           delay_ms(10); 		      //延时10ms
           PORTB=segconv[BCD1];           //写数
           PORTA=dig1;                    //送数(打开十位LED)
           delay_ms(10); 	               //延时10ms   
} 

/********************************************************************
** 函数名称: display() 
** 功能描述: 按所预给数显示
** 入口参数 :data	预给数值
** 出口参数 :无
********************************************************************/
void display(int data)             //集成显示子程序,
{ 
         BinToBCD(data);            //一次定义和运行即可,现在的编写则是每次都需运行,不好。
                                    //说得不对,display()为void函数,而数值与data有关,他每次必用。
         dispseg();
 }

 /******************************************************************************************
**函数名称:           Key_value()
**函数功能:           按键加一函数
**入口参数:           无
**出口参数:           键值i
*******************************************************************************************/
int Key_value(void)                 //在AVR和ARM中,均要区分大小写(对于AVR,至少CVAVR和ICC软件要区分)
{  
   if((PINC&K1)==0)                 //判断PC.1键是否按下
     delay_ms(10);                  //延时去抖,但实践证明不去抖也不出错,可能是现在按键好的缘故    
   if((PINC&K1)==0)                 //再次判断PC.1键是否按下
   {
         i++;                       //若有键按下,i加1    
         PORTD.0=1;                 //用线连接蜂鸣器(J7)和PD.0口,并置一,
         delay_ms(20);              //设置蜂鸣时间
         PORTD.0=0;                 //蜂鸣停止
         if(i>99) i=0;              //★计数循环显示,到99加一后变成00   
         while ((PINC&K1)==0)       //★该行与下一行使在按键的过程中,仍然显示
         display(i);  
         while(!(PINC&K1));         //★等待按键抬起
    }
   return i;                        //返回按键值给调用函数
}
 
/********************************************************************
** 函数名称 :main()
** 函数功能 :主程序:调用端口初始化子程序、按键加一和双LED显示子程序
** 调试说明 :无
********************************************************************/
 main()
{
         port_init();
         while(1)
         {
                  Key_value();
                  display(i);       //★使按键抬起时仍然显示
         }        
}

⌨️ 快捷键说明

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