新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于HD7279和51單片機的計算器

        基于HD7279和51單片機的計算器

        作者: 時間:2012-09-15 來源:網絡 收藏

        /////////////////////////////****************程序*****************///////////////////////

        #includereg51.h>#includemath.h>sbit  cs=P2^6;sbit clk=P1^0;sbit dat=P1^1; sbit key=P3^3; bit  add,sub,mul,div,equ,clr;unsigned char times,st,l,data_jp,flag,d;unsigned int  tmr;unsigned long    num[8],sn[8],disp[8],sh,result,hp=100000000;void send(unsigned char);unsigned char receive(void);unsigned long real(unsigned long ,unsigned char);unsigned long calcu(unsigned   long, unsigned long);void display(unsigned long);unsigned long write_key(unsigned   char);void char_flk(void);void test(void);void error(void);void long_delay(void);void short_delay(void);void delay10ms(unsigned char);  /////////**************主函數****************//////////void main (){times=0;l=times;st=0;flag=0;test();while(1){unsigned char i;if(!key){   send(0x15);data_jp=receive();cs=1;d=write_key(data_jp);if (data_jp=9){flag=0;num[times]=d;}else{flag=1;//times-=1;}if(flag!=1){ if(num[0]==0){times=0;continue;}if(7>times>=1){send(0xa1);}send(0x80);send(num[times]);while(!key); delay10ms(1);times=times+1;cs=1;if(times>7){send(0xa4);error() ;times=0;send(0xa4); }}else{send(0xa4);char_flk();times-=1;l=times;for(i=0;i=times;i++)    {num[i]=real(num[i],l);sh=sh+num[i];l--;           }sn[st]=sh;if(st>=1){result=calcu(sn[st],sn[st-1]);sn[st-1]=result;st--;           }st++;times=0;flag=0;sh=0;if(equ==1){  st=0;           send(0xa4);display(result);equ=0;}if(clr==1){st=0;times=0;flag=0;sh=0;add=0;sub=0;mul=0;div=0;equ=0;clr=0;send(0xa4);}while(!key);}}}}/////////*********************測試子函數****************////////void test(void){   char i;delay10ms(2);send(0xbf);cs=1; for (i=0;i=3;i++)    {delay10ms(100);}send(0xa4);cs=1;delay10ms(20);}
        ///////***********************讀鍵盤程序**************///////unsigned long write_key(unsigned char data_jp){unsigned char shuzi;if(data_jp10){shuzi=data_jp;}else{if(data_jp==10){add=1;}else  if(data_jp==11){sub=1;}else if(data_jp==12){mul=1;}else if(data_jp==13){div=1;}else if(data_jp==14){equ=1;}else if(data_jp==15){clr=1;}shuzi=0xff;}return(shuzi) ;}///////***********************發送子函數*************//////void send(unsigned char data_out) {unsigned char i;cs=0;long_delay();for(i=0;i=7;i++){if(data_out0x80){dat=1;}else{dat=0;}clk=1;short_delay();clk=0;short_delay();data_out=data_out1;}dat=0;}/////************************接收鍵盤子函數************//////unsigned char receive(void){unsigned char i,data_in;dat=1;long_delay();for(i=0;i=7;i++){clk=1;short_delay();data_in=data_in1;if(dat){data_in=data_in|0x01;}else{data_in=data_in|0x00;}clk=0;short_delay();}dat=0;return(data_in);}/////////***************************顯示數字處理子函數***********/////////unsigned long real(unsigned long so, unsigned char s){unsigned char z;if(s!=0){for(z=0;z=(s-1);z++){if(s!=0){so=so*10;}else{so=so;}}}else{so=so;}return(so);}//////////*************************計算子函數*******************///////////unsigned long calcu(unsigned   long    sn0,unsigned   long   sn1  ) {if(add==1){sn0=sn0+sn1;add=0;}if(sub==1){sn0=sn1-sn0;sub=0;}if(mul==1){sn0=sn0*sn1;mul=0;}if(div==1){if(sn0>0)sn0=sn1/sn0;else error();div=0;}return(sn0);}////////****************************報錯錯誤子函數***************/////////void error(void){while(key){send(0x96);send(0x4f);delay10ms(2);send(0x95);send(0x05);delay10ms(2);send(0x94);send(0x05);delay10ms(2);send(0x93);send(0x1d);delay10ms(2);send(0x92);send(0x05);delay10ms(2);    }}///////////********************顯示子函數*********////////////void display(unsigned long display){unsigned char i,asus=8;if(display>99999999)error();  else{  for(i=0;i=7;i++){if((display/hp)>=1)break;else{hp=hp/10;asus-=1;}}for(i=0;i=asus;i++){disp[i]=display/hp;if(hp>1){display=display%hp;hp=hp/10;}}for(i=0;i=asus;i++){if(i>0){ send(0xa1); }send(0x80);send(disp[i]);}}}///////////********************符號判斷閃爍顯示*********////////////void char_flk(void){if(add==1){send(0x97);send(0x77);}else if(sub==1){send(0x97);send(0x01);}else if(mul==1){send(0x97);send(0x37);}else if(div==1){send(0x97);send(0x49);}else if(clr){;}send(0x88);send(0x7f);}//////************************延時子函數*************///////void long_delay(void){char i;for(i=0;i=25;i++) ;}void short_delay(void){char j;for(j=0;j=4;j++);}void delay10ms(unsigned char time){unsigned char i;unsigned int j;for (i=0;i=time;i++){for(j=0;j=0x390;j++);}}

        ///////////////////////////************效果圖*************////////////////////
        點擊瀏覽下一頁
        以上演示的為9876543÷234,其本來的結果是42207.4487179……無法顯示小數位,所以結果為42207 。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 莒南县| 潮安县| 普兰店市| 眉山市| 吉安市| 讷河市| 德江县| 望奎县| 郧西县| 汉沽区| 山阴县| 烟台市| 赤水市| 墨竹工卡县| 高邮市| 桓台县| 北宁市| 长春市| 磴口县| 潞城市| 镇安县| 泽普县| 万州区| 庆元县| 乌拉特中旗| 东山县| 齐齐哈尔市| 和林格尔县| 湟中县| 宁都县| 神木县| 繁昌县| 古浪县| 明水县| 綦江县| 革吉县| 隆化县| 黄浦区| 京山县| 龙里县| 砚山县|