您的位置 首页 FPGA

AVR矩阵键盘程序

搞了一顿竟然连矩阵键盘的程序都不会写do{i=(i1

搞了一顿居然连矩阵键盘的程序都不会写

do
{
i=(i<<1|i>>7);
PORTD=i;
DDRD=0X0F;//
key=PIND;//不论如何装备DDxn,都可以经过读取PINxn 寄存器来取得引脚电平
j=key&0xf0;

}while(j==0xf0);//直到发现按键按下。若没有找到按键按下 的,持续循环

i的初值0x7f。i=(i<<1|i>>7);之后。i=1111 1110b

第2次,i= 1111 1101b

确保只要一位为0

下面是程序,写得很奇妙

#include
#include
#define uchar unsigned char
#define uint unsigned int
#pragma data:code //save to areas of program
const table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c ,
0x39,0x5e,0x79,0x71,0};

void delay(uint ms)
{
uint i,j;
for(i=0;ifor(j=0;j<1141;j++);
}
void show_init()
{
DDRA|=BIT(3);
DDRB=0XFF;
DDRA|=BIT(4);
}
void show(uchar aa,uchar bb)//第aa个数码管显现bb
{

//PORTB=0XFF;
PORTA|=BIT(4);
PORTB=~BIT(aa);
PORTA&=~BIT(4);

PORTA|=BIT(3);
PORTB=table[bb];
PORTA&=~BIT(3);

delay(10);
}
uchar key_press()
{
uchar i;
DDRD=0XFF;
PORTD=0XF0;

DDRD=0X0F;
i=PIND;
if(i==0xf0)
{
DDRD=0XFF;
return 0;

}
else
{
DDRD=0XFF;
return 1;
}
}
uchar key_scan()
{
uchar key,i=0x7f,j,code;
delay(10);
if(key_press())
{
do
{
i=(i<<1|i>>7);
PORTD=i;
DDRD=0X0F;
key=PIND;
j=key&0xf0;

}while(j==0xf0);

while(key_press());

switch(key)
{
case 0x7e: code=0;break;
case 0xbe: code=1;break;
case 0xde: code=2;break;
case 0xee: code=3;break;

case 0x7d: code=4;break;
case 0xbd: code=5;break;
case 0xdd: code=6;break;
case 0xed: code=7;break;

case 0x7b: code=8;break;
case 0xbb: code=9;break;
case 0xdb: code=10;break;
case 0xeb: code=11;break;

case 0x77: code=12;break;
case 0xb7: code=13;break;
case 0xd7: code=14;break;
case 0xe7: code=15;break;

}
}

return code;
}

void main()
{
uchar s;
show_init();
while(1)
{
if(key_press())
{
s=key_scan();
show(0,s);
}
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/272926.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部