|
楼主
查看: 5198回复: 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);
}
}
}
|
|