⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 final.c

📁 使用MSP430的LED、LCD、键盘等模块完成一个多功能的计算器
💻 C
字号:
#include <msp430x44x.h>

int key_val = 0xFF;									//全局变量,按键的值
int day  = 1;										//day
int hour = 0;										//hour
int min  = 0;										//min
int sec  = 0;										//sec
int enable=1;										//时钟是否走
int is_a_new = 0;									//是否为一个新的按键
int key_val_last = 0xff;							//最后一按键的键值
int led[6]={0,0,0,0,1,0};							//初始化LED
int key_map[12] = {1,2,3,10,4,5,6,0,7,8,9,11};		//设置键盘逻辑键值与程序计算键值的映射
int digit_led[11] = {0XD7,0X14,0XCD,0X5D,0X1E,0X5B,0XDB,0X15,0XDF,0X5F,0x40};		//led的字型编码
int digit_lcd[10] = {0x7B,0x12,0x4F,0x1F,0x36,0x3D,0x7D,0x13,0x7F,0x3F};			//lcd的字型编码
unsigned long code[32][2] = {123,456,123456,123456,234567,234567,378901,678905};		//用户名和密码数组

void init_lcd()			//初始化lcd
{
	int i;
	LCDCTL = LCDON + LCD4MUX + LCDP2;			// 4Mux, S0-S17
	BTCTL = BTFRFQ1;							// 基本定时器输出
	P5SEL = 0xFF;								// 公共极和Rxx选择
	for(i = 9;i >= 0;i--)
		LCDMEM[i] = 0x00;
}

void init_led()
{
	P4DIR |= 0X03;
	P3DIR = 0XFF;
	P3OUT = 0X00;
	P4OUT = 0X03;
	P4OUT = 0X00;
}

void init_Keyboard()
{     
	P1DIR = 0x0F;			//设置P1.4~P1.8 设置为输入模式,P1.0~P1.3 设置为输出模式
	P1OUT = 0x0E;			//P1.1~P1.3 输出值清零
}

void check_key()
{
	unsigned char row ,col,tmp1,tmp2;
	// tmp1用来设置P1OUT的值,使P1.1~P1.3中有一个为0
	tmp1 = 0x08;
	for(row=0;row<3;row++)
	{
		P1OUT |= 0x0E;                          // p1.1~P1.3=1
		P1OUT -= tmp1;                          // P1.1~p1.3中有一个为0
		tmp1 = tmp1/2;                          // tmp1 右移一位      
		if ((P1IN & 0xf0) < 0xf0)
		{              			// 是否P1IN的P1.4~P1.7中有一位为0         
			tmp2 = 0x80;
			for(col =0;col<4;col++)
			{         			// 列检测
				if((P1IN & tmp2)==0x00)
				{          			// 是否是该列
					key_val =key_map[ row*4 +col] ; // 获取键值
					if(key_val != key_val_last)
					{
						is_a_new = 1;
						key_val_last = key_val;
						return;// 退出循环
					}
					else
					{
						is_a_new = 0;
						
						return;
					}                        
				}
				tmp2 /= 2;                      // tmp2右移 
			}
		}
	}  
	key_val_last=0xff;   
}

void passin()
{
	
	unsigned temp;
	unsigned long username = 0;
	unsigned long password = 0;
	int key;
	int i=6;
	LCDMEM[i--] = 0x7a;
	LCDMEM[i] = 0x80; 						//显示“U”,表示USERNAME;
	while(1)
	{
		while(is_a_new)
		{
			is_a_new = 0;
			key = key_val;
			if(key == 11)					//按了“确认”
			{
				i=-1;
				break;
			}			
			else if(key == 10)					//按了“back”
			{
				if(i==5) ;
				else
				{
					username /=10;
					LCDMEM[i] = 0x00;
					LCDMEM[++i] = 0x08;
				}
			}
			else if(key < 10)					//按了数字键
			{
				username = username*10 + key;
				LCDMEM[i--] = digit_lcd[key];
				if(i==-1) break;
				LCDMEM[i] = 0x08;
			}
		}
		if(i==-1) break;
	}
	
	for(i = 6;i >= 0;i--) LCDMEM[i] = 0x00;
	i=6;
	LCDMEM[i--] = 0x67;
	LCDMEM[i] = 0x08;							//显示“P”,表示PASSWORD;
	while(1)
	{
		while(is_a_new)
		{
			is_a_new = 0;
			key = key_val;
			if(key == 11)					//按了“确认”
			{
				i=-1;
				break;
			}			
			else if(key == 10)					//按了“back”
			{
				if(i==5);
				else
				{
					password /=10;
					LCDMEM[i] = 0x00;
					LCDMEM[++i] = 0x08;
				}
			}
			else if(key < 10)					//按了数字键
			{
				password = password*10 + key_val;
				LCDMEM[i--] = 0xff;
				if(i==-1) break;
				LCDMEM[i] = 0x08;				
			}			
		}
		if(i ==-1) break;
	}
	
	for(i = 0;i < 4;i++)
	{
		if(code[i][0] != username) continue;
		else if(code[i][1] == password) break;
	}
	if(i == 4)
	{
		for(temp = 7;temp > 0;temp--)
			LCDMEM[temp - 1] = 0xFF;
	}
	else
	{
		P1OUT |= 0x01;									//小灯亮	
		//可能做UART
	}
	for(temp = 0xffff;temp>0;temp--);
	for(temp = 0xffff;temp>0;temp--);
	for(temp = 0xffff;temp>0;temp--);					//延时,即开门的时间或者是报告出错信息的时间//要改//;
	for(temp = 7;temp > 0;temp--)
		LCDMEM[temp - 1] = 0x00;
	P1OUT &= 0XFE;
}

void display()
{
	int intd,k;
	int temp = 0x01;
	for(intd = 6;intd>0;intd--)
	{
		P3OUT = ~temp;
		P4OUT = 0x01;
		P4OUT = 0x00;
		P3OUT = digit_led[led[intd-1]];
		P4OUT = 0x02;
		P4OUT = 0x00;
		for(k=0xFF;k>0;k--);
		temp = temp*2;
	}
}

void set_clock()
{
	int i=5;
	int tc[6];
	int key;
	enable=0;
	for(i=0;i<6;i++) tc[i]=led[i];
	i=5;
	led[i] = 10;										//显示“_”
	while(1)
	{
		while(is_a_new)
		{
			is_a_new = 0;
			key=key_val;
			if(key == 11)								//按了“确认”
			{
				led[i]=tc[i];
				i=-1;				
				break;
			}
			else if(key == 10)								//按了“back”
			{
				if(i==5);
				else
				{
					led[i]=tc[i];
					led[++i]=10;
				}
			}
			else if(key < 10)								//按了数字键
			{
				switch(i)
				{
				case 5:
					if(key < 4)
					{
						led[i--] = key;
						led[i] = 10;
					}
					else
					{
						led[i--] = 0;
						led[i--] = key;
						led[i] = 10;
					}
					break;
				case 4:
					if(led[5] ==3)
					{
						if(key > 1)
						{
							led[i--] = 1;
							led[i] = 10;
						}
						else
						{
							led[i--] = key;
							led[i] = 10;
						}
					}
					else
					{
						led[i--] = key;
						led[i] = 10;
					}
					break;
				case 3:
					if(key < 3)
					{
						led[i--] = key;
						led[i] = 10;
					}
					else
					{
						led[i--] = 0;
						led[i--] = key;
						led[i] = 10;
					}
					break;
				case 2:
					if(led[3] ==2)
					{
						if(key > 3)
						{
							led[i--] = 3;
							led[i] = 10;
						}
						else
						{
							led[i--] = key;
							led[i] = 10;
						}
					}
					break;
				case 1:
					if(key < 6)
					{
						led[i--] = key;
						led[i] = 10;
					}
					else
					{
						led[i--] = 0;
						led[i--] = key;
						led[i] = 10;
					}
					break;
				case 0:
					led[i--] = key;
					break;
				default :
					break;
				}
			}
			if(i==-1) break;
		}	if(i==-1) break;
	}
	sec = 0;
	enable=1;
}


void main()
{
	WDTCTL = WDTPW + WDTHOLD;	
	init_led();
	init_lcd();
	init_Keyboard();
	BTCTL = BTSSEL+BT_ADLY_32+BTFRFQ1;	//BT 1/32秒中断		//频率:32768/256/16=1/8HZ;
	IE2 |= BTIE;				//BT中断允许
	WDTCTL = WDT_ADLY_250;  		//开看门狗中断
	IE1 |= WDTIE;				//看门狗中断允许
	_EINT();				//开系统中断
	while(1)
	{
		display();
		while(is_a_new)
		{
		        is_a_new = 0;
			if(key_val == 11) passin();
			if(key_val == 10) set_clock();
		}		
	}
}

#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer()
{
	check_key();
}

#pragma vector = BASICTIMER_VECTOR
__interrupt void basic_timer()
{
	display();
	if(enable!=0)
	{
	  if(++sec<32)				//是否到了60秒
          {
		return;
	  }
	  sec = 0;
	  min = led[1] * 10 + led[0];		//分钟数
	  if(++min<60) 				//是否到了60分
	  {
		led[1] = min / 10;
		led[0] = min % 10;
		return;
	  }
	  min = 0;
	  led[0] = 0;
	  led[1] = 0;
	  hour = led[3] * 10 + led[2];		//小时数
	  if(++hour<24) 				//是否到了24小时
	  {
		led[3] = hour / 10;
		led[2] = hour % 10;
		return;
	  }
	  hour = 0;
	  led[2] = 0;
	  led[3] = 0;
	  day = led[5] * 10 + led[4];		//天数
	  if(++day<32) 				//是否到了31天
	  {
		led[5] = day / 10;
		led[4] = day % 10;
		return;
	  }
	  day = 1;
	  led[4] = 1;
	  led[5] = 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -