📄 jianpantongxunckou.c
字号:
/*扫面键盘程序,pc0-pc3接行,pc4-pc7接列,1带上拉电阻 ,其本身的上拉电压太小*/
#include<avr/io.h>
void delayms(char i)
{int j;
for(j=1000;j>1;j--)
for(;i>1;i--);
}
void Init_Io_1(void)
{
DDRA=0xf0; PORTA=0x0f; //先让高位输出,低位输入且上拉
}
void Init_Io_2(void)
{
DDRA=0x0f; PORTA=0xF0;//与上相反
}
int getkey(void)
{
int key=0;//不让key具有记忆性
unsigned char temp;
if((~(PINA|0xf0))!=0) // 有键按下
{
delayms(30);
if((~(PINA|0xf0))!=0)
{ temp=PINA|0xf0;
temp=~temp ;
if(temp==1) key=1;
else if(temp==2) key=5;
else if(temp==4) key=9;
else if(temp==8) key=13;
Init_Io_2();
asm("nop");//2时间不能太长
temp=PINA|0x0f;
temp=~temp;
temp=(temp>>4);
if(temp==1) key+=0;
else if(temp==2) key+=1;
else if(temp==4) key+=2;
else if(temp==8) key+=3;
Init_Io_1();
}
}
return key; //返回1~16键值
}
int display(int x)
{
int i,k,t;
unsigned char duan[]={0x0C,0xCF,0x25,0x85,0xC6,0x94,0x14,0xCD,0x04,0x84};
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20};//共有六位
unsigned char w[6];//设定扫描的个数
DDRC=0xff;//置PC口为输入,为段选线
DDRD=0xff;//置PD口为输入,为位选线
w[2]=x/1000;//千位
w[3]=x%1000/100;//百位
w[4]=x%100/10;//十位
w[5]=x%10;//个位
for(i=0;i<10;i++)
for(k=2;k<6;k++)
{
PORTD=wei[k];
PORTC=duan[w[k]];
// delay_ms(2);
for(t=0;t<100;t++);//调节数码管的亮度
}
}
void lossen_key(void)
{
}
int change(unsigned char b[])
{unsigned int i;
i=b[0]*1000+b[1]*100+b[2]*10+b[3];
return i;
}
/*int clear(unsigned int i)
{
if(PINB&(1<<1)==0)
{i=0;}
return i;
}*/
int main(void)
{ unsigned int code=1986;
unsigned int i,j,k=0;
unsigned int flage=0;
Init_Io_1();
delayms(2);
DDRD=0xff;
DDRB&=~(1<<1);
PORTB|=(1<<1); //上拉
while(1)
{
i=getkey();
// k+=i; //记忆上次的值
k=k*10+i;
while(PINA!=0x0f)
{display(k);}//等待按键时放函数
delayms(30); //去除抖动;
while(PINA==0x0f)
{
//k=change(a[4]);
if(!(PINB&(1<<1)))//随时清零
{k=0;}
if(k>10000)//溢出清零
{k=0;}
if(k==code)//密码匹配
{PORTD|=(1<<7);}
else{PORTD&=~(1<<7);}
display(k);//无按键按下锁定显示内容
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -