/*
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;
}
}