📄 关于msp430的简单计算器程序.txt
字号:
#include <msp430x44x.h>
char speed=1;
char key_val;
char yunsuanfu ;
char fuhao=1;
unsigned char key_Map[12]={1,2,3,10,4,5,6,0,7,8,9,11};
#define LED_IN_USE 6
/*****************************************************/
/* 数据定义 */
/*****************************************************/
const unsigned char NUM_LED[20]=
{0xd7,0x14,0xcd,0x5d,0x1E, // 0 ~ 4
0x5b,0xdb,0x15,0xdf,0x5f, // 5 ~ 9
0x9f,0xda,0xc3,0xdc,0xcb, // a ~ e
0x8b,0x00,0x40,0x8};
//f,0x00使LED不显示
unsigned char led_Buf[LED_IN_USE]; // LED显示缓冲区 ,
// 存放要显示数据
unsigned char led_Ctrl;
/*******************************************************
* 模块初始化
*******************************************************/
void init_LED(void){
char tmpv;
P3DIR = 0xff; // 设置 p3 输出
P3OUT = 0x00; // 设置 初始值为0
P4DIR |= 0x03; // 设置 p4.0,p4.1 输出
P4OUT &= 0xfc; // 设置初始值
led_Ctrl=0;// led_Ctrl用于控制那个LED可显示
for(tmpv=0;tmpv<LED_IN_USE;tmpv++)
{ // 初始化缓冲区
led_Buf[tmpv] = 0x12;
}
}
/****************************************************
* LED 显示 ,该函数可以放到定时器中断中
****************************************************/
void delay (unsigned long v)
{
while (v!=0) v--;
}
void led_Display(){
unsigned tmp,i ;
tmp=0x01;
for(i=0;i<6;i++)
{
tmp = 0x01;
P3OUT = NUM_LED[led_Buf[led_Ctrl]]; // 设置显示值
P4OUT |= 0x02; // 打开数据锁存器
P4OUT &= 0XFD; // 关闭数据锁存
P3OUT = ~(tmp<<i); // 设置那只LED显示
P4OUT |= 0x01; // 打开控制锁存
P4OUT &= 0XFE; // 关闭控制锁存
delay(300);
led_Ctrl= (led_Ctrl +1) % LED_IN_USE; // 设置下一个要显示的LED
}
}
char key_j(void)
{
P1DIR=0X0E;
P1OUT=0X00;
return(P1IN&0XF0);
}
void check_key(void)
{
unsigned char row,col,tmp1,tmp2;
tmp1=0x08;
for(row=0;row<3;row++)
{
P1OUT |=0X0E;
P1OUT-=tmp1;
tmp1=tmp1/2;
if((P1IN&0XF0)<0XF0)
{
tmp2=0X80;
for(col=0;col<0x04;col++)
{
if((P1IN&tmp2)==0x00)
{
key_val=key_Map[row*4+col];
if(fuhao==1)
fuhao=0;
else
fuhao=1;
return;
}
tmp2/=2;
}
}
}
}
void key()
{
if(key_j()!=0xf0)
led_Display();
delay(300);
if(key_j()!=0xf0)
check_key();
key_loop:
if(key_j() !=0xf0)
goto key_loop;
}
void dateclear(void)
{
char i;
for(i=0;i<6;i++)
led_Buf[i]=0x12;
return;
}
int input_date(void)
{led_Display();
char i,t=fuhao;
int date=0;
input_data_loop:
for(i=0;i<6;i++)
{
while(t==fuhao)
{ led_Display();
key();
}
t=fuhao;
if(key_val==11)
{ dateclear();
return date;
}
else
if(key_val != 10)
{
led_Buf[i]=key_val;
date=date*10+led_Buf[i];
led_Display();
}
else
if(key_val==10)
{
dateclear();
led_Display();
goto input_data_loop;
}
}
return date;
}
main(void)
{
int t=fuhao;
char i=0;
int a,b,rusult;
WDTCTL=WDTHOLD+WDTPW;
init_LED();
led_Display();
while(1)
{
a=input_date();
b=input_date();
m_loop:
while(t==fuhao)
{led_Display();
key();
}
yunsuanfu=key_val;
t=fuhao;
n_loop:
while(t==fuhao)
{ led_Display();
key();
}
t=fuhao;
if(key_val==11)
dateclear();
else
goto n_loop;
switch(yunsuanfu)
{
case 1:
rusult=a+b;
break;
case 2:
rusult=a-b;
break;
case 3:
rusult=a*b;
break;
case 4:
rusult=a/b;
break;
default:goto m_loop;
break;
}
int p=rusult,k=0,d[6];
while (p)
{
d[k]=p%10;
p/=10;
k++;
}
for(int l=0;l<k;l++)
led_Buf[l]=d[k-l-1];
while(t==fuhao)
{key();
led_Display();
}
init_LED();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -