導航:首頁 > 操作系統 > 基於單片機的計算器設計

基於單片機的計算器設計

發布時間:2025-06-15 20:20:36

1. 求一個用51單片機結合數碼管和舉證鍵盤做的一個C語言的計算器 不用有小數點 只要普通加減乘除四則運

用51單片機結合數碼管和距陣鍵盤做一個計算器,用proteus模擬來做比較容易實現,還有一個現成的計算器用的矩陣按鍵,正好有+ - × ÷ 四個按鍵,很漂亮。再用一個8位一體的共陰數碼管顯示,就是一個不錯的計算器。模擬圖如下。

2. 用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

3. 基於51單片機的簡易計算器設計,急

//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零 表3-1 3.2 計算器的軟體設計

#include<reg51.h> //頭文件

#define uint unsigned int //

#define uchar unsigned char

sbit lcden=P2^3; //定義引腳

sbit rs=P2^4;

sbit rw=P2^0;

sbit busy=P0^7;

char i,j,temp,num,num_1;

long a,b,c; //a,第一個數 b,第二個數 c,得數

float a_c,b_c;

uchar flag,fuhao;//flag表示是否有符號鍵按下,fuhao表徵按下的是哪個符號

uchar code table[]={ 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0};

uchar code table1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void delay(uchar z) // 延遲函數

{

uchar y;

for(z;z>0;z--)

for(y=0;y<110;y++);

} void check() // 判斷忙或空閑

{

do{

P0=0xFF;

rs=0; //指令

rw=1; //讀

lcden=0; //禁止讀寫

delay(1); //等待,液晶顯示器處理數據

lcden=1; //允許讀寫

}while(busy==1); //判斷是否為空閑,1為忙,0為空閑

}

void write_com(uchar com) // 寫指令函數

{

P0=com; //com指令付給P0口

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

void write_date(uchar date) // 寫數據函數

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

void init() //初始化

{

num=-1;

lcden=1; //使能信號為高電平

write_com(0x38); //8位,2行

write_com(0x0c); //顯示開,游標關,不閃爍*/

write_com(0x06); //增量方式不移位 顯竟獗暌貧 柚?

write_com(0x80); //檢測忙信號

write_com(0x01); //顯示開,游標關,不閃爍

num_1=0;

i=0;

j=0;

a=0; //第一個參與運算的數

b=0; //第二個參與運算的數

c=0;

flag=0; //flag表示是否有符號鍵按下,

fuhao=0; // fuhao表徵按下的是哪個符號

}

void keyscan() // 鍵盤掃描程序

{

P3=0xfe;

if(P3!=0xfe)

{

delay(20); //延遲20ms

if(P3!=0xfe)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=0;

break;

case 0xd0:num=1;

break;

case 0xb0:num=2;

break;

case 0x70:num=3;

break;

}

}

while(P3!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//沒有按過符號鍵

{

a=a*10+table[num];

}

else//如果按過符號鍵

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=4;//4表示除號已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfd;

if(P3!=0xfd)

{

delay(5);

if(P3!=0xfd)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=4;

break;

case 0xd0:num=5;

break;

case 0xb0:num=6;

break;

case 0x70:num=7;

break;

}

}

while(P3!=0xfd);

if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//沒有按過符號鍵

{

a=a*10+table[num];

}

else//如果按過符號鍵

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=3;//3表示乘號已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfb; if(P3!=0xfb)

{

delay(5);

if(P3!=0xfb)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=8;

break;

case 0xd0:num=9;

break;

case 0xb0:num=10;

break;

case 0x70:num=11;

break;

}

}

while(P3!=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//沒有按過符號鍵

{

a=a*10+table[num];

}

else//如果按過符號鍵

{

b=b*10+table[num];

}

}

else if(num==11)//如果按下的是'-'

{

flag=1;

fuhao=2;//2表示減號已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xf7;

if(P3!=0xf7)

{

delay(5);

if(P3!=0xf7)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=12;

break;

case 0xd0:num=13;

break;

case 0xb0:num=14;

break;

case 0x70:num=15;

break;

}

}

while(P3!=0xf7);

switch(num)

{

case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

break;

case 13:{ //按下的是"0"

if(flag==0) //沒有按過符號鍵

{

a=a*10;

write_date(0x30);

P1=0;

}

else if(flag==1)//如果按過符號鍵

{

b=b*10;

write_date(0x30);

}

}

break;

case 14:{j=1;

if(fuhao==1){write_com(0x80+0x4f);//按下等於鍵,游標前進至第二行最後一個顯示處

write_com(0x04); //設置從後住前寫數據,每寫完一個數據,游標後退一格

c=a+b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d); //再寫"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==2){write_com(0x80+0x4f); //游標前進至第二行最後一個顯示處

write_com(0x04); //設置從後住前寫數據,每寫完一個數據,游標後退一格

//(這個照理說順序不對,可顯示和上段一樣)

if(a-b>0)

c=a-b;

else

c=b-a;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

if(a-b<0)

write_date(0x2d);

write_date(0x3d); //再寫"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==3){write_com(0x80+0x4f);

write_com(0x04);

c=a*b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==4){write_com(0x80+0x4f);

write_com(0x04);

i=0;

c=(long)(((float)a/b)*1000);

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

i++;

if(i==3)

write_date(0x2e);

}

if(a/b<=0)

write_date(0x30);

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

}

break;

case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}

break;

}

}

}


main()

{

init();

while(1)

{

keyscan();

}

}

4. 51單片機設計的簡易的計算器

我以前做過4x4鍵盤控制電動機轉速,用數碼管顯示電機轉速的程序,程序如下:
AD EQU 30H
RTR EQU 31H
LTR EQU 32H
STR EQU 33H
BW EQU 34H
BWS EQU 35H
SHW EQU 36H
SHWS EQU 37H
GW EQU 38H
GWS EQU 39H
WSHR EQU 3AH;WSHR=BWS*100+SHWS*10+GWS
sz EQU 3BH;數字與代碼對應程序的數字變數
xsm EQU 3CH;數字與代碼對應程序的代碼變數
TODH EQU 3DH;計算的10進位數的高位*電機的要求轉速高位
TODL EQU 3EH;計算的10進位數的低位*電機的要求轉速低位
TODHT EQU 3FH;測試後電機的實際轉速高位
TODLT EQU 40H;測試後電機的實際轉速低位
PCK EQU 41H;pc口當前的狀態植
TOH EQU 42H;定時器高位數
T0L EQU 43H;定時器低位數
pink1 EQU 44H;電機轉動1/4圈定時器1的奇數次數
pink2 EQU 45H
VTIMES EQU 46H;速度顯示次數
T1H EQU 47H
T1L EQU 48H
TESTK DATA 49H ;高電平脈沖的個數
TTH0 EQU 1AH
TTL0 EQU 4BH
SUBNOW EQU 4CH

ORG 0000H
LJMP MAIN

ORG 03H
AJMP INTR0;中段0,用來計算電機轉速

ORG 0BH
MOV A,PCK
ANL A,#00000111B
MOV PCK,A
MOV A,#00000110B
CJNE A,PCK,INTT0LF
LJMP INTT0L;

ORG 1BH;pwm停轉子程序
AJMP INTT0H

ORG 0040H
;**************************定時器中斷子程序****************************
;****電機停止程序
INTT0H:
mov th0,TOH
mov tl0,T0L
SETB TR0;定時器0開始計數
CLR TR1;定時器1禁止計數
INC pink1
MOV DPTR,#7F02H; b地址
MOV A, #00000000B;電機停止運動
MOVX @DPTR,A
reti

;****電動機正轉子程序
INTT0L:
mov th1,T1H
mov tl1,T1L
SETB TR1;定時器1開始計數
CLR TR0;定時器0禁止計數
MOV DPTR,#7F02H; b地址
MOV A, #11001100B;C口輸出片選號燈
MOVX @DPTR,A
reti

;****電動機反轉
INTT0LF:
mov th1,T1H
mov tl1,T1L
SETB TR1;定時器1開始計數
CLR TR0;定時器0禁止計數
MOV DPTR,#7F02H; b地址
MOV A, #10101100B;C口輸出片選號燈
MOVX @DPTR,A
reti

;*************************計算電機轉速************************
;R2R3R4R5/ R6R7=R4R5餘R2R3////(R2R3R4/R7)=(R2)R3R4 余數R7
INTR0:
MOV R2,#00H
MOV R3,#0EH
MOV R4,#0A6H
MOV R7,pink1
MOV pink1,#0
MOV A,#10
CLR CY
SUBB A,R7
JNB CY,OUTINT0
LCALL NDIV31
MOV TODHT, R3
MOV TODLT,R4
MOV R6,TODH
MOV R7,TODL
CLR CY
MOV A,R4
SUBB A,R7
MOV SUBNOW,A
JB CY,ADV
LCALL SUBV
JMP OUTINT0
ADV:
LCALL ADDV
OUTINT0:
LCALL JSW;計算各位的數值毫時大大約600個始周期 ;MOV TODLT,TOH
;LCALL JSW;計算各位的數值毫時大大約600個始周期
RETI;***********************************************************************************************
;***************************************************************************************************
;***************************************************************************************************

COMP_M:
MOV A,#0FDH
SUBB A,TOH
JNB CY,OUT_PMM
MOV TOH,#0FDH
MOV T1H,#85
OUT_PMM:
RET

;***************加速子程序**********************
ADDV:
CLR EA
CLR TR1
CLR TR0
MOV R1,SUBNOW
MOV R0,#10000000B
FRT:
MOV A,R0
RL A
MOV R0,A
MOV A,R1
ANL A,R0
JZ FRT
MOV A,TOH
ADD A,R0
JC VMAX
MOV TOH,A
MOV A,T1H
SUBB A,R0
MOV T1H,A
JMP TXT
VMAX:
MOV TOH,#0FDH
MOV T1H,#85
TXT:
SETB TR0
SETB TR1
SETB EA
RET

;************減加速子程序*************************
SUBV:
CLR EA
CLR TR1
CLR TR0
MOV R1,SUBNOW
MOV R0,#10000000B
FRT1:
MOV A,R0
RL A
MOV R0,A
MOV A,R1
ANL A,R0
JZ FRT1
MOV A,TOH
SUBB A,R0
JC VMAX1
MOV TOH,A
MOV A,T1H
ADD A,R0
MOV T1H,A
JMP TXT1
VMAX1:
MOV TOH,#85
MOV T1H,#0FDH
TXT1:
SETB TR0
SETB TR1
SETB EA
RET

;*****************************主程序**************************************
MAIN:
MOV BW,#7DH
MOV SHW,#7DH
MOV GW,#7DH
MOV BWS,#0
MOV SHWS,#0
MOV GWS,#0
MOV SP,#0A0H
MOV TOH,#0A1h;******************************************************************
MOV T0L,#0h;******************************************************************
MOV T1H,#0E1h;*******************************************************************
MOV T1L,#37h;*******************************************************************
MOV TMOD,#00H;定時器0在模式1下工作
MOV RTR,#00110110B
MOV LTR,#00101101B
MOV PCK,#00H
MOV TODHT,#2
MOV TODLT,#25H
MOV TODH,#0
MOV TODL,#0
;LCALL JSTIM;計算總值TODH;TODL
MOV pink2,#0
MOV pink1,#0
SETB EX0
SETB IT0

START:
MOV DPTR,#7F00H; 狀態字地址
MOV A, #00111111B;設A,B,C口均為輸出
MOVX @DPTR,A
LCALL DISPLAY;顯示
LCALL KEYSC;掃描鍵盤
;MOV TESTK,#44H;************************************************TEST*************************************************
ACALL DISPKEYV ;確定鍵盤
;LCALL JSTIM;計算總值TODH;TODL
;LCALL JSW;計算各位的數值毫時大大約600個始周期
LCALL JSEHW;計算各個代碼******************************
JMP START

;*************************鍵盤掃描程序**************************
KEYSC:
MOV TESTK,#0
mov p1,#0FH ;p10-3輸出1,作為輸入位
mov a ,p1
ANL A,#0FH
CJNE A,#0FH,DELAY
RET
DELAY: ACALL DELAY1 ; 延時去鍵抖
mov a ,p1
ANL A,#0FH
CJNE A,#0FH,HAVE
RET
HAVE:
MOV A,#0EFH ;行掃描碼
NEXT:
MOV B,A
MOV P1,A
MOV A,p1
ANL A,#0FH ;檢測列
CJNE A,#0FH,YES
MOV A,B
RL A
CJNE A,#0FEH,NEXT

YES: orl a,#0f0h ;高四位置1
CPL A
mov r2,#00h
MOV R2,A ;存列碼
MOV A,B ;取行碼,

CPL A
ORL A,R2 ;列碼+行碼=鍵植
MOV AD,#00H
MOV TESTK,A
RET

;****************************確定鍵盤程序******************************
DISPKEYV:MOV A,TESTK
KEY0:CJNE A,#11H,KEY1
acall WORD0
KEY1:CJNE A,#12H,KEY2
acall WORD1
KEY2:CJNE A,#14H,KEY3
acall WORD2
KEY3:CJNE A,#18H,KEY4
acall WORD3
KEY4:CJNE A,#21H,KEY5
acall WORD4
KEY5:CJNE A,#22H,KEY6
acall WORD5
KEY6:CJNE A,#24H,KEY7
acall WORD6
KEY7:CJNE A,#28H,KEY8
acall WORD7
KEY8:CJNE A,#41H,KEY9
acall WORD8
KEY9:CJNE A,#42H,KEY10
acall WORD9
KEY10:CJNE A,#44H,KEY11
acall WORD10
KEY11:CJNE A,#48H,KEY12
acall WORD11
KEY12:CJNE A,#81H,KEY13
acall WORD12
KEY13:CJNE A,#82H,KEY14
acall WORD13
KEY14:CJNE A,#84H,KEY15
acall WORD14
KEY15:
CJNE A,#88H,PASS
AJMP WORD15
PASS:RET

WORD0:
lCALL MOVE
MOV A,#0
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV R0,TESTK
TSTK0:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT0
JMP TSTK0
OUT0:
MOV R0,#0
RET

WORD1:
lCALL MOVE
MOV A,#1
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV R0,TESTK
TSTK1:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT1
JMP TSTK1
OUT1:
MOV R0,#0
RET

WORD2:
lCALL MOVE
MOV A,#2
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV R0,TESTK
TSTK2:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT2
JMP TSTK2
OUT2:
MOV R0,#0
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD3:
lCALL MOVE
MOV A,#3
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV R0,TESTK
TSTK3:
LCALL KEYSC
MOV A,R0
CJNE A,TESTK,OUT3
JMP TSTK3
OUT3:
MOV R0,#0
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD4:
lCALL MOVE
MOV A,#4
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV A,TESTK
TSTK4:
LCALL KEYSC
CJNE A,TESTK,OUT4
JMP TSTK4
OUT4:
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD5:
lCALL MOVE
MOV A,#5
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV A,TESTK
TSTK5:
LCALL KEYSC
CJNE A,TESTK,OUT5
JMP TSTK5
OUT5:
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD6:
lCALL MOVE
MOV A,#6
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV A,TESTK
TSTK6:
LCALL KEYSC
CJNE A,TESTK,OUT6
JMP TSTK6
OUT6:
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD7:
lCALL MOVE
MOV A,#7
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV A,TESTK
TSTK7:
LCALL KEYSC
CJNE A,TESTK,OUT7
JMP TSTK7
OUT7:
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD8:
lCALL MOVE
MOV A,#8
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV A,TESTK
TSTK8:
LCALL KEYSC
CJNE A,TESTK,OUT8
JMP TSTK8
OUT8:
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD9:
lCALL MOVE
MOV A,#9
MOV GWS,A
LCALL JSTIM;計算總值TODH;TODL
MOV A,TESTK
TSTK9:
LCALL KEYSC
CJNE A,TESTK,OUT9
JMP TSTK9
OUT9:
ACALL JSEHW;計算各個位的顯示代碼
RET

WORD10:
CLR EA
CLR ET0
CLR TR0
mov th0,TOH
mov tl0,T0L
MOV PCK,#00000110B
SETB EA;打開所有中斷
SETB ET0;定時器允許中斷
SETB TR0;定時器0開始計數
CLR TR1;定時器1禁止計數
SETB ET1;定時器1允許中斷
RET

WORD11:
CLR EA
CLR ET0
CLR TR0
mov th0,TOH
mov tl0,T0L
MOV PCK,#00000101B
SETB EA;打開所有中斷
SETB ET0;定時器允許中斷
SETB TR0;定時器0開始計數
CLR TR1;定時器1禁止計數
SETB ET1;定時器1允許中斷
RET

WORD12:
LCALL ADDV
MOV TODLT,TOH
LCALL JSW;計算各位的數值毫時大大約600個始周期
MOV A,TESTK
TSTK12:
LCALL KEYSC
CJNE A,TESTK,OUT12
JMP TSTK12
OUT12:
RET
WORD13:
LCALL SUBV
MOV TODLT,TOH
LCALL JSW;計算各位的數值毫時大大約600個始周期
MOV A,TESTK
TSTK11:
LCALL KEYSC
CJNE A,TESTK,OUT11
JMP TSTK11
OUT11:
RET
WORD14:
CLR ET0;使能定時器0中斷
CLR ET1;使能定時器1中斷
CLR EA;使能總中斷
CLR TR1;關閉T1計時
CLR TR0;關閉T0計時
MOV PCK,#00H
MOV BW,#7DH
MOV SHW,#7DH
MOV GW,#77H
RET
WORD15:JB EA,MID15
MOV BWS,#0
MOV SHWS,#0
MOV GWS,#0
JMP OUT15
MID15:
CLR EA

MOV A,TESTK
TSTK15:
LCALL KEYSC
CJNE A,TESTK,OUT15
JMP TSTK15
MOV TODLT,TOH
LCALL JSW;計算各位的數值毫時大大約600個始周期
OUT15:
SETB EA
RET

;***********************計算各個代碼******************************
JSEHW:
MOV SZ,BWS
ACALL js
MOV BW,xsm

MOV SZ,SHWS
ACALL js
MOV SHW,xsm

MOV SZ,GWS
ACALL js
MOV GW,xsm
RET

js:
mov a,sz
js0:cjne a,#0,js1
mov xsm,#7dh
js1:cjne a,#1,js2
mov xsm,#14h
js2:cjne a,#2,js3
mov xsm,#6eh
js3:cjne a,#3,js4
mov xsm,#3eh
js4:cjne a,#4,js5
mov xsm,#17h
js5:cjne a,#5,js6
mov xsm,#3bh
js6:cjne a,#6,js7
mov xsm,#7bh
js7:cjne a,#7,js8
mov xsm,#00011100B
js8:cjne a,#8,js9
mov xsm,#7fh
js9:cjne a,#9,js10
mov xsm,#3fh
js10:ret

;***************************計算各位的數值毫時大大約600個始周期**************************************
JSW:;(R2R3R4/R7)=(R2)R3R4 余數R7
MOV R2,#0
MOV R3,TODHT
MOV R4, TODLT
MOV R7,#100
LCALL NDIV31
MOV BWS,R4
MOV A,R7;
MOV R4,A
MOV R3,#0
MOV R2,#0
MOV R7,#10
LCALL NDIV31
MOV SHWS,R4
MOV GWS,R7
RET

;***************************計算十進制結果****************************
JSTIM:
MOV TODL,#0
MOV TODH,#0
MOV A,GWS
MOV B,#1
ACALL JSHL

MOV A,SHWS
MOV B,#10
ACALL JSHL

MOV A,BWS
MOV B,#100
ACALL JSHL

RET

JSHW:
JB OV,JSGW
CLR OV
RET
JSGW:
INC TODH;TEST DATE
RET
JSHL:
MUL AB
MOV R1,B
ADD A,TODL
MOV TODL,A
MOV A,B
ADDC A,TODH
MOV TODH,A
ACALL JSHW
RET

;*****************************單位元組的除法*********************
;****************************(R2R3R4/R7)=(R2)R3R4 余數R7
NDIV31 :MOV A,R2
MOV B,R7
DIV AB
MOV R2,B
MOV B,#10H
NDV311 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 :MOV R2,A
INC R4
NDV313 :DJNZ B,NDV311
CLR OV
JZ NDV314
SETB OV
NDV314 :XCH A,R2
MOV R7,A
RET

;*******************雙位元組減法***(R3R4-R6R7)=(R3R4)*******
NSUB :MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET

DELAY1:
MOV R5,#10
D1: MOV R6,#250
DJNZ R6, $
DJNZ R5,D1
RET

DELAY_BS:
MOV R5,#5
D2: MOV R6,#99
D3: MOV R7,#99
DJNZ R7, $
DJNZ R6,D3
DJNZ R5,D2
RET

;*****************************顯示器顯示子程序***********************************
DISPLAY:
MOV DPTR,#7F01H;
MOV A, BW;
MOVX @DPTR,A
MOV DPTR,#7F03H; c地址
MOV A, #00011000B;C口輸出片選號燈
MOV R0,PCK;pck=********
ORL A,R0;a=***11***
MOV R0,#00011111B;a=00011***
ANL A,R0
MOVX @DPTR,A
ACALL D_40ms

MOV DPTR,#7F01H;
MOV A, SHW;
MOVX @DPTR,A
MOV DPTR,#7F03H; c地址
MOV A,#00101000B
ORL A,R0
MOV R0,#00101111B
ANL A,R0
MOVX @DPTR,A
ACALL D_40ms

MOV DPTR,#7F01H;
MOV A, GW;
MOVX @DPTR,A
MOV DPTR,#7F03H; c地址
MOV A, #00110000B;C口輸出片選號燈
ORL A,R0
MOV R0,#00110111B
ANL A,R0
MOVX @DPTR,A
ACALL D_40ms
mov a,#0ffh
MOVX @DPTR,A
RET

D_40ms:
MOV R7,#10
DELAYBB:
MOV R6,#10
NOP
DELAYNN:

DJNZ R6,DELAYNN; 2X198+2=398
DJNZ R7,DELAYBB; (398+2)X200+1=80ms
RET

;****************************各個位移位自程序***************************
MOVE:
MOV A,SHWS
MOV BWS,A
MOV A,GWS
MOV SHWS,A
RET
END

閱讀全文

與基於單片機的計算器設計相關的資料

熱點內容
分治法演算法復雜度 瀏覽:380
coreldraw怎麼摳圖做文件夾 瀏覽:554
pdf被加密能列印嗎 瀏覽:917
安卓手機如何傳大視頻到電腦 瀏覽:561
androidvmoptions 瀏覽:503
外國伺服器為什麼連不上 瀏覽:213
空氣壓縮機流量計的品牌 瀏覽:605
二分最大匹配python 瀏覽:96
意識與潛意識pdf 瀏覽:547
pdf轉ex 瀏覽:679
shell變數是命令 瀏覽:688
筆記本怎樣創建解壓包 瀏覽:859
餓了么騎手全職下載什麼app 瀏覽:22
bitbucket源碼 瀏覽:950
筆趣閣第二版app叫什麼 瀏覽:541
如何在伺服器上掛ea 瀏覽:308
工程加密鎖改字體大小怎麼改 瀏覽:755
鄭州80後程序員 瀏覽:744
c語言編程題求助各位大神了 瀏覽:385
sql2005資料庫壓縮 瀏覽:245