- #include <msp430x22x4.h>
- #include<math.h>
- #define uchar unsigned char
- #define ep_1 (P4OUT|=BIT3)
- #define ep_0 (P4OUT&=~BIT3)
- #define rs_1 (P4OUT|=BIT4)
- #define rs_0 (P4OUT&=~BIT4)
- #define rw_1 (P4OUT|=BIT5)
- #define rw_0 (P4OUT&=~BIT5)
- double d4=0,x,y,z;
- long int i,k;
- int key,keyz,keyzz,key,f1,key1;
- long int
- a,d1=0,d2=0,d3=0,d5=0,d6,d=0,f=0,i,n,flag=0,flag1=0,flag2=0,flag3=0,flag4=0,flag5
- =0,flag6=0,flag7=0,flag8=0,h0=11,h1=25,h2=40,h3=0,h4=0,t1=0,t2=0,g;
- //............................................................................... void lcd_wcmd(uchar); //
- void lcd_pos(uchar);
- void lcd_wdat(uchar);
- void delay(int ms);
- void delayl(int s);
- int key_pass();
- int inot(void);
- double p2(double x) //開方
- { y=sqrt(x);
- z=y;
- y=y*y;
- if(y>x)
- {do
- { z=z-0.0001;
- y=z*z; }
- while(y>x);
- return z;}
- else if(y==x)
- return z;
- else //if(y<x)
- {do
- {z=z+0.0001;
- y=z*z; }
- while(y<x);
- return z; }
- }
- //.............................. 測試LCD忙碌狀態................
- int inot(void) //初始化
- {
- WDTCTL = WDTPW + WDTHOLD; //關看門狗
- BCSCTL1 = CALBC1_16MHZ; //設定DCO為1MHZ
- DCOCTL = CALBC1_16MHZ;
- P1DIR&=~0x0f;//////寄存器,決定對應口的的輸入輸出狀態
- P1DIR|=0xf0;// 將P1.4 P1.5 P1.6 P1.7設置為輸出方向
- P1OUT=0x00;//先輸出低電平
- P2DIR&=~0x00;
- P2DIR|=0xFf;// 將P2.0 P2.1 P2,2 P2.3設置為輸出方向
- P3DIR |=0xff; //P3輸出
- P3OUT =0x00;
- P4DIR |=0xff; //P4輸出
- P4OUT =0x00;
- P1IE = 0;
- P1IES = 0;
- P1IFG = 0;
- P1IE |= BIT0;
- P1IES|= BIT0;
- P1IE |= BIT1;
- P1IES|= BIT1;
- P1IE |= BIT2;
- P1IES|= BIT2;
- P1IE |= BIT3;
- P1IES |= BIT3;
- return 0;
- }
- void delay(int ms) //延時 可能不要
- {
- while(ms--)
- {
- for(i=0;i<=16000;i++);
- }
- }
- /*void delayl(int s)
- {
- while(s--)
- {
- delay(100); }
- } */
- //.............................. 測試LCD忙碌狀態
- int lcd_bz()
- {
- P3DIR&=~BIT7;
- int result=0;
- rs_0;
- rw_1;
- ep_1;
- result =(result||(P3IN & 0x80));
- ep_0;
- P3DIR|=0xff;
- return result;
- }
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_bz());
- rs_0;
- rw_0;
- ep_0;
- P3OUT = cmd;
- ep_1;
- ep_0;
- delay(5); }
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80);
- delay(5); }
- void lcd_wdat(uchar dat)
- { while(lcd_bz());
- rs_1;
- rw_0;
- ep_0;
- P3OUT = dat;
- ep_1;
- ep_0; }
- void lcd_init()
- {
- lcd_wcmd(0x38); //function
- set delay(10);
- lcd_wcmd(0x38); //function
- set delay(10);
- lcd_wcmd(0x0c); //display on/off
- delay(10);
- lcd_wcmd(0x06); //entry mode set
- delay(10);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delay(10); }
- int key_pass()//鍵盤分析
- {
- int keyz;
- int key;
- key=(P1IN&0x0f);
- switch(key) {
- case 0x0e:
- // delay(5);
- P2OUT |=BIT0;
- if((P1IN&BIT0)==0x01)
- delay(10);
- if((P1IN&BIT0)==0x01)
- { keyz=10;break;}
- P2OUT |=BIT1;
- if((P1IN&BIT0)==0x01)
- delay(10);
- if((P1IN&BIT0)==0x01)
- {keyz=11;
- break;}
- P2OUT |=BIT2;
- if((P1IN&BIT0)==0x01)
- delay(10);
- if((P1IN&BIT0)==0x01)
- { keyz=12;
- break;}
- P2OUT |=BIT5;
- if((P1IN&BIT0)==0x01)
- delay(10);
- if((P1IN&BIT0)==0x01)
- { keyz=13;
- break;}
- break;
- case 0x0d:
- P2OUT |=BIT0;
- if((P1IN&BIT1)==0x02)
- delay(10);
- if((P1IN&BIT1)==0x02)
- { keyz=3;
- break;}
- P2OUT |=BIT1;
- if((P1IN&BIT1)==0x02)
- delay(10);
- if((P1IN&BIT1)==0x02)
- {keyz=6;
- break;}
- P2OUT |=BIT2;
- if((P1IN&BIT1)==0x02)
- delay(10);
- if((P1IN&BIT1)==0x02)
- { keyz=9;
- break;}
- P2OUT |=BIT5;
- if((P1IN&BIT1)==0x02)
- delay(10);
- if((P1IN&BIT1)==0x02)
- { keyz=15;
- break;}
- break;
- case 0x0b:
- P2OUT |=BIT0;
- if((P1IN&BIT2)==0x04)
- delay(10);
- if((P1IN&BIT2)==0x04)
- {keyz=2;
- break;}
- P2OUT |=BIT1;
- if((P1IN&BIT2)==0x04)
- delay(10);
- if((P1IN&BIT2)==0x04)
- { keyz=5;
- break;}
- P2OUT |=BIT2;
- if((P1IN&BIT2)==0x04)
- delay(10);
- if((P1IN&BIT2)==0x04)
- { keyz=8;break;}
- P2OUT |=BIT5;
- if((P1IN&BIT2)==0x04)
- delay(10);
- if((P1IN&BIT2)==0x04)
- { keyz=0;
- break;}
- case 0x07:
- P2OUT |=BIT0;
- if((P1IN&BIT3)==0x08)
- delay(10);
- if((P1IN&BIT3)==0x08)
- { keyz=1;break;}
- P2OUT |=BIT1;
- if((P1IN&BIT3)==0x08)
- delay(10);
- if((P1IN&BIT3)==0x08)
- { keyz=4;
- break;}
- P2OUT |=BIT2;
- if((P1IN&BIT3)==0x08)
- delay(10);
- if((P1IN&BIT3)==0x08)
- {keyz=7;
- break;}
- P2OUT |=BIT5;
- if((P1IN&BIT3)==0x08)
- delay(10);
- if((P1IN&BIT3)==0x08)
- { keyz=14;
- break;}
- default:
- keyz=16;
- break; }
- P2OUT&=~0xfF;
- return keyz; }
- #pragma vector=PORT1 VECTOR
- interrupt void PORT1_ISR(void)
- {
- int key_pass();
- key=key_pass();
- if(key==14)
- flag6=1;
- // else flag6=0;
- switch(key)
- {
- case 0:
- lcd_wdat(0x30); //寫入字符顯示數據到LCD
- break; case 1:
- lcd_wdat(0x31);
- break;
- case 2:
- lcd_wdat(0x32);
- break;
- case 3:
- lcd_wdat(0x33);
- break;
- case 4:
- lcd_wdat(0x34);
- break;
- case 5:
- lcd_wdat(0x35);
- break;
- case 6:
- lcd_wdat(0x36);
- break;
- case 7:
- lcd_wdat(0x37);
- break;
- case 8:
- lcd_wdat(0x38);
- break;
- case 9:
- lcd_wdat(0x39);
- break;
- case 10:
- if(flag6!=1)
- {lcd_wdat('/');
- d=0;
- d2=d1;
- flag=3;}
- else{ lcd_wdat('c');
- flag=7;}
- break;
- case 11:
- if(flag6!=1)
- {lcd_wdat('*');
- d=0;
- d2=d1;
- flag=2;}
- else {{lcd_wdat('?');
- flag=6;}
- break;
- case 12:
- if(flag6!=1)
- { lcd_wdat('-');
- d=0;
- d2=d1;
- flag=1;}
- else {lcd_wdat('^');
- flag=5; }
- break;
- case 13:
- if(flag6!=1)
- {lcd_wdat('+');
- d=0;
- d2=d1;
- flag=0;}
- else {
- lcd_wdat(0xe8);
- flag=4; }
- break;
- case 14:
- // lcd_wdat(246);
- //flag5=1;
- break;
- default:
- break;
- }}
- //if(flag5==1) // 變功能 //
- flag=flag+4;
- if(flag==7)
- {lcd_wcmd(0x01);
- d=0,key1=0,flag=flag1=flag2=flag3=flag4=flag5=flag6=0;
- i=k=0;d1=d2=d3=d4=d5=0;}
- if(key<10) {
- d=key+d*10;}
- d1=d;
- if(d1!=d2) {
- if(key==15)
- { lcd_wdat('=');
- delay(5);
- flag6=1;
- lcd_pos(0x40);
- lcd_wdat('A');//A lcd_wdat('N');//
- N lcd_wdat('S');//S lcd_wdat(':');//
- switch(flag) {
- case 0:d3=d2+d;break;
- case 1:d3=d2-d;break;
- case 2:d3=d2*d;break;
- case 3:d4=d2*10000/d;
- flag2=1; //*d3=d2/d;
- // d5=d2%d;
- break;
- case 4:d4=p2(d)
- flag2=0; break;
- case 5: d3=d*d;
- // flag2=0; break;
- case 6: d4=10000/d;
- flag2=1;break;
- /* case 7: lcd_wcmd(0x01);
- d=0,key1=0,flag=flag1=flag2=flag3=flag4=flag5=flag6=0;
- i=k=0;d1=d2=d3=d4=d5=0;
- break; */ default:break; }
- if(d3!=0)
- {f=d3;
- lcd_wcmd(0x04);lcd_pos(0x4e);
- while(f!=0) {
- lcd_wdat(0x30+f%10); f=f/10; } }
- if(d4!=0) {
- switch(flag2) (
- case 0:d4=d4*10000;
- f=d4; f1=f%10000; f=f/10000;
- lcd_wcmd(0x04); lcd_pos(0x4e); i=4;
- if(f1!=0) { while(i--)
- {
- lcd_wdat(0x30+f1%10);
- f1=f1/10; }
- lcd_wdat('.');}
- while(f!=0) {
- lcd_wdat(0x30+f%10);
- f=f/10;}
- break;
- case 1: d4=d4; f=d4;
- f1=f%10000;
- f=f/10000;
- lcd_wcmd(0x04);
- lcd_pos(0x4e);
- i=4;
- if(f1!=0)
- { while(i--)
- {
- lcd_wdat(0x30+f1%10);
- f1=f1/10; }
- lcd_wdat('.');}
- while(f!=0) {
- lcd_wdat(0x30+f%10);
- f=f/10; }
- if(d4<10000)
- lcd_wdat('0');
- break;
- default:break;}
- } }
- while(1) {
- if((P1IN&0x0f)==0x0f) break; }
- if(P1IFG & BIT0)
- {
- P1IFG &= ~(BIT0);// 清除中斷標志位 }
- if(P1IFG & BIT1)
- {
- P1IFG &= ~(BIT1);// 清除中斷標志位 }
- if(P1IFG & BIT2) {
- P1IFG &= ~(BIT2);// 清除中斷標志位
- }
- if(P1IFG & BIT3)
- {
- P1IFG &= ~(BIT3);// 清除中斷標志位 }
- /*if(flag6==1) {if(key!=0)
- {lcd_wcmd(0x01);flag6=0; d=0;} }*/ }
- void main()
- {
- inot(); _DINT(); lcd_init();
- lcd_wcmd(0x01); lcd_wcmd(0x06);
- lcd_pos(0x05); lcd_wdat(0x57);
- //W lcd_wdat(0x65);//e lcd_wdat(0x6c);//l lcd_wdat(0x63);//c lcd_wdat(0x6f);//o lcd_wdat(0x6d);//m lcd_wdat(0x65);//e delay(50);
- lcd_wcmd(0x01);
- _EINT(); while(1)
- { _BIS_SR(CPUOFF);
- _NOP(); } }
復制代碼
|