datasheet

AVR 编程之矩阵键盘

2016-10-09来源: eefocus关键字:AVR  编程  矩阵键盘
#include   

#include

#define uchar unsigned char  
#define uint  unsigned int
uchar const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0X00};// 显示段码值0123456789abcdef
void main()
{

uchar key=0;
uchar i=0;
DDRC|=BIT(7);
PORTC|=BIT(7);
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;

while(1)
{
if(key_press())
key=keyscan();


ledshow(key,0);


}
}
uchar key_press()
{
uchar i;
DDRD=0XFF;
PORTD=0X0F;
DDRD=0XF0;
i=PIND;

if(i!=0X0F)
{
DDRD=0XFF;
return 1;
}
else
{
DDRD=0XFF;
return 0;
}
}


uchar keyscan()
{
uchar i,j,rkey;
delay (30);
if(key_press)
{
PORTD=0XF0;//先确定所在列,列拉高电平,行低电平
DDRD=0X0F;
//delay(1);
asm("NOP");
i=PIND;
switch(i)
{

case 0X70:rkey=0;break;
case 0XB0:rkey=1;break;
case 0XD0:rkey=2;break;
case 0XE0:rkey=3;break;
default:rkey=16;

}

PORTD=0X0F;//然后确定行,行拉高列拉低
DDRD=0XF0;
//delay(1);
asm("NOP");
j=PIND;
switch(j)
{
case 0X07:rkey+=12;break;
case 0X0B:rkey+=8;break;
case 0X0D:rkey+=4;break;
case 0X0E:rkey+=0;break;
default:rkey=16;
}

}
while(key_press());
return rkey;

}

void ledshow(int num,unsigned int i)
{
PORTA=i;
PORTB=table[num];
}

void delay(int ms)
{
  unsigned int i,j;
 for(i=0;i     {
    for(j=0;j<142;j++);
       }

}

 

注:读PIND前一定要加一个asm("NOP");或者先短暂延时,不然读不到正确的值!

DATASHEET:

不论如何配置DDxn,都可以通过读取PINxn 寄存器来获得引脚电平。如Figure 23 所示,
PINxn 寄存器的各个位与其前面的锁存器组成了一个同步器。这样就可以避免在内部时钟
状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。其缺点是引入了
延迟。Figure 24 为读取引脚电平时同步器的时序图。最大和最小传输延迟分别为tpd,max
和tpd,min。

AVR 编程之矩阵键盘 - 蓝眼泪 - 蓝眼泪的博客
下面考虑第一个系统时钟下降沿之后起始的时钟周期。当时钟信号为低时锁存器是关闭
的;而时钟信号为高时信号可以自由通过,如图中SYNC LATCH 信号的阴影区所示。时
钟为低时信号即被锁存,然后在紧接着的系统时钟上升沿锁存到PINxn 寄存器。如tpd,max
和tpd,min 所示,引脚上的信号转换延迟界于? ~ 1? 个系统时钟。
如Figure 25 所示,读取软件赋予的引脚电平时需要在赋值指令out 和读取指令in 之间有
一个时钟周期的间隔,如nop 指令。 out 指令在时钟的上升沿置位SYNC LATCH 信号。
此时同步器的延迟时间tpd 为一个系统时钟。

 

AVR 编程之矩阵键盘 - 蓝眼泪 - 蓝眼泪的博客

关键字:AVR  编程  矩阵键盘

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016100930246.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR 相位修正PWM模式应用
下一篇:AVR单片机TO定时器快速PWM模式范例

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR单片机——中断系统

中断的优点中断函数只在中断触发源触发的时候才会执行,其他时间不执行. 如果不使用中断而且如果要根据某个端口的变化而作相应的函数操作,就必须不断地查询端口的信号,而中断不用,只要端口一有变化,就会系统就会自动进入中断函数, 我觉得这就是中断的目的,也是优点.中断优先级1) AVR单片机在同一个优先级中,中断向量入口地址越低,其优先级越高。AVR单片机在响应中断以后,会禁止系统响应其余中断。如果程序需要在某个中断服务程序中响应其它中断事件,可以在该中断服务程序中用重新使能全局中断即可。否则,AVR单片机只有在退出中断进程时,才重新使能全局中断。2) AVR(至少是ATmega16)单片机采用固定的硬件优先级方式,不支持通过软件
发表于 2018-11-20
AVR单片机——中断系统

高手总结!AVR单片机学习笔记

下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。1、  AVR单片机采用RISC架构,8051单片机采用CISC架构。前者速度为后者的2~4倍,为流水线操作指令2、  AVR单片机有32个通用寄存器(地址在RAM区从$0000开始到$001F),其中有6个(最后6个)合并为3个16位的X,Y,Z寄存器,用来存放地址指针,Z寄存器还可以寻址程序存储器3、  哈佛结构,131条机器指令4、  延迟开机功能5、  内部自带RC振荡器,可提供1/2/4/8MHZ的工作时钟6、 
发表于 2018-11-20

单片机抗干扰能力那家强?PIC、AVR....

单片机的抗干扰性能历来为大家所重视,现在市面上的单片机就我所接触过的,就有十家左右了,韩国的三星和现代;日本的三菱,日立,东芝,富士通,NEC;台湾的EMC,松汉,麦肯特,合泰;美国的摩托罗拉,国半的cop8系列,microchip系列,TI的msp430系列,AVR系列,51系列,欧洲意法半导体的ST系列。。。。。。这些单片机的抗干扰性能大多数鄙人亲自测试过,所用机器是上海三基出的两种高频脉冲干扰仪,一种是欧洲采用的标准,一种是日本采用的标准;日本的标准歉咂德龀辶⒊觯龀蹇矶却?0ns到250ns可调,欧洲采用的标准是脉冲间歇(间歇时间和发出时间可调)发出,脉宽也是从50ns到250ns可调;我们国家采用的是欧洲标准。一般
发表于 2018-11-20

AVR Mega8 V-USB general & multimedia keys via IR transmitor

(2)段)reportBuffer[1],0位USAGE (Volume Decrement);1位USAGE (Volume Increment);2位USAGE (Track Next);3位USAGE (Track Previous);4位USAGE (Play/Pause)reportBuffer[2] 没有用到。在report id为 2 报告发送函数:usbSetInterrupt((void *)&reportBuffer, 2); //因为只定义了两个字节的报告数据实验中IR处理用了AVR的ICP。需要注意的是,发送按键HID报告后,紧接着发送同类型的零数据HID报告
发表于 2018-10-17
AVR Mega8 V-USB general & multimedia keys via IR transmitor

AVR Mega16 PAL/NTSC制式 B/W 信号模拟

资料参考http://www.rickard.gunee.com/projects/video/pic/howto.phphttp://tinyvga.com/avr-sdram-vgahttp://www.serasidis.gr/circuits/colour_bar_gen/colour_bar_gen.htmhttp://belogic.com/uzebox/index.asp以下引用自 http://eyetap.org/ece385/lab5.htmSEQUENCE:Horizontal sync (hsync) pulse: Start each scanline with 0.3V, then 0V
发表于 2018-10-17
AVR Mega16 PAL/NTSC制式 B/W 信号模拟

AVR使用范例--使用Bootloader 升级芯片内程序详解

Bootloader是flash中高地址的一个程序区域,通过它可以实现程序的运行控制,程序更新等。本页给出的是通过串口实现在线更新的方法。程序编译环境:icc avr 6.31。如果你使用Atmega16芯片,7.3728M晶振,1024的bootloader区,19200的波特率,那么你直接使用下面的hex文件就可以了,下载hex文件。本站的开发板内,预制这个hex文件,可以按照本页的方法用串口线直接更新程序。否则,你需要对程序进行调整,然后重新编译Bootloader的hex文件,下载软件包,软件中需要更改的部分:芯片的类型#include //选择对应的芯片Bootloader区的大小,和ICC的option相对
发表于 2018-10-15
AVR使用范例--使用Bootloader 升级芯片内程序详解

小广播

何立民专栏

单片机及嵌入式宝典

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

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