📄 键盘输入第一个运算数据的显示.c
字号:
//
//******************************************/
#include <msp430x44x.h>
#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 key_Map[12] ={ //设置键盘逻辑键值与程序计算键值的映射
1,2,3,10,4,5,
6,0,7,8,9,11
};
unsigned char led_Buf[6]; // LED显示缓冲区 , // 存放要显示数据
char key_val;
char key_con=0;
char yunsuanfu=0;
void key();
void delay(unsigned long v)
{
while(v!=0)v--;
}
char Keyj(void)
{
P1DIR |= 0x0E; // set p1.1~p1.3 设置为输出模式
P1OUT = 0x00; // p1.1~p1.3 输出值清零
return(P1IN & 0xf0 ) ;
}
/*********************************************
* Check_Key(),检查按键,确认键值
*********************************************/
void check_Key(void){
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; // tmp2用于检测出那一位为0
for(col =0;col<0x04;col++){ // 列检测
if((P1IN & tmp2)==0x00){ // 是否是该列
key_val =key_Map[ row*4 +col] ; // 获取键值
return; // 退出循环
}
tmp2 /= 2; // tmp2右移
}
}
}
}
/*******************************************************
* 模块初始化
*******************************************************/
void init_LED(void)
{
char tmpv;
P3DIR = 0xff; // 设置 p3 输出
P3OUT = 0x00; // 设置 初始值为0
P4DIR |= 0x03; // 设置 p4.0,p4.1 输出
P4OUT &= 0xfc; // 设置初始值
for(tmpv=0;tmpv<LED_IN_USE;tmpv++)
{ // 初始化缓冲区
led_Buf[tmpv] = 0x12;
}
}
/****************************************************
* LED 显示 ,该函数可以放到定时器中断中
****************************************************/
void led_Display()
{
unsigned tmp ,i ;
tmp = 0x01;
for(i=0;i<6;i++)
{
P3OUT = NUM_LED[led_Buf[i]]; // 设置显示值
P4OUT |= 0x02; // 打开数据锁存器
P4OUT &= 0XFD; // 关闭数据锁存
P3OUT = ~(tmp<<i); // 设置那只LED显示
P4OUT |= 0x01; // 打开控制锁存
P4OUT &= 0XFE; // 关闭控制锁存
delay(300);
}
}
void key()
{
key_k:
led_Display();
if(Keyj()!=0xf0)
led_Display();
if(Keyj()!=0xf0)
check_Key();
else goto key_k;
key_loop:
if(Keyj()!=0xf0)
goto key_loop;
}
void clr_dis(void)
{
char i;
for(i=0;i<6;i++)
led_Buf[i]= 0x10;
}
int input_data(void)
{
char i;
for(i=0;i<4;i++)
{
key();
led_Buf[i]= key_val ;
}
return(led_Buf[0]*1000+led_Buf[1]*100+led_Buf[2]*10+led_Buf[3]);
}
/*
main(void)
{
WDTCTL = WDTHOLD + WDTPW;
while(1)
{
if(Keyj() != 0xf0 )
{
delay(200); //延时消除抖动
if(Keyj() == 0xf0 )
; //没有按键 为抖动
else //确实有键按下
{
P1DIR |= BIT0;
P1OUT = 1 ; //处理
delay(10000);
P1OUT = 0 ;
}
}
}
}
*/
/******************************************/
void main(void)
{
char i=0;
int a,b;
WDTCTL = WDTHOLD + WDTPW; //关闭看门狗
init_LED();
while(1)
{ //循环
a=input_data();
clr_dis();
key();
yunsuanfu = key_val ;
b=input_data();
clr_dis();
main_loop:
key();
if(key_val == 11 )
a=a+b;
else goto main_loop;
led_Buf[0] = a / 1000;
a= a % 1000 ;
led_Buf[1] = a / 100;
a= a % 100 ;
led_Buf[2] = a / 10;
led_Buf[3] = a % 10;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -