Ⅰ 單片機做計算器的程序
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,表示鍵沒有按下(或者是取反邏輯);
單片機要讀到該鍵值,先要知道該鍵的位置,當你安排某個鍵在某埠的某個引腳上後,該鍵的位置就固定下來了,只有鍵值是變化的