本人是430初学者,下了个小程序,打算实现每按一次4x4键盘,数码管移动显示一位,就和我们用的普通计算器那样,可是调了很久也没有实现这个功能,现在贴上来。求大神指点。需要说明的是p1.0-p1.3是列1.4-1.7是行
/****************************
程序本来要实现数码管和计算器一样
每按一个键数字向左移动一位显示
可是调了很久都没有实现,同样的程序
在按照51单片机的规则写在51的开发板上可以实现
可是在430上没有成功,求指点
****************************/
#include <msp430x14x.h>/*头文件*/
typedef unsigned char uchar;
#define wei_h P5OUT |= BIT5 /*定义P5输出为00100000,打开位锁存器*/
#define wei_l P5OUT &=~BIT5 /*定义P5输出为00000000,关闭位锁存器*/
#define duan_h P6OUT |=BIT6 /*定义P6输出为01000000,打开段锁存器*/
#define duan_l P6OUT &=~BIT6 /*定义P6输出为00000000,关闭段锁存器*/
#define dataport P4OUT /*宏定义P4输出,用dataport代替P4OUT*/
uchar duanma[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
uchar weima[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar tempdata[8];
void delay(unsigned int t);
void display(unsigned int firstbit, unsigned int Num); /*函数声明*/
uchar key_port(void);
/***************************************
主函数
***************************************/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; /*关闭看门狗*/
uchar i, j, num;
uchar temp[8];
/*************************************
设置I/O口状态
*************************************/
P4DIR = 0xff;
P4OUT = 0x00;
P5DIR = 0xff;
P6DIR = 0xff;
P6OUT = 0xff; //防止蜂鸣器响
display(0,8);
while(1)
{
num = key_port();
if (num != 0x00)
{
if (i<8)
{
temp[i] = duanma[num];
for (j=0; j<=i; j++)
{
tempdata[7-i+j] = temp[j];
}
}
i++;
if (i == 9) // 为了清屏
{
i = 0;
for(j=0; j<8; j++)
{
tempdata[j] = 0;
}
}
}
}
}
void delay(unsigned int t)
{
while(t--);
}
/*******************************************************
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如输入0表示从
第一个显示。Num表示需要显示的位数,如需要显示99两位数值
则该值输入2
********************************************************/
void display(unsigned int firstbit, unsigned int Num)
{
static unsigned char i=0;
duan_h;
dataport = 0;
duan_l;
wei_h;
dataport = weima[i + firstbit];
wei_l;
duan_h ;
dataport = tempdata[i];
duan_l;
i++;
if (i==Num)
i = 0;
}
uchar key_scanf(void)
{
uchar key_in_1, key_in_2;
P1DIR = 0xff; //P1方向设置为输出
P1OUT = 0xf0; //P1输出为11110000
P1DIR = 0x0f; //P1.0-P1.3设置为输出,P1.4-P1.7设置为输入
key_in_1 = P1IN&0xf0; //读取当前P1上的状态
if (key_in_1 != 0xf0) //判断是否有键被按下
{
delay(10); //延时一段时间确认有键被按下
if (key_in_1 != 0xf0) //再次确认是否有键被按下
{
key_in_1 = P1IN&0xf0;
P1DIR = 0xff; //P1方向设置为输出
P1OUT = 0x0f; //P1输出为00001111
P1DIR = 0xf0; //P1.0-P1.3设置为输入,P1.4-P1.7设置为输出
key_in_2 = P1IN&0x0f; //读取当前P1上的状态
}
return (key_in_1 + key_in_2); //key_in_1和key_in_2的值组合形成键码
}
else
return (0x00);
}
/********************************
按键值处理程序
********************************/
uchar key_port(void)
{
switch(key_scanf()) //按键值判断处理,并将处理值返回
{
case 0xee: return 0;
break;
case 0xed: return 1;
break;
case 0xeb: return 2;
break;
case 0xe7: return 3;
break;
case 0xde: return 4;
break;
case 0xdd: return 5;
break;
case 0xdb: return 6;
break;
case 0xd7: return 7;
break;
case 0xbe: return 8;
break;
case 0xbd: return 9;
break;
case 0xbb: return 10;
break;
case 0xb7: return 11;
break;
case 0x7e: return 12;
break;
case 0x7d: return 13;
break;
case 0x7b: return 14;
break;
case 0x77: return 15;
break;
default : return 0x00;
break;
}
}
|