📄 demo_key_test.c
字号:
/*********************************************************************
工程名 :Demo_key_test
程序名 :同上
创建时间:11月4日
创建单位:广西师范大学
专业 :电子信息工程
作者 :陈哲(06电信)
程序作用:按键识别,按下按键后,数码管切换不同的显示
实验CPU :ATMEGA16
晶振 :内部8MHZ
版本 :1.0
修改人 :
修改时间:
*************************************************************************/
//思考:1。按键消抖除了延时还有没有更加好的方法?
// 2。AVR没有位操作,那要怎样进行位操作?
// 3。阅读相关资料,思考硬件消抖和软件消抖的区别,和软件消抖的好处
#include<avr/io.h>
#include<util/delay.h>
#define uchar unsigned char
#define uint unsigned int
uchar disbeat_run[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar disnumber_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极数码管,分别表示:0 1 2 3 4 5 6 7 8 9 A b C d E F
//**************端口初始化程序*************************//
void port_init()
{
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
DDRB&=~(1<<0);//出现AVR的位操作
PORTB=0xff;
}
//****************显示程序1*************************//
//****************显示01234567*********************//
void led_display_1()
{
uchar j;
for(j=0;j<8;j++)
{
PORTA=disnumber_code[j];
PORTC=disbeat_run[j];
_delay_ms(2);
}
}
//***************显示程序2***************************//
//********************显示89ABCDEF*******************//
void led_display_2()
{
uchar i;
for(i=8;i<16;i++)
{
PORTA=disnumber_code[i];
PORTC=disbeat_run[i];
_delay_ms(2);
}
}
//****************主函数开始****************************//
void main()
{
uchar flat=0;//设定一个标志位,为以后的状态选择做准备
//不同的状态对应不同的输出结果 如果flat是0,进入状态1输出“01234567”如果
//flat是1进入状态2输出“89ABCDEF”
//flat为2时,则从状态2跳到状态3,状态3时即把flat从新给0,回到状态1
port_init();
while(1)
{
if((PINB&0x01)==0) //消抖要检测两次,这是最基本的写法
{
_delay_ms(10); //延时10毫秒是为了消抖
if((PINB&0x01)==0)
{
flat++;
while((PINB&0x01)==0); //思考出现这条语句的作用是什么,有和没有有区别吗
//这条语句是为了保证按下按键多久,flat都只加1;如果没有,就会连续加下去
//这样就不符合实际的要求
}
}
//三种状态,有限状态机的思想
if(flat==0) //状态1
{
led_display_1();
}
if(flat==1) //状态2
{
led_display_2();
}
if(flat==2) //状态3
{
flat=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -