📄 counter1.11.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 + -