您的位置 首页 电路

AVR单片机扫描4X4矩阵键盘并数码管显现程序

*programname:keyboard;功能描述:扫描16个按键(4X4),并把键值显示在数码管上(两位);要点:在扫描按键时运用了比较复杂的

/*

programname : keyboard ;
功用描绘 : 扫描16个按键(4X4),并把键值显现在数码管上(两位);

关键 : 在扫描按键时运用了比较复杂的两个for()循环嵌套式
扫描计划,大大减少了程序量,循环嵌套计划让我纠结了良久,
键值有0~9,上,下,左,右,承认,清零;

领会: 又一个里程碑,泪奔啊…我好像成了 代码男神 啊…;
试验用时: 约等于14小时(每天2小时X7天);

完结时刻: 2013-11-19 23:58:22

*/
#include
#include

#define uint8 unsigned char //宏界说8位数据类型;
#define uint16 unsigned int //宏界说16位数据类型;

// 0 , 1 , 2 , 3 , 4 , 5 , 6 ,
uint8 ak[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
// 7 , 8 , 9 , 上 , 下 左 , 右 ;
0x07,0x7f,0x6f,0x62 ,0x54,0x21,0x0c};
uint8 ge=8,shi=8 ,si=0;

void bit(uint8 h) //数码管位选使能函数;
{
PORTB|=0X02; //数码管位选置1(通明状况);
if(h==0)
{
PORTB&=0XFD; //清零(锁存状况);
}
}

void dat(uint8 u) //数码管数据使能函数;
{
PORTB|=0X01;
if(u==0)
{
PORTB&=0XFE;
}
}

void buzz(uint8 k) //蜂鸣器函数;
{
if(k==0)
{
PORTC&=~(0X80);
}
else PORTC|=0X80;

}

void delay(uint8 j) //1=1000个计数周期;
{
uint16 h=0;
while(j–)
{
for(h=0;h<1000;h++);
}
}

void mega16() //初始化各个IO口;
{

DDRA=0XFF; //PA输出;
DDRB=0XFF; //PB输出;
PORTA=0X00; //PA 输出全0;
delay(1); //延时一下,1000个计数周期;
bit(0); //数码管共阴极全零;
PORTA=0X3F; //数码管数据口装载数据显现0;
PORTB=1<<2; //翻开led流水灯灯;
dat(0); //锁存数码管数据口数据,八个数码管显现0;

delay(30); //延时一下;
DDRD=0X0F; //PD口高四位输入,第四位输出;
PORTD=0XFF; //PD输入口内部上拉,输出口输出全1;
DDRC=0XFF; //PC口悉数输出形式;
PORTC=0X00; //PC口输出全零;
}

void led()
{
static uint8 g=0;

PORTA=0Xff; //向数码管输入显现数据时,必先将共阴极悉数置一,
//不然数码管会呈现暗影;
bit(0); //八个数码管共阴极置一(低电平有用);
switch(g)
{ case 0: PORTA=ak[ge] ;dat(0);PORTA=0XFE;break;//数码管个位;
case 1: PORTA=ak[shi];dat(0);PORTA=0XFD;break; //数码管十位;
default: break; //不然…
}
bit(0);
g++;
if(g==2)
{
g=0;
}
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部