找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1390|回复: 0
打印 上一主题 下一主题
收起左侧

msp430计算机小程序

[复制链接]
跳转到指定楼层
楼主
ID:325084 发表于 2018-5-8 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <msp430x22x4.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define ep_1 (P4OUT|=BIT3)
  5. #define ep_0 (P4OUT&=~BIT3)
  6. #define rs_1 (P4OUT|=BIT4)
  7. #define rs_0 (P4OUT&=~BIT4)
  8. #define rw_1 (P4OUT|=BIT5)
  9. #define rw_0 (P4OUT&=~BIT5)
  10. double d4=0,x,y,z;
  11. long int i,k;
  12. int key,keyz,keyzz,key,f1,key1;   
  13. long int
  14. 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
  15. =0,flag6=0,flag7=0,flag8=0,h0=11,h1=25,h2=40,h3=0,h4=0,t1=0,t2=0,g;
  16. //............................................................................... void lcd_wcmd(uchar); //
  17. void lcd_pos(uchar);
  18. void lcd_wdat(uchar);
  19. void delay(int ms);
  20. void delayl(int s);  
  21. int key_pass();
  22. int inot(void);
  23. double p2(double x)  //开方
  24. {    y=sqrt(x);   
  25. z=y;
  26.   y=y*y;
  27.   if(y>x)
  28.    {do
  29.       {  z=z-0.0001;      
  30.        y=z*z;       }
  31.       while(y>x);      
  32.   return z;}      
  33.       else if(y==x)        
  34. return  z;   
  35.   else //if(y<x)   
  36.    {do
  37.            {z=z+0.0001;      
  38.   y=z*z;       }
  39. while(y<x);      
  40. return z;       }     
  41.     }
  42. //.............................. 测试LCD忙碌状态................  
  43. int inot(void)    //初始化
  44. {   
  45.     WDTCTL = WDTPW + WDTHOLD;   //关看门狗
  46.     BCSCTL1 = CALBC1_16MHZ;   //设定DCO为1MHZ   
  47. DCOCTL = CALBC1_16MHZ;
  48.     P1DIR&=~0x0f;//////寄存器,决定对应口的的输入输出状态   
  49. P1DIR|=0xf0;// 将P1.4 P1.5 P1.6 P1.7设置为输出方向   
  50.   P1OUT=0x00;//先输出低电平   
  51.    P2DIR&=~0x00;
  52.    P2DIR|=0xFf;// 将P2.0 P2.1 P2,2 P2.3设置为输出方向   
  53. P3DIR |=0xff; //P3输出  
  54. P3OUT =0x00;
  55.    P4DIR |=0xff; //P4输出   
  56. P4OUT =0x00;  
  57.   P1IE = 0;   
  58. P1IES = 0;  
  59.   P1IFG = 0;
  60. P1IE |= BIT0;        
  61.   P1IES|= BIT0;         
  62. P1IE |= BIT1;      
  63.    P1IES|= BIT1;
  64. P1IE |= BIT2;         
  65. P1IES|= BIT2;         
  66. P1IE |= BIT3;         
  67. P1IES |= BIT3;  
  68.   return 0;
  69. }     
  70. void delay(int ms)   //延时 可能不要
  71. {   
  72. while(ms--)  
  73. {
  74.     for(i=0;i<=16000;i++);
  75.   }
  76. }
  77. /*void delayl(int s)
  78. {
  79.   while(s--)  
  80. {
  81.     delay(100);   }
  82. } */

  83. //.............................. 测试LCD忙碌状态
  84. int lcd_bz()
  85. {
  86. P3DIR&=~BIT7;        
  87. int result=0;
  88.   rs_0;  
  89. rw_1;
  90. ep_1;
  91. result =(result||(P3IN & 0x80));  
  92. ep_0;
  93.   P3DIR|=0xff;  
  94. return result;  
  95. }
  96. void lcd_wcmd(uchar cmd)
  97. {        
  98. while(lcd_bz());
  99.    rs_0;
  100.   rw_0;  
  101. ep_0;  
  102. P3OUT = cmd;   
  103. ep_1;   
  104. ep_0;   
  105. delay(5); }
  106. void lcd_pos(uchar pos)
  107. {        
  108. lcd_wcmd(pos | 0x80);
  109. delay(5); }
  110. void lcd_wdat(uchar dat)  
  111. {         while(lcd_bz());  
  112. rs_1;  
  113. rw_0;  
  114. ep_0;
  115.   P3OUT = dat;  
  116. ep_1;   
  117. ep_0;  }
  118. void lcd_init()
  119. {        
  120. lcd_wcmd(0x38);                        //function
  121. set  delay(10);
  122. lcd_wcmd(0x38);                        //function
  123. set  delay(10);
  124. lcd_wcmd(0x0c);                        //display on/off  
  125. delay(10);
  126. lcd_wcmd(0x06);                        //entry mode set
  127. delay(10);
  128. lcd_wcmd(0x01);                        //清除LCD的显示内容
  129. delay(10); }

  130. int key_pass()//键盘分析
  131. {
  132.   int keyz;      
  133. int key;  
  134.   key=(P1IN&0x0f);  
  135. switch(key)   {
  136.   case 0x0e:
  137.   // delay(5);
  138.     P2OUT |=BIT0;
  139.     if((P1IN&BIT0)==0x01)
  140. delay(10);
  141.      if((P1IN&BIT0)==0x01)   
  142.   { keyz=10;break;}               
  143.      P2OUT |=BIT1;   
  144.   if((P1IN&BIT0)==0x01)   
  145. delay(10);
  146.      if((P1IN&BIT0)==0x01)         
  147.      {keyz=11;
  148. break;}            
  149.      P2OUT |=BIT2;
  150.     if((P1IN&BIT0)==0x01)   
  151. delay(10);
  152.      if((P1IN&BIT0)==0x01)   
  153.    { keyz=12;
  154. break;}
  155. P2OUT |=BIT5;   
  156. if((P1IN&BIT0)==0x01)   
  157. delay(10);
  158.   if((P1IN&BIT0)==0x01)   
  159.    { keyz=13;
  160. break;}
  161. break;
  162.     case 0x0d:
  163.     P2OUT |=BIT0;     
  164. if((P1IN&BIT1)==0x02)   
  165. delay(10);
  166.     if((P1IN&BIT1)==0x02)  
  167.    { keyz=3;
  168. break;}     

  169.      P2OUT |=BIT1;   
  170. if((P1IN&BIT1)==0x02)  
  171.    delay(10);
  172.      if((P1IN&BIT1)==0x02)  
  173.     {keyz=6;
  174. break;}            
  175.      P2OUT |=BIT2;   
  176.   if((P1IN&BIT1)==0x02)   
  177. delay(10);
  178. if((P1IN&BIT1)==0x02)  
  179.     { keyz=9;
  180. break;}      
  181.      P2OUT |=BIT5;   
  182.   if((P1IN&BIT1)==0x02)   
  183. delay(10);
  184.      if((P1IN&BIT1)==0x02)  
  185.     { keyz=15;
  186. break;}      
  187.    break;  
  188.   case 0x0b:
  189.     P2OUT |=BIT0;
  190.     if((P1IN&BIT2)==0x04)  
  191.    delay(10);
  192.      if((P1IN&BIT2)==0x04)   
  193.    {keyz=2;
  194. break;}      
  195.      P2OUT |=BIT1;   
  196.   if((P1IN&BIT2)==0x04)
  197. delay(10);
  198.      if((P1IN&BIT2)==0x04)      
  199. { keyz=5;
  200. break;}
  201. P2OUT |=BIT2;
  202.     if((P1IN&BIT2)==0x04)   
  203.   delay(10);
  204.       if((P1IN&BIT2)==0x04)   
  205.     {   keyz=8;break;}                  
  206.      P2OUT |=BIT5;   
  207. if((P1IN&BIT2)==0x04)   
  208.   delay(10);
  209.       if((P1IN&BIT2)==0x04)  
  210.      { keyz=0;
  211. break;}            
  212.     case 0x07:
  213.     P2OUT |=BIT0;
  214.     if((P1IN&BIT3)==0x08)   
  215. delay(10);
  216.      if((P1IN&BIT3)==0x08)
  217. {  keyz=1;break;}            
  218.      P2OUT |=BIT1;
  219.     if((P1IN&BIT3)==0x08)   
  220.   delay(10);
  221.      if((P1IN&BIT3)==0x08)   
  222.    { keyz=4;
  223. break;}            
  224.      P2OUT |=BIT2;
  225.     if((P1IN&BIT3)==0x08)     
  226. delay(10);
  227.      if((P1IN&BIT3)==0x08)     
  228. {keyz=7;
  229. break;}
  230. P2OUT |=BIT5;
  231.     if((P1IN&BIT3)==0x08)  
  232.    delay(10);
  233.     if((P1IN&BIT3)==0x08)   
  234.   { keyz=14;
  235. break;}
  236. default:
  237. keyz=16;
  238. break;   }
  239.   P2OUT&=~0xfF;  
  240. return keyz;   }  
  241. #pragma vector=PORT1 VECTOR  
  242. interrupt void PORT1_ISR(void)
  243.   {
  244.   int key_pass();   
  245. key=key_pass();  
  246. if(key==14)   
  247.   flag6=1;
  248.   // else flag6=0;
  249. switch(key)
  250.   {
  251.   case 0:
  252.   lcd_wdat(0x30);   //写入字符显示数据到LCD
  253. break;   case 1:
  254.   lcd_wdat(0x31);  
  255.   break;  
  256. case 2:
  257.   lcd_wdat(0x32);   
  258. break;  
  259. case 3:  
  260. lcd_wdat(0x33);
  261.   break;   
  262. case 4:
  263.   lcd_wdat(0x34);
  264.    break;
  265.   case 5:
  266.   lcd_wdat(0x35);  
  267. break;   
  268. case 6:
  269.   lcd_wdat(0x36);
  270. break;
  271.   case 7:
  272.   lcd_wdat(0x37);  
  273. break;
  274.   case 8:
  275.   lcd_wdat(0x38);  
  276. break;
  277. case 9:
  278.   lcd_wdat(0x39);
  279.   break;
  280.   case 10:
  281. if(flag6!=1)
  282.   {lcd_wdat('/');      
  283. d=0;
  284. d2=d1;     
  285.    flag=3;}   
  286. else{ lcd_wdat('c');
  287.   flag=7;}  
  288. break;   
  289.   case 11:
  290. if(flag6!=1)  
  291. {lcd_wdat('*');  
  292. d=0;
  293. d2=d1;      
  294.   flag=2;}
  295.    else {{lcd_wdat('?');
  296.    flag=6;}
  297. break;
  298.   case 12:
  299.   if(flag6!=1)
  300.    { lcd_wdat('-');  
  301. d=0;
  302.        d2=d1;      
  303. flag=1;}   
  304. else {lcd_wdat('^');      
  305.   flag=5;   }
  306.   break;
  307.   case 13:
  308.     if(flag6!=1)   
  309.   {lcd_wdat('+');
  310. d=0;        
  311. d2=d1;      
  312. flag=0;}   
  313.     else {  
  314.       lcd_wdat(0xe8);   
  315.       flag=4;     }
  316. break;   
  317. case 14:
  318. //  lcd_wdat(246);
  319. //flag5=1;  
  320. break;   
  321.   default:
  322. break;
  323.   }}
  324. //if(flag5==1)  //  变功能 //
  325. flag=flag+4;
  326. if(flag==7)
  327. {lcd_wcmd(0x01);
  328.      d=0,key1=0,flag=flag1=flag2=flag3=flag4=flag5=flag6=0;     
  329. i=k=0;d1=d2=d3=d4=d5=0;}
  330. if(key<10) {
  331.   d=key+d*10;}
  332. d1=d;  
  333. if(d1!=d2) {  
  334. if(key==15)
  335. { lcd_wdat('=');
  336.   delay(5);
  337. flag6=1;
  338.   lcd_pos(0x40);
  339.    lcd_wdat('A');//A   lcd_wdat('N');//
  340. N   lcd_wdat('S');//S   lcd_wdat(':');//   

  341.     switch(flag)   {
  342.   case 0:d3=d2+d;break;     
  343. case 1:d3=d2-d;break;     
  344.   case 2:d3=d2*d;break;      
  345. case 3:d4=d2*10000/d;   
  346.     flag2=1;   //*d3=d2/d;         
  347.    // d5=d2%d;
  348. break;   
  349. case 4:d4=p2(d)
  350. flag2=0; break;
  351. case 5: d3=d*d;  
  352. // flag2=0; break;
  353. case 6:  d4=10000/d;   
  354. flag2=1;break;
  355.   /* case 7:   lcd_wcmd(0x01);
  356.      d=0,key1=0,flag=flag1=flag2=flag3=flag4=flag5=flag6=0;  
  357.     i=k=0;d1=d2=d3=d4=d5=0;  
  358.    break; */   default:break;   }   
  359.   if(d3!=0)  
  360. {f=d3;
  361.     lcd_wcmd(0x04);lcd_pos(0x4e);  
  362.     while(f!=0) {  
  363.              lcd_wdat(0x30+f%10);  f=f/10;            }       }
  364.   if(d4!=0)   {  
  365.     switch(flag2)  (
  366. case 0:d4=d4*10000;   
  367. f=d4;      f1=f%10000;     f=f/10000;
  368.     lcd_wcmd(0x04); lcd_pos(0x4e);   i=4;
  369. if(f1!=0)     { while(i--)
  370. {  
  371.     lcd_wdat(0x30+f1%10);  
  372.     f1=f1/10;  }  
  373.       lcd_wdat('.');}   
  374.    while(f!=0) {
  375.    lcd_wdat(0x30+f%10);  
  376.   f=f/10;}                  
  377.   break;              
  378.   case 1:      d4=d4;     f=d4;      
  379.   f1=f%10000;  
  380.    f=f/10000;
  381. lcd_wcmd(0x04);
  382. lcd_pos(0x4e);  
  383.   i=4;
  384.     if(f1!=0)   
  385. { while(i--)         
  386.     {  
  387.        lcd_wdat(0x30+f1%10);            
  388. f1=f1/10; }  
  389.       lcd_wdat('.');}      
  390. while(f!=0)  {
  391.    lcd_wdat(0x30+f%10);   
  392. f=f/10;    }   
  393. if(d4<10000)
  394. lcd_wdat('0');   
  395.    break;        
  396.       default:break;}
  397.    }   }     
  398.    while(1)     {
  399.     if((P1IN&0x0f)==0x0f)     break;     }   
  400.   if(P1IFG & BIT0)
  401.    {           
  402.          P1IFG &= ~(BIT0);// 清除中断标志位    }
  403.     if(P1IFG & BIT1)
  404.     {
  405.          P1IFG &= ~(BIT1);// 清除中断标志位     }
  406.     if(P1IFG & BIT2)     {
  407.          P1IFG &= ~(BIT2);// 清除中断标志位
  408.   }
  409.      if(P1IFG & BIT3)   
  410.   {
  411.          P1IFG &= ~(BIT3);// 清除中断标志位     }     
  412.    /*if(flag6==1) {if(key!=0)
  413. {lcd_wcmd(0x01);flag6=0; d=0;} }*/ }
  414. void main()
  415. {
  416. inot();  _DINT();   lcd_init();
  417.   lcd_wcmd(0x01);   lcd_wcmd(0x06);  
  418. lcd_pos(0x05);   lcd_wdat(0x57);
  419. //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);  
  420.    lcd_wcmd(0x01);   
  421.   _EINT();   while(1)
  422.   {  _BIS_SR(CPUOFF);
  423.   _NOP(); }   }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表