AVR控制矩阵键盘,12864显示简单计算器

#include
#include
#define uint unsigned int
#define uchar unsigned char
#define RS_0 (PORTA&=~BIT(7))
#define RS_1 (PORTA|=BIT(7))
#define WR_0 (PORTA&=~BIT(6))
#define WR_1 (PORTA|=BIT(6))
#define EN_0 (PORTA&=~BIT(5))
#define EN_1 (PORTA|=BIT(5))
uchar temp,key,num,i,n,s,k=0,d,w,h,jj,chen,ch,m;
uchar d=0x81;
uchar jia[]="+";
uchar jian[]="-";
uchar cheng[]="*";
uchar chu[]="/";
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}
uchar anjian()
{
uchar i;
uchar num1;
PORTB=0xef;//高出低入,先扫描行
DDRB=0xf0;

// 按键00000000000
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=0;
write_data(0x30+key);
while((!PINA&0X01));
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
// return 0;
//等待按键松开
}
}

// 按键1
if((PINB&0x02)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x02)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=1;
write_data(0x30+key);
while((!PINA&0X02));//等待按键松开
//return 1;
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}
// 按键2
if((PINB&0x04)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x04)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=2;
write_data(0x30+key);
while((!PINA&0X04));//等待按键松开
// return 2;
if(s==1)
{
h++;}
if(s!=1)
{w++;}
}
}
// 按键3
if((PINB&0x08)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x08)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=3;write_data(0x30+key);
while((!PINA&0X08));//等待按键松开
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}
PORTB=0xdf;
delay(1);//延时消抖
// 按键4
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=4;write_data(0x30+key);
while((!PINA&0X01));//等待按键松开
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}

// 按键5
if((PINB&0x02)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x02)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖

while((!PINA&0X02));key=5;write_data(0x30+key);//等待按键松开
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}
// 按键6
if((PINB&0x04)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x04)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=6;
while((!

PINA&0X04));write_data(0x30+key);//等待按键松开
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}
// 按键7
if((PINB&0x08)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x08)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=7;write_data(0x30+key);
while((!PINA&0X08));//等待按键松开
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}
PORTB=0xbf;
delay(1);//延时消抖
// 按键8
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=8;write_data(0x30+key);
while((!PINA&0X01));//等待按键松开
if(s==1)
{
h++;}
if(s!=1)
{
w++;}
}
}

// 按键9
if((PINB&0x02)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x02)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=9;write_data(0x30+key);
while((!PINA&0X02));//等待按键松开
if(s==1)
{h++;}
if(s!=1)
{
w++;}
}
}
// 按键10加法按键
if((PINB&0x04)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x04)==0)//确实有按键按下
{
delay(1);//延时消抖
//key=10;

//write_data(0x30+key);
for(i=0;i<1;i++)
{
write_data(jia[i]);
delay(1);
}
s=1;k=2;//控制是没有按下符号键
n=0;m=1;
while((!PINA&0X04));//等待按键松开
}
}
// 按键11减法按键
if((PINB&0x08)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x08)==0)//确实有按键按下
{
delay(1);//延时消抖
jj=1;
s=1;k=2;n=0;
for(i=0;i<1;i++)
{
write_data(jian[i]);
delay(1);
}
while((!PINA&0X08));//等待按键松开
}
}
PORTB=0x7f;
delay(1);//延时消抖
// 按键12
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{
delay(1);//延时消抖
key=12;
write_data(0x20+14);
while((!PINA&0X01));//等待按键松开
}
}

// 按键13。。。。乘法
if((PINB&0x02)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x02)==0)//确实有按键按下
{
delay(1);//延时消抖
chen=1;s=1;k=2;n=0;
for(i=0;i<1;i++)
{
write_data(cheng[i]);
delay(1);
}
while((!PINA&0X02));//等待按键松开
}
}
// 按键14,,除法
if((PINB&0x04)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x04)==0)//确实有按键按下
{
delay(1);//延时消抖
ch=1;s=1;k=2;n=0;
for(i=0;i<1;i++)
{
write_data(chu[i]);
delay(1);


}
while((!PINA&0X04));//等待按键松开
// return 2;
}
}
// 按键15是等于按键
if((PINB&0x08)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x08)==0)//确实有按键按下
{
delay(1);//延时消抖
d=1;
write_data(0x30+13);//等于按键显示在13
while((!PINA&0X08));//等待按键松开
//return 3;
}
}
}
void main()
{ uint c,zhi=0,zhi1=0,zhi2=0,zhi3=0,zhi4=0,zhi5=0,zhi6=0,zhi7=0,zhi8=0,jia=0,zhi9=0,zhi10=0,wan,qian,bai,shi,ge,hz;
init();/////用整型,因为uchar范围只有255
write_com(0x80);
while(1)
{ anjian();
delay(2000);
//if(key==12)
//write_com(0x01);//清除显示
if(n==1&&k==0)
{zhi1=key;}
if(n==2&&k==0)
{zhi2=key;}
if(n==3&&k==0)
{zhi3=key;}
if(n==4&&k==0)
{zhi4=key;}
if(w==1)//1位时
{zhi=zhi1;
}
if(w==2)//2wei时
{zhi=zhi1*10+zhi2;}
if(w==3)//3位时
{zhi=zhi1*100+zhi2*10+zhi3;}
if(w==4)//4wei时
{zhi=zhi1*1000+zhi2*100+zhi3*10+zhi4;w=0;
}
//×××××加法按键按下后/××××××××
if(n==1&&s==1)
{zhi5=key;
}
if(n==2&&s==1)
{zhi6=key;
}
if(n==3&&s==1)
{zhi7=key;
}
if(n==4&&s==1)
{zhi8=key;
}
if(h==1)//1位时
{hz=zhi5;
}
if(h==2)//2位时
{hz=zhi5*10+zhi6;
}
if(h==3)//3位时
{hz=zhi5*100+zhi6*10+zhi7;
}
if(h==4)//4位时
{hz=zhi5*1000+zhi6*100+zhi7*10+zhi8;
}
if(d==1)
{
if(s==1&&m==1)//加法
{jia=zhi+hz;}
if(jj==1) //减法
{jia=zhi-hz;}
if(chen==1) //乘法
{jia=zhi*hz;}
if(ch==1) //除法
{jia=zhi/hz;}
wan=jia/10000;
qian=jia%10000/1000;
bai=jia%1000/100;
shi=jia%1000%100/10;
ge=jia%1000%100%10;
if(jia<10)//只显示1位
{write_data(0x30+ge);}
if((jia>10)&&(jia<100))
{write_data(0x30+shi);
write_data(0x30+ge);
}
if((jia>100)&&(jia<1000))//显示2位
{ write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
if((jia>1000)&&(jia<10000))//显示3位
{ write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
if(jia>10000)//显示4位以上
{
write_data(0x30+wan);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
} break;
}

}
}

void write_com(uchar command)
{
RS_0;
WR_0;
PORTC=command;
delay(2);
EN_1;
delay(3);
EN_0;
}
void write_data(uchar date)
{
RS_1;
WR_0;
PORTC=date;
delay(2);
EN_1;
delay(3);
EN_0;
}
void init()
{
DDRA|=BIT(7)|BIT(6)|BIT(5);
DDRC=0xff;
PORTC=0xff;
EN_0;
write_com(0x01);//清除显示
write_com(0x03);//地址归为
write_com(0x0e);//整体显示开,开游标,游标不反白
write_com(0x01);//清除显示
write_com(0x06);//模式设计
write_com(

0x80);//整板显示
}

相关文档
最新文档