标题:
msp430计算机小程序
[打印本页]
作者:
单片机小白1995
时间:
2018-5-8 15:26
标题:
msp430计算机小程序
#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(); } }
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1