Ⅰ 单片机做计算器的程序
1、直接调用库函数。
Ⅱ 单片机中独立键盘和矩阵键盘如何一起使用 请用C语言写个程序说明,谢谢。
这个很好处理呀,比如以下举例,独立+矩阵,实现独立按键相当于类似SHIFT作用的效果。
#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到f
uchar keyval,num;
sbit skey=P1^0; //独立键P1.0
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
uchar kbscan(void) //矩阵键扫描程序
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)
{
return;
}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
//以下处理独立按键
if(skey==0)
{
if(keyval!=0xff)keyval+=16; //如果独立键按下,键值加16
while(skey==0); //等待独立键释放
}
}
void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
switch(num)
{
case 0:P2=0x01;break;
case 1:P2=0x02;break;
case 2:P2=0x04;break;
case 3:P2=0x08;break;
default:break;
}
if(keyval<16) P0=~tab[keyval]; //独立键未按正常显示
else P0=~(tab[keyval]|0x80); //独立键按下显示+DP
num++;
num&=0x03;
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
}
}
Ⅲ 单片机简易计算器设计的程序
展开全部
首先会按键扫描,再会数码管或液晶屏显示,基本上可以了
程序
流程:
扫描按键(最多5次,最大65536,简易计算器吗)获得一个数,再扫描按键获得加减乘除符号
扫描按键获得另一个数
扫描按键获得“=”,显示计算结果
由于程序比较长,且与硬件有关,因此只贴出主程序:
void
main()
{
while(1)
{
c=1;
while(c<6)//输入第1个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:b1=keyval;
break;
case
2:b2=keyval;
break;
case
3:b3=keyval;
break;
case
4:b4=keyval;
break;
case
5:b5=keyval;
break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}
while(c==6)
//输入计算符号
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14))
//10-13代表加减乘除
4种符号
{
d=keyval;
}
c=1;
display3(d);
}
while(c<6)
//输入第2个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:d1=keyval;
break;
case
2:d2=keyval;
break;
case
3:d3=keyval;
break;
case
4:d4=keyval;
break;//
除
case
5:d5=keyval;
break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}
bb=
b1*10000+b2*1000+b3*100+b4*10+b5;//5个按键数值合成一个数
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
//另外5个按键数值也合成一个数
while(keyval!=14)
//等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case
10:ee=bb+dd;
break;//+
case
11:
flag1=1;//结果是负数的标志,先假定是负数
if(bb>=dd)
{
ee=bb-dd;
//结果不是负数
flag1=0;
}
else
ee=dd-bb;
//减数和被减数交换
break;
case
12:ee=bb*dd;
break;//*可能会溢出
case
13:ee=bb/dd;
//除法小数部分会丢失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);
while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}
Ⅳ 怎样知道单片机的矩阵键盘每个按键的地址
1、比如是一个4行×4列的矩阵键盘。
2、将4行和4列共8根线分别接到单片机的I/O口,比如接P1口,行接低4位(P1.0~P1.3),列接高4位(P1.4~P1.7)。
3、单片机先将行置第电平0,列置高电平1.
4、在键盘扫描程序中,判断是否有任意按键按下:if((P1&0xf0)!=0xf0),表示有按键按下,延时消抖后,再次判断,如果(P1&0xf0)!=0xf0,则表示有按键按下。
5、然后开始逐行扫描:
P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)
if(P14==0) keyval=1; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S1键被按下
if(P15==0) keyval=2; //如果检测到接P1.5引脚的列线为低电平“0” ,可判断是S2键被按下
if(P16==0) keyval=3; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S3键被按下
if(P17==0) keyval=4; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S4键被按下
P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)
if(P14==0) keyval=5; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S5键被按下
if(P15==0) keyval=6; //如果检测到接P1.5引脚的列线为低电平“0”,可判断是S6键被按下
if(P16==0) keyval=7; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S7键被按下
if(P17==0) keyval=8; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S8键被按下
P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)
if(P14==0) keyval=9; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S9键被按下
if(P15==0) keyval=10; //如果检测到接P1.5引脚的列线为低电平“0”,可判断是S10键被按下
if(P16==0) keyval=11; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S11键被按下
if(P17==0) keyval=12; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S12键被按下
P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)
if(P14==0) keyval=13; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S13键被按下
if(P15==0) keyval=14; //如果检测到接P1.5引脚的列线为低电平“0”,可判断是S14键被按下
if(P16==0) keyval=15; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S15键被按下
if(P17==0) keyval=16; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S16键被按下
依次类推,得到4×4=16个按键的键值。就知道哪个按键被按下。
Ⅳ 单片机中什么是键值它和键编码有何关系
单片机中,键值只有两个,=1,表示键按下了,=0,表示键没有按下(或者是取反逻辑);
单片机要读到该键值,先要知道该键的位置,当你安排某个键在某端口的某个引脚上后,该键的位置就固定下来了,只有键值是变化的