導航:首頁 > 操作系統 > 單片機矩陣計算器

單片機矩陣計算器

發布時間:2022-07-12 07:21:38

㈠ 用89C51單片機設計4*4矩陣式鍵盤計算器程序 要匯編的

KEYBUF EQU 40H ;鍵號存放單元
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV KEYBUF,#0 ;初始鍵號設位0,也可以為任意值
MOV R0,#30H ;顯示首地址
MOV R2,#0CH ;計算數據存放單元個數
CLR A
QING: MOV @R0,A ;將數據存放單元清零
INC R0
DJNZ R2,QING
MOV P0,#8FH ;關閉顯示
MOV R1,#30H ;將顯示首地址存放R1里
;===============================================
;五位無符號顯示子程序
DIS1: MOV R0,#30H ;把顯示數據第一位放在R0里
MOV R2,#04H ;把顯示的位碼放在R2里
MOV R3,#05H ;把顯示的長度放在R3里
DIS2: MOV A,@R0
ANL A,#0FH ;屏蔽顯示數據的高四位
MOV B,A
MOV A,R2
ANL A,#0FH ;屏蔽位碼的高四位
SWAP A
ORL A,B
MOV P0,A ;送總顯示數據到P0顯示
LCALL DELY4ms ;調用延時4ms
INC R0 ;取下一個顯示數據
DEC R2
DJNZ R3,DIS2 ;四位顯示晚後重新開始顯示
;===================================================
;鍵盤掃描子程序
WAIT: MOV P1,#0FFH ;P1口送高電平
CLR P1.0 ;第一行清零
MOV A,P1 ;讀P1口
ANL A,#0F0H ;低位屏蔽
XRL A,#0F0H ;判斷低位是否有低電平 ,即判斷是否有按鍵按下
JZ NOKEY1 ;地位有低電平繼續掃描,否者跳到第而行去掃描
LCALL DELY10ms ;延時10ms去抖在進行判斷是否有按鍵按下
MOV A,P1 ;繼續讀P1口
ANL A,#0F0H ;判斷低位是否有低電平
CJNE A,#0E0H,NK1 ;如果掃描數據不為0E0H就轉到NK1
MOV KEYBUF,#0 ;否者判斷為0號鍵
AJMP DK ;轉DK1查表程序
NK1: CJNE A,#0D0H,NK2 ;如果掃描數據不為0D0H就轉到NK2
MOV KEYBUF,#1 ;否者判斷為1號鍵
AJMP DK ;轉DK2查表程序
NK2: CJNE A,#0B0H,NK3 ;如果掃描數據不為0B0H就轉到NK3
MOV KEYBUF,#2 ;否者判斷為2號鍵
AJMP DK ;轉DK3查表程序
NK3: CJNE A,#70H,NK4 ;如果掃描數據不為70H就轉到NK4
LJMP SAN_CHU
NK4: NOP
NOKEY1: MOV P1,#0FFH ;和上面相同
CLR P1.1
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
LCALL DELY10MS
MOV A,p1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK5
MOV KEYBUF,#3
AJMP DK
NK5: CJNE A,#0D0H,NK6
MOV KEYBUF,#4
AJMP DK
NK6: CJNE A,#0B0H,NK7
MOV KEYBUF,#5
AJMP DK
NK7: CJNE A,#70H,NK8
MOV KEYBUF,#10 ;否者判斷為3號鍵
AJMP DK ;轉DK4查表程序
NK8: NOP
NOKEY2: MOV P1,#0FFH
CLR P1.2
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK9
MOV KEYBUF,#6
AJMP DK
NK9: CJNE A,#0D0H,NK10
MOV KEYBUF,#7
AJMP DK
NK10: CJNE A,#0B0H,NK11
MOV KEYBUF,#8
AJMP DK
NK11: CJNE A,#70H,NK12
LJMP DENG_HAO
NK12: NOP
NOKEY3: MOV P1,#0FFH
CLR P1.3
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK13
LJMP CHU
NK13: CJNE A,#0D0H,NK14
LJMP CHENG
NK14: CJNE A,#0B0H,NK15
LJMP JIAN
NK15: CJNE A,#70H,NK16
LJMP JIA
NK16: NOP
;=======================================================
;查表求鍵值程序
DK: MOV B,#00H
MOV A,KEYBUF ;查表程序 查對應的鍵號數據
MOV DPTR,#TABLE ;把表頭地址放入DPTR
MOVC A,@A+DPTR ;A裡面存放的為鍵號,利用A和表頭地址找到對應的鍵號數據
MOV B,A ;把查到的數據送往顯示單元
INC R1 ;取下一個顯示單元
MOV A,R1
CJNE A,#36H,DKA1 ;判斷顯示單元是否已滿
MOV R1,#35H ;35H,36H單元用於更好的控制五位顯示
AJMP DKA
DKA1: MOV 34H,33H ;按鍵代碼按左移顯示,先按先顯示
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,B
DKA: MOV A,P1 ;讀P1口
ANL A,#0F0H ;屏蔽高四位
XRL A,#0F0H ;地位是有低電平
JNZ DKA ;如果有低電平繼續讀P1口,否者向下執行,查找第二行
NOKEY4: LJMP DIS1
;===================================
;功能按鍵功能設定
DENG_HAO:MOV DPTR,#JI_SUAN ;等號鍵功能通過加、減、乘、除設定的偏移量來調用子程序
MOV A,3CH ;3CH存放的為功能程序入口地址偏移量
JMP @A+DPTR ;轉移到按鍵功能程序
JI_SUAN: AJMP JIA1 ;加計運算元程序
AJMP JIAN1 ;減計運算元程序
AJMP CHENG1 ;乘計運算元程序
AJMP CHU ;除計運算元程序
;=======刪除鍵功能
SAN_CHU: ACALL QING_DIS
AJMP DKA
;=======加鍵功能
JIA: MOV 3CH,#00H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======減鍵功能
JIAN: MOV 3CH,#02H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======乘鍵功能
CHENG: MOV 3CH,#04H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======除鍵功能
CHU: MOV 3DH,#06H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA

;=================================
;存被加(減、乘、除)數,存放在37H~3BH里
CUN_SHU: MOV 37H,30H ;36H存放的為最低位
MOV 38H,31H
MOV 39H,32H
MOV 3AH,33H
MOV 3BH,34H ;3AH存放的為最高位
RET
;================================
;清除顯示單元
QING_DIS: MOV R1,#30H
QING1: MOV @R1,#00H
INC R1
MOV A,R1
CJNE A,#36H,QING1
MOV R1,#30H
LOP1: RET
;================================
;十進制加法子程序
JIA1:
MOV A,37H ;個位被加數
ADD A,30H ;個位被加數+加數
MOV B,#10 ;十六進制除10轉換成BCD碼
DIV AB
MOV 30H,B ;余數即個位存放在30H
MOV 37H,A ;商存放在37H
MOV A,38H ;十位被加數
ADD A,31H ;十位被加數+加數
ADD A,37H ;加上個位之和的進位
MOV 37H,#00H ;清除37H
MOV B,#10 ;十六進制除10轉換成BCD碼
DIV AB
MOV 31H,B ;余數即十位存放在31H
MOV 38H,A ;商存放在38H
MOV A,39H ;百位計算同十位
ADD A,32H
ADD A,38H
MOV 38H,#00H
MOV B,#10
DIV AB
MOV 32H,B
MOV 39H,A
MOV A,3AH ;千位計算同十位
ADD A,33H
ADD A,39H
MOV 39H,#00H
MOV B,#10
DIV AB
MOV 33H,B
MOV 3AH,A
MOV A,3BH ;萬位計算同十位
ADD A,34H
ADD A,3AH
MOV 3AH,#00H
MOV B,#10
DIV AB
MOV 34H,B
MOV 3BH,#00H
AJMP DKA
;=====================
JIAN1: AJMP DKA
CHENG1: AJMP DKA
CHU1: AJMP DKA
;=============================================
;延時程序和查表表格
DELY4ms: MOV R6,#8 ;延時4毫秒
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10ms:MOV R6,#20 ;延時10毫秒
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
TABLE: DB 07H, 04H, 01H ; / 本表格是以鍵盤為參考 7 8 9 /
DB 08H, 05H, 02H ; * 4 5 6 *
DB 09H, 06H, 03H ; - 1 2 3 -
DB 00H, 00H ;= + 清除 0 = +
END

㈡ 怎樣用單片機實驗板上的矩陣鍵盤和顯示器編寫一個簡單的計算器,要求能一位數和兩位數的加減乘除

#include <reg51.h>
#define uchar unsigned char
long First,End; //定義全局變數

void delay(int n) //***延時程序***//
{int i,j;
for(i=0;i<n;i++)
{for(j=0;j<50;j++)
;}
}

long add(long x,long y) //***加法程序***//
{long z;
z=x+y;
return(z);
}

long sub(long x,long y) //***減法程序***//
{long z;
if(x>=y)
z=x-y;
else
{z=y-x;
z=z+10e6;} //***最高位用1表示負數***//
return(z);
}

long mul(long x,long y) //***乘法程序***//
{long z;
z=x*y;
return(z);
}

long div(long x,long y) //***除法程序***//
{long z;
z=x/y;
return(z);
}

uchar kbscan(void) //***鍵盤掃描程序***//
{
uchar sccode;
P1=0xf0;
if((P1&0xf0)!=0xf0) //發全0行掃描碼,列線輸入
{ delay(222); //延時去抖
if((P1&0xf0)!=0xf0)
{sccode=0xfe; //逐行掃描初值
while((sccode&0x10)!=0)
{P1=sccode; //輸出行掃描碼
if((P1&0xf0)!=0xf0)
{
return(P1);} //如果檢測到有鍵按下,返回鍵值
else
sccode=(sccode<<1)|0x01; //行掃描碼左移一位
}
}
}
return(0); //無鍵按下,返回值為0
}

void display(void) //***顯示程序***//
{int i;
uchar code rel[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //數碼管選通
uchar code led[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //定義0-9
uchar data num[8];
num[0]=First/10000000; //千萬位
num[1]=First/1000000%10; //百萬位
num[2]=First/100000%10; //十萬位
num[3]=First/10000%10; //萬位
num[4]=First/1000%10; //千位
num[5]=First/100%10; //百位
num[6]=First/10%10; //十位
num[7]=First%10; //個位
for(i=7;i>=0;i--)
{P3=rel[i]; //位選輸出
P2=led[num[i]]; //數據輸出
delay(2); //此延時必不可少?
}
}

void main(void) //***主程序***//
{ int k,n;
uchar f,g,key,gn1;
n=0;
f=0;
P0=0; //初始時指示燈滅
while(1) //不斷查詢是否有按鍵動作
{ key=kbscan(); //獲取返回鍵值
if(key!=0)
{
switch(key) //解碼,將對應按鍵返回值轉換為相應數值
{
case 0xee: k=0;break;//0
case 0xde: k=1;break;//1
case 0xbe: k=2;break;//2
case 0x7e: k=3;break;//3
case 0xed: k=4;break;//4
case 0xdd: k=5;break;//5
case 0xbd: k=6;break;//6
case 0x7d: k=7;break;//7
case 0xeb: k=8;break;//8
case 0xdb: k=9;break;//9
case 0xbb: k=10;First=0;End=0;f=0;break;//清除
case 0x7b: k=11;break;//等於
case 0xe7: k=12;f=1;break;//加
case 0xd7: k=13;f=2;break;//減
case 0xb7: k=14;f=3;break;//乘
case 0x77: k=15;f=4;break;//除
}
P0=1;
delay(280); //有按鍵時,指示燈的顯示時間
P0=0; //按鍵指示滅
if(k<10) //為數字鍵時(0-9)
{
if(f!=0) //為數字鍵時,如果已經有功能鍵按下
{
n++; //記錄數字鍵所按次數
gn1=0; //清除標志,再次為功能鍵時進行運算
g=f; //保存運算標志
if(n==1) //輸入為各位數時,直接賦值
First=k;
else if(n>1) //輸入為多位數時,將它轉化為10進制的多位數
First=First*10+k;
}
else //如果沒有功能鍵按下
{
n++;
gn1=1; //定義標志,當下一次為功能鍵時,停止數據輸入
if(n==1)
First=k;
else if(n>1)
First=First*10+k;
End=First; //將第一個數保存
}
}
else if(k>11) //為功能鍵時(+-*/)
{
if(gn1==1) //前一次數字鍵之後為功能鍵時
{
n=0; //清除計數標志
}
else //如果再次輸入功能鍵,則進行運算
{n=0; //清除計數標志
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;}
}
End=First; //保存本次結果
}
else if(k==11) //為等於號時(=)
{n=0;
gn1=1; //接著輸入為功能鍵時可以繼續運算
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;
}
End=First; //保存最終運算結果
f=0; //清除運算標志
}
}
display(); //調用顯示程序
}
}

㈢ 求一個用51C寫的單片機矩陣鍵盤計算器程序,用共陰數碼管顯示。能計算加減乘除。最好能附上模擬圖。謝謝。

#include<reg51.h>

#defineucharunsignedchar;

ucharLED1,LED2,LED3,LED4;

ucharkeyval,calflag,s_dat,d_dat;

uchardistab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

unsignedintnumber,r_dat;

voiddelay(unsignedinta)

{

unsignedinti,j;

for(i=0;i<a;i++)

for(j=0;j<1000;j++);

}

voiddealdat()

{

switch(calflag)

{

case0:

r_dat=s_dat+d_dat;

break;

case1:

r_dat=s_dat-d_dat;

break;

case2:

r_dat=s_dat*d_dat;

break;

case3:

r_dat=s_dat/d_dat;

break;

default:break;

}

LED1=(r_dat/1000)%10;

LED2=(r_dat/100)%10;

LED3=(r_dat/10)%10;

LED4=r_dat%10;

}

ucharkbscan(void)

{

unsignedcharsccode,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;

return((~sccode)+(~recode));

}

else

sccode=(sccode<<1)|0x01;

}

}

}

return0; //無鍵按下,返回0

}

voidgetkey(void)

{

unsignedcharkey;

key=kbscan();

if(key==0){keyval=0xff;return;}

switch(key)

{

case0x11:keyval=7;break;

case0x12:keyval=4;break;

case0x14:keyval=1;break;

case0x18:keyval=10;break;

case0x21:keyval=8;break;

case0x22:keyval=5;break;

case0x24:keyval=2;break;

case0x28:keyval=0;break;

case0x41:keyval=9;break;

case0x42:keyval=6;break;

case0x44:keyval=3;break;

case0x48:keyval=11;break;

case0x81:keyval=12;break;

case0x82:keyval=13;break;

case0x84:keyval=14;break;

case0x88:keyval=15;break;

default:keyval=0xff;break;

}

}

voidt0isr()interrupt1

{

TH0=0xf4;

TL0=0x48;

switch(number)

{

case0:P2=0x04;P0=distab[LED1];break;

case1:P2=0x08;P0=distab[LED2];break;

case2:P2=0x01;P0=distab[LED3];break;

case3:P2=0x02;P0=distab[LED4];break;

default:break;

}

number++;

if(number>3)number=0;

}

main()

{

TMOD=0x01;

number=0;

TH0=0xf4;

TL0=0x48;

TR0=1;

ET0=1;

EA=1;

LED1=0;

LED2=0;

LED3=0;

LED4=0;

while(1)

{

getkey();

switch(keyval)

{

case0:

case1:

case2:

case3:

case4:

case5:

case6:

case7:

case8:

case9:

LED3=LED4;

LED4=keyval;

LED1=0;

LED2=0;

break;

case10:break;//"ON"

case11://"="

d_dat=LED3*10+LED4;

dealdat();

break;

case12://"/"

calflag=3;

s_dat=LED3*10+LED4;

LED3=0;

LED4=0;

break;

case13://"*"

calflag=2;

s_dat=LED3*10+LED4;

LED3=0;

LED4=0;

break;

case14://"-"

calflag=1;

s_dat=LED3*10+LED4;

LED3=0;

LED4=0;

break;

case15://"+"

calflag=0;

s_dat=LED3*10+LED4;

LED3=0;

LED4=0;

break;

default:break;

}

}

}

㈣ 我想用51單片機,矩陣鍵盤,lcd1602寫個簡易計算器程序

//---------------------------------------------------

voidW_LCD_X1_Dat(uintsec)

{

W_LCD_Com(0xc0+6);

W_LCD_Dat(0x30+sec/10000);

W_LCD_Dat(0x30+(sec%10000)/1000);

W_LCD_Dat(0x30+(sec%1000)/100);

W_LCD_Dat(0x30+(sec%100)/10);

W_LCD_Dat('.');

W_LCD_Dat(0x30+sec%10);

}

//---------------------------------------------------

voidmain()

{

floataaa;

uintbbb;

init();

aaa=12.5;

bbb=aaa*10;

W_LCD_X1_Dat(bbb);

while(1);

}

//=========================================

初始化等函數,可見:

http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/e9a4f10963e835c463d98677.html

顯示畫面如下:

㈤ 51單片機鍵盤矩陣實現個位加法計算器,用c編程

KEYBUF
EQU
40H
;鍵號存放單元
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
KEYBUF,#0
;初始鍵號設位0,也可以為任意值
MOV
R0,#30H
;顯示首地址
MOV
R2,#0CH
;計算數據存放單元個數
CLR
A
QING:
MOV
@R0,A
;將數據存放單元清零
INC
R0
DJNZ
R2,QING
MOV
P0,#8FH
;關閉顯示
MOV
R1,#30H
;將顯示首地址存放R1里

㈥ 求。用89C51單片機設計4*4矩陣式鍵盤計算器程序,

/*我寫的這個計算器可以算255范圍以內的整數計算,本打算再加入小數與做最後的處理工作。可是又太費時間,所以就放那裡了。看見了你的提問,也懶得改一改,你看看能不能用。*/
#include<reg51.h>
unsignedcharLine,Row,Val;
voiddelay()
{
unsignedcharcount;
for(count=0;count<255;count++)
;
}
voiddelay1()
{
unsignedcharcount,rt;
for(count=0;count<40;count++)
for(rt=0;rt<100;rt++)
;
}
voidInitialCPU(void)
{
P0=0xFF;
P1=0x0F;
P2=0xFF;
P3=0xFF;
}
unsignedcharleddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//"0-9"
unsignedcharled(unsignedchardat)
{
unsignedchar;
=dat/100;
if(==0)
return0x00;
P2=0x20;
P0=leddata[];
delay();
P2=0x00;
return0x00;
}
unsignedcharledshi(unsignedchardat)
{
unsignedcharshi;
shi=(dat%100)/10;
if(shi==0)
return0x00;
P2=0x40;
P0=leddata[shi];
delay();
P2=0x00;
return0x00;
}
voidledge(unsignedchardat)
{
unsignedcharge;
ge=dat%10;
P2=0x80;
P0=leddata[ge];
delay();
}
unsignedcharbin=1;
voidledplay(unsignedchardat)
{//LED顯示函數
if(bin==1){
led(dat);
bin++;
}
elseif(bin==2){
ledshi(dat);
bin++;
}
elseif(bin==3){
ledge(dat);
bin=1;
}
}
unsignedcharfutemp=0,data1=0,data2=0;
voidInitialTimer0(void)
{
TMOD=0x01;
TH0=(65536-1000)/256;
TR0=1;//啟動T0
EA=1;
ET0=1;//允許T0中斷
}
voidTimer0(void)interrupt1using3
{
TR0=0;
if(data1==0&&futemp==0&&data2==0){//LED顯示data1,即初始值
ledplay(data1);
}
elseif(data1!=0&&futemp==0&&data2==0)//data1有值了,顯示data1,
ledplay(data1);
elseif(data1==0&&futemp!=0&&data2==0)//有兩種可能,1、數據data1為零;2、直接data1沒有給它值。總之顯示data1
ledplay(data1);
elseif(data1!=0&&futemp!=0&&data2==0)//輸入的是符號,接著顯示data1
ledplay(data1);
elseif(data1!=0&&futemp!=0&&data2!=0)//顯示的是data2
ledplay(data2);
TH0=(65536-100)/256;
TR0=1;
}
voiddenghou()
{
data2=0;
futemp=0;
}
unsignedcharKeyTemp,CheckValue,Key1=0x00,Key2=0x00;
voidDispose()
{
unsignedcharVal;
if(Line==0x01)
Line=0;
elseif(Line==0x02)
Line=1;
elseif(Line==0x04)
Line=2;
elseif(Line==0x08)
Line=3;
if(Row==0x10)
Row=0;
elseif(Row==0x20)
Row=1;
elseif(Row==0x40)
Row=2;
elseif(Row==0x80)
Row=3;
Val=Line*4+Row;
if(Val<10){//存數
if(futemp==0){//存在data1中
if(data1==0)
data1=Val;
else
data1=data1*10+Val;
}
else{//存在data2中
if(data2==0)
data2=Val;
else
data2=data2*10+Val;
}
}
elseif(Val>9&&Val<16){
if(Val!=13&&Val!=12)
futemp=Val;//存符號並進行響應處理
elseif(Val==12){
data1=0;
data2=0;
futemp=0;
}
elseif(Val==13){
if(futemp==10){
data1=data1*data2;
denghou();
}
elseif(futemp==11){
data1=data1/data2;
denghou();
}
elseif(futemp==14){
data1=data1-data2;
denghou();
}
elseif(futemp==15){
data1=data1+data2;
denghou();
}
else{
while(1){
P2=0xff;
P0=0x00;
}
}
}
}
else
while(1){
P2=0xff;
P0=0x00;
}//顯示錯誤
}
unsignedcharGetKey1(void)
{
P1=0x0F;
CheckValue=P1^0x0F;
if(CheckValue==0x00)
return0x00;
elseif(CheckValue==0x01)
Line=CheckValue;
elseif(CheckValue==0x02)
Line=CheckValue;
elseif(CheckValue==0x04)
Line=CheckValue;
elseif(CheckValue==0x08)
Line=CheckValue;
Key1=0x0F;
returnKey1;
}
unsignedcharGetKey2(void)
{
P1=0xF0;
CheckValue=P1^0xF0;
if(CheckValue==0x00)
return0x00;
elseif(CheckValue==0x10)
Row=CheckValue;
elseif(CheckValue==0x20)
Row=CheckValue;
elseif(CheckValue==0x40)
Row=CheckValue;
elseif(CheckValue==0x80)
Row=CheckValue;
delay1();
KeyTemp=P1^0xF0;
if(KeyTemp==CheckValue)
return0x00;
Key2=0xF0;
returnKey2;
}
voidmain()
{
unsignedcharKey1,Key2;
InitialCPU();
InitialTimer0();
while(1)
{
Key1=GetKey1();
Key2=GetKey2();
if(Key1!=0x00&&Key2!=0x00)
{
Dispose();
P3=0x00;
}
}
}

㈦ 基於51單片機的簡易計算器製作

您好,這樣的:
縱觀單片機的發展過程,可以預示單片機的發展趨勢,;1)低功耗CMOS化;MCS-51系列的8051推出時的功耗達630m;2)微型單片化;現在常規的單片機普遍都是將中央處理器(CPU)、;此外,現在的產品普遍要求體積

照程序設計的各部分實現的功能不同,將整個軟體系統分成了三個塊,並對每一個功能塊所採用的元器件進行了詳細介紹。此外還編寫了主要功能模塊的基本程序,詳盡闡述了各模塊的工作過程。還有總流程圖,源代碼,硬器件鋪線圖。

㈧ 4*4單片機矩陣式鍵盤計算器 有圖 急

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar LED1,LED2,LED3,LED4,LED5,LED6;

uchar keyval,calflag;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uint number;

unsigned long s_dat1,s_dat2,d_dat;

void delay(unsigned int a)

{

unsigned int i,j;

for(i=0;i<a;i++)

for(j=0;j<1000;j++);

}

void clrdat()

{

LED1=0;

LED2=0;

LED3=0;

LED4=0;

LED5=0;

LED6=0;

}

void dealdat()

{

switch(calflag)

{

case 0:

d_dat=s_dat1+s_dat2;

break;

case 1:

d_dat=s_dat1-s_dat2;

break;

case 2:

d_dat=s_dat1*s_dat2;

break;

case 3:

d_dat=s_dat1/s_dat2;

break;

default:break;

}

LED1=(d_dat/100000)%10;

LED2=(d_dat/10000)%10;

LED3=(d_dat/1000)%10;

LED4=(d_dat/100)%10;

LED5=(d_dat/10)%10;

LED6=d_dat%10;

}

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;

return((~sccode)+(~recode));

}

else

sccode=(sccode<<1)|0x01;

}

}

}

return 0; //無鍵按下,返回0

}


void getkey(void)

{

unsigned char key;

key=kbscan();

if(key==0){keyval=0xff;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;

}

}


void t0isr() interrupt 1

{

TH0=0xf4;

TL0=0x48;

switch(number)

{

case 0:P2=0x01;P0=distab[LED1];break;

case 1:P2=0x02;P0=distab[LED2];break;

case 2:P2=0x04;P0=distab[LED3];break;

case 3:P2=0x08;P0=distab[LED4];break;

case 4:P2=0x10;P0=distab[LED5];break;

case 5:P2=0x20;P0=distab[LED6];break;

default:break;

}

number++;

if(number>5)number=0;

}

main()

{

TMOD = 0x01;

number = 0;

TH0=0xf4;

TL0=0x48;

TR0=1;

ET0=1;

EA=1;

LED1=0;

LED2=0;

LED3=0;

LED4=0;

while(1)

{

getkey();

switch(keyval)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:

LED1=LED2;

LED2=LED3;

LED3=LED4;

LED4=LED5;

LED5=LED6;

LED6=keyval;

break;

case 10:

clrdat();

break; //"ON"

case 11: //"="

s_dat2=LED1*100000+LED2*10000+LED3*1000+LED4*100+LED5*10+LED6;

dealdat();

break;

case 12: //"/"

calflag=3;

s_dat1=LED1*100000+LED2*10000+LED3*1000+LED4*100+LED5*10+LED6;

clrdat();

break;

case 13: //"*"

calflag=2;

s_dat1=LED1*100000+LED2*10000+LED3*1000+LED4*100+LED5*10+LED6;

clrdat();

break;

case 14: //"-"

calflag=1;

s_dat1=LED1*100000+LED2*10000+LED3*1000+LED4*100+LED5*10+LED6;

clrdat();

break;

case 15: //"+"

calflag=0;

s_dat1=LED1*100000+LED2*10000+LED3*1000+LED4*100+LED5*10+LED6;

clrdat();

break;

default:break;

}

}

}

閱讀全文

與單片機矩陣計算器相關的資料

熱點內容
解壓文件密碼怎樣重新設置手機 瀏覽:995
高考指南pdf 瀏覽:693
爬蟲python數據存儲 瀏覽:240
u盤怎麼取消加密 瀏覽:429
567除以98的簡便演算法 瀏覽:340
pdf手機如何解壓 瀏覽:15
python描述器 瀏覽:60
戰地聯盟3解壓密碼 瀏覽:805
s型命令 瀏覽:25
php年薪5年 瀏覽:71
如何上網上設個人加密賬戶 瀏覽:44
linux打開ssh服務 瀏覽:78
微信位置可以加密嗎 瀏覽:470
演算法蠻力法 瀏覽:438
隨機排練命令 瀏覽:147
python多進程並發 瀏覽:41
安卓軟體安裝如何躲避安全檢測 瀏覽:647
奇幻潮翡翠台源碼百度雲盤 瀏覽:187
什麼軟體可以免費pdf轉word 瀏覽:15
php正則表達式大全 瀏覽:395