[MSP-EXP430G2ET] 求助 用430G2553控制tm1636实现扫键

[复制链接]

1

主题

2

帖子

62

积分

一粒轻沙

Rank: 1

积分
62
楼主
查看: 3167回复: 2 发表于 2019-5-9 16:18:23   只看该作者
本帖最后由 fssfgsfg 于 2019-5-11 12:57 编辑

我这里一共设置了六个键  四个数码管的示数初始为0000,键定义为控制数码管数值加减和左移右移,还有两个键未定,这里扫键环节出了问题,扫键命令发出去后,430收到的数据一直是0xff不变
#include<msp430.h>
#define clk1 P1OUT |= BIT4
#define clk0 P1OUT &= ~BIT4
#define dio1 P1OUT |= BIT0
#define dio0 P1OUT &= ~BIT0
const unsigned char dis[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const unsigned char key[6] = {0xef,0xf7,0x6f,0x77,0xaf,0xb7};
const unsigned char addres[4] = {0xc3,0xc2,0xc1,0xc0};
unsigned int dis1[4] = {0,0,0,0};
//=====================================
void TM1636_Start(void)        //1636 开始
{
    clk1;
    dio1;
    __delay_cycles(22);//延时22微秒
    dio0;
}
//===========================================
void TM1636_ask(void)          //1636 ACK应答
{
    clk0;
    __delay_cycles(55);       //在第八个时钟下降沿之后延时5us,开始判断ACK 信号

    clk1;
    __delay_cycles(22);
    clk0;
}
///========================================
void TM1636_Stop(void)            // 1636 停止
{
    clk0;
    __delay_cycles(22);
    dio0;
    __delay_cycles(22);
    clk1;
    __delay_cycles(22);
    dio1;
}
///=========================================
void TM1636_WrByte(unsigned char oneByte) //写一个字节
{
    unsigned int i;
    for(i=0;i<8;i++)
    {
        clk0;
        if(oneByte&0x01) //低位在前
            {
            dio1;
            }
        else
        {
            dio0;
        }
        __delay_cycles(33);
        oneByte=oneByte>>1;
        clk1;
        __delay_cycles(33);
    }
}
///-------------------------------------------------
unsigned char Scankey(void)
{
    unsigned char rekey=0x00,i;
    TM1636_Start();
    TM1636_WrByte(0x42);//发送读键扫描命令
    TM1636_ask();
    dio1;
    for(i=0;i<8;i++)
    {
        clk0;
        rekey=rekey>>1;
        __delay_cycles(33);
        clk1;
        if(P1IN&BIT0)
        {
            rekey=rekey | 0x80;
        }
        else
        {
            rekey=rekey|0x00;
        }
        __delay_cycles(33);
    }
    TM1636_ask();
    TM1636_Stop();
    return (rekey);
}
//=============================
void SmgDisplay(void)                        //写显示寄存器
{
    unsigned int i;
    TM1636_Start();
    TM1636_WrByte(0x40);
// 40H 地址自动加1 模式,44H 固定地址模式,本程序采用自加1模式
    TM1636_ask();
    TM1636_Stop();
    TM1636_Start();
    TM1636_WrByte(0xc0); //设置首地址,
    TM1636_ask();
    for(i=0;i<4;i++) //地址自加,不必每次都写地址
        {
        TM1636_WrByte(0x3f);
        TM1636_ask();
        }
    TM1636_Stop();
    TM1636_Start();
    TM1636_WrByte(0x8f);                       //开显示 ,最大亮度
    TM1636_ask();
    TM1636_Stop();
}
///==============================================
void Display(unsigned char i,unsigned char j)
{
    TM1636_Start();
    TM1636_WrByte(0x44);// 44H 地址自动加1 模式,44H 固定地址模式
    TM1636_ask();
    TM1636_Stop();
    TM1636_Start();
    TM1636_WrByte(addres); //设置地址
    TM1636_ask();
    TM1636_WrByte(j); //送数据
    TM1636_ask();
    TM1636_Stop();
    TM1636_Start();
    TM1636_WrByte(0x8f);                       //开显示 ,最大亮度
    TM1636_ask();
    TM1636_Stop();
}
//================================================
//===============================================

void main()
{
    WDTCTL = WDTPW + WDTHOLD;
    unsigned char keyvalue,s=0;
    DCOCTL = 0;
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;  //DCO设置为1MHZ
    P1DIR |= BIT4 + BIT0 + BIT6; //P1.0和P1.4设置为输出,P1.0输出dio,P1.4输出clk
    BCSCTL2 |= DIVM_3;//8分频
    SmgDisplay();//数码管显示初值0000
    while(1)//循环读键值
         {
         keyvalue=Scankey(); //读按键值
         if(0xf7==keyvalue)//按键1的键值位0xf7,数值加
                      {
                      dis1++;
                      if(dis1==10)
                          dis1=0;
                      Display(s,dis[dis1]);//输送显示的位置和值
                      }
                  else if(0xef==keyvalue)//数值减
                  {
                      dis1--;
                      if(dis1<0)
                          dis1=9;
                      Display(s,dis[dis1]);
                  }
                  else if(0x77==keyvalue)//左移
                  {
                      s++;
                      if(s==4)
                          s=0;
                      Display(s,(dis[dis1]|0x80));//被选中位数值不变,小数点亮
                  }
                  else if(0x6f==keyvalue)//右移
                  {
                      s--;
                      if(s==-1)
                          s=3;
                      Display(s,(dis[dis1]|0x80));//被选中位数值不变,小数点亮
                  }
                  else if(0xb7==keyvalue)//确定键,退出编辑状态,关闭小数点
                  {
                     Display(s,(dis[dis1] & 0x7f));//被选中位数值不变,小数点关闭
                  }
                  else if(0x00==keyvalue)
                  {
                      Display(1,0x45);
                  }
                  else if(0xff==keyvalue)
                  {
                      Display(2,0x45);
                  }
         }
}

QQ截图20190511125640.png (39.21 KB, 下载次数: 49)

这是我们电路图

这是我们电路图

0

主题

1

帖子

1570

积分

单晶硅锭

Rank: 3Rank: 3

积分
1570
沙发
发表于 2019-5-16 08:04:39   只看该作者
可以啊,

1

主题

2

帖子

62

积分

一粒轻沙

Rank: 1

积分
62
板凳
发表于 2019-5-16 18:49:18   只看该作者

你在电路上面跑过了吗?:o 我一直读不出来键值 全是0xff
快速回复 返回顶部 返回列表