AVR IO输入之链式按键扫描程序

发布者:中华古风最新更新时间:2020-06-29 来源: eefocus关键字:AVR  IO输入  链式按键扫描 手机看文章 扫描二维码
随时随地手机看文章

系统功能

在AVR的8个IO上挂28个按键,进行链式扫描,一旦扫描到按键被按,做出被按的按键指示。


硬件设计

关于AVR的I/O结构及相关介绍详见Datasheet,这里仅对作部分简单介绍,下面是AVR的I/O引脚配置表:

image.png


AVR主控电路原理图
 
LED控制电路原理图

链式按键扫描电路原理图

软件设计


下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!


//目标系统: 基于AVR单片机

//应用软件: ICC AVR

/*01010101010101010101010101010101010101010101010101010101010101010101

----------------------------------------------------------------------

实验内容:

循环扫描PA口接入的按键,并使用PB口的LED指示灯指示按键的码值。

----------------------------------------------------------------------

硬件连接:

将PB口的LED指示灯使能开关切换到"ON"状态,使其指示按键的码值。

LinkKeyBoard:  K0----K7

                 |    |

SMK1632:       PA0--PA7

----------------------------------------------------------------------

注意事项: 

(1)若有加载库程序,请将光盘根目录下的“库程序”下的“ICC_H”文件夹拷到D盘

(2)请详细阅读:光盘根目录下的“产品资料开发板实验板SMK系列SMK1632说明资料”

----------------------------------------------------------------------

10101010101010101010101010101010101010101010101010101010101010101010*/


#include

#include "D:ICC_HCmmICC.H"


#define  LED_DDR  DDRB

#define  LED_PORT PORTB

#define  KEY_DDR  DDRA

#define  KEY_PORT PORTA

#define  KEY_PIN  PINA


/*--------------------------------------------------------------------

程序名称:链式按键扫描程序

程序功能:键盘检测

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

void scanKey()

{


    KEY_DDR = 0X01;

    KEY_PORT = 0xFE;

    delay50us(1);

    if(KEY_PIN==0xFC)

        LED_PORT=0x01;

    if(KEY_PIN==0xFA)   

        LED_PORT=0x02;

    if(KEY_PIN==0xF6)   

        LED_PORT=0x03;

    if(KEY_PIN==0xEE)   

        LED_PORT=0x04;

    if(KEY_PIN==0xDE)   

        LED_PORT=0x05;

    if(KEY_PIN==0xBE)   

        LED_PORT=0x06;

    if(KEY_PIN==0x7E)   

        LED_PORT=0x07;


    KEY_DDR = 0X02;

    KEY_PORT = 0xFD;

    delay50us(1);

    if(KEY_PIN==0xF9)   

        LED_PORT=0x08;

    if(KEY_PIN==0xF5)   

        LED_PORT=0x09;

    if(KEY_PIN==0xED)   

        LED_PORT=0x0A;

    if(KEY_PIN==0xDD)   

        LED_PORT=0x0B;

    if(KEY_PIN==0xBD)   

        LED_PORT=0x0C;

    if(KEY_PIN==0x7D)   

        LED_PORT=0x0D;


    KEY_DDR = 0X04;

    KEY_PORT = 0xFB;

    delay50us(1);

    if(KEY_PIN==0xF3)   

        LED_PORT=0x0E;

    if(KEY_PIN==0xEB)   

        LED_PORT=0x10;

    if(KEY_PIN==0xDB)   

        LED_PORT=0x11;

    if(KEY_PIN==0xBB)   

        LED_PORT=0x12;

    if(KEY_PIN==0x7B)   

        LED_PORT=0x13;


    KEY_DDR = 0X08;

    KEY_PORT = 0xF7;

    delay50us(1);   

    if(KEY_PIN==0xE7)   

        LED_PORT=0x14;

    if(KEY_PIN==0xD7)   

        LED_PORT=0x15;

    if(KEY_PIN==0xB7)   

        LED_PORT=0x16;

    if(KEY_PIN==0x77)   

        LED_PORT=0x17;


    KEY_DDR = 0X10;

    KEY_PORT = 0xEF;

    delay50us(1);   

    if(KEY_PIN==0xCF)   

        LED_PORT=0x18;

    if(KEY_PIN==0xAF)   

        LED_PORT=0x19;

    if(KEY_PIN==0x6F)   

        LED_PORT=0x1A;


    KEY_DDR = 0X20;

    KEY_PORT = 0xDF;

    delay50us(1);   

    if(KEY_PIN==0x9F)   

        LED_PORT=0x1B;

    if(KEY_PIN==0x5F)   

        LED_PORT=0x1C;


    KEY_DDR = 0X40;

    KEY_PORT = 0xBF;

    delay50us(1);   

    if(KEY_PIN==0x3F)   

        LED_PORT=0x1D;

}

/*--------------------------------------------------------------------

程序名称:

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

void main()

{

    LED_DDR = 0XFF;

    while(1)

        scanKey();

}


系统调试

(1)按键,观察LED的指示。

(2)去除“delay50us(1);”观察效果。

关键字:AVR  IO输入  链式按键扫描 引用地址:AVR IO输入之链式按键扫描程序

上一篇:AVR 定时器ICP功能
下一篇:AVR AT24C02 程序

推荐阅读最新更新时间:2024-11-13 09:19

atmega128 bootloader程序在IAR-AVR下 linker文件的配置及原因
第一步:atmega128的片内flash分区描述 在atmega128 datasheet的275页中有分区描述 对应的在284页中,有具体的应用区与boot区的大小设置 注意:Byte address = word address * 2 这里的BOOT区首地址,$F000 = 0x1E000 根据手册中的描述,我们使用JTAG MKII 烧写器通过软件 Avr Studio 4,配置熔丝位 BOOTSZ为00 注意:这里面的4096 words = 8K bytes 第二步:说明一下linker(.xcl)文件的作用 好了,怎么让我们的程序烧写到flash中是在指定的0x1E000处呢?这就需要在
[单片机]
atmega128 bootloader程序在IAR-<font color='red'>AVR</font>下 linker文件的配置及原因
AVR中如何操作单个IO
WinAVR中如何操作单个IO口 用PORTA|=(1 7) PORTA|=(1 7) 意思是把00000001左移7位再和porta相或 PORTB |= _BV(n) 和 PORTB &= ~_BV(n) sbi() 可以用的 05版装好后的确不能用 sbi()和cbi()。 仔细看资料后,发现头文件里的确没有这两函数的定义。 发现问题原因后,解决它就不是什么问题了。 方法有无数种。 1. 将下面两行拷到程序中。 #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bi
[单片机]
uc/osii在AVR单片机上的移植小结
最近在学习uc/osii在AVR单片机的移植问题,对UC/OS进行了进一步的研读,可是始终有些问题模棱两可,不得要领。从网上也下载了许多UC/OS在AVR上移植的例子程序,始终无法调试成功。因为不用调试和仿真,对内核的运行过程就不能有直观深入的认识。 总算,功夫不负有心人,昨天下载的实例在ICCAVR7上顺利通过了编译,而且在AVRstudio4上也能够顺利的进行调试,在proteus6.9上也能作仿真,通过AVR studio4上的单步运行了断点全速运行,对uc/osII的运行有了深刻的认识。 首先,理清了任务调度的机理。当应用程序建立了3个任务和一个空闲任务,在任务初始化的时候建立所有任务,在OSStart()中通过
[单片机]
AVR单片机USART串口通信基本应用
/********************************************* File name : usart.c Chip type : ATmega16 Program type : Application Clock frequency : 11.0592MHz Memory model : Small 注意:发送采用查询方式,接收采用中断方式,在初始化程序中,需要将TXD设置成输出方式,RXD设置成输入方式,并使RXD的内部上拉有效 *********************************************/ #include mega16.
[单片机]
AVR单片机如何在编写程序里就配置好熔丝位
  熔丝是一个保护知识产权的设计。简单的说,你在特定的引脚上加电压,足够的电流,就可以烧断里边的这根熔丝,烧断以后,片里的程序就不可以被读出来也不能改写了,只能用来运行。一般成品出售时都这样做。专用的写片机支持这个功能。自己也可以根据芯片的官方文档来操作。熔丝位是在一个特定的地址上可以读到熔丝状态的一个位。0表示已熔断,1表示未熔断。   在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”
[单片机]
AVR MEGA8 通过 SPI 总线读写 93C46
AVR MEGA8 通过 SPI 总线读写 93C46,主要是练习SPI总线的使用而已,93C46的驱动相当的简单,这个代码也很好写,调试也不难,冷藏了一段时间的代码了,也懒得整理,copy出来就算了,随便看看就算了。 /* * 项目:SPI总线驱动93C46 * 平台:AVR MEGA8 + WinAVR * 作者:Etual / Etual@163.com * 日期:2008-8-18 */ SPI访问部分代码: ///////////////////////////////////////////////// // pin assignment #define SS PB2 //chip se
[单片机]
AVR编程_如何通过软件复位AVR
Question 如何通过软件复位AVR? Answer 如果你想通过软件复位AVR,你应该使用内部看门狗。简单的使能它和让它溢出。当看门狗触发后,程序计数器返回到0,清除所有的寄存器和其他正在执行的任务,这与将RESET脚拉低有同样的效果。 你不应该处理: --用另一个AVR的引脚连接外部RESET引脚。在短暂的复位时间,AVR的引脚会三态失效,这会导致RESET无效。 --跳到程序地址0,跳到程序地址0,这不会清除全部的寄存器,所以你不会得到一个完整的 复位 。 下列是每30mS复位一次AVR的例子代码(GCC):
[单片机]
AVR片内TWI总线(I2C总线协议)
/*本程序为八位共阴极数码管且有两个573控制的动态扫描*/ /*此程序为开机记忆,可以每次开机分自动加一。如果加了,说明操作成功*/ /*本程序把24C08的SCL和SDA分别接在MCU的SCL(PC0第22脚)和SDA(PC1第23脚)*/ //24C08的第7脚WP接地 #include iom16v.h #include macros.h //这里面有BIT(),所以要包含 #define uchar unsigned char #define uint unsigned int #pragma data:code //注code的功能是把后面的数据存在程序存贮器中,不用code就放到了随机存贮器中. uchar cons
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved