本帖最后由 spawm 于 2012-12-17 18:40 编辑
void main()
{
while(1)
{
read_key(); //键盘扫描程序,这是TM1668
芯片的键盘扫描程序,如果有按键按下将会把按键的值存入KEY1,KEY2, //KEY3,KEY4,KEY5,这个五个变量中,这是TM1668决定的,只能这样接收
if(key2 <= 8 && key2>0) //key2按键的值只有0x01和0x08,因为我只接了两个按键
{
if(key2==8)
{
s1++;
}
if(s1!=0)
{
if(s1==1)
{
tm1668(table[0],table[0],table[0],table[0],table[0]);
}
if(s1==2)
{
tm1668(table[1],table[1],table[1],table[1],table[1]);
}
if(s1==3)
{
tm1668(table[2],table[2],table[2],table[2],table[2]);
}
if(s1==4)
{
tm1668(table[3],table[3],table[3],table[3],table[3]);
}
if(s1==5)
{
s1=0;
}
}
}
}
}
//向TM1668写入1位数据
void send_data1668(unsigned char dat)
{
unsigned char i;
STB=0;
for(i=0;i<8;i++)
{
CLK=0;
if(dat & (1 << i)) {DIO=1;}
else {DIO=0;}
_nop_();
CLK=1;
}
}
//读取1位数据
uchar read_data()
{
uchar i,k=0; //i——控制循环次数,k——临时保存读到的数据
DIO=1; //释放DIO为输入
STB=0; //保证“STB”为低电平,程序不依赖于之前端口的状态
//保证程序在实际运行中不会出现“端口迷失”
for(i=0;i<8;i++)
{
CLK=0; //先将“CLK”清零
k=k>>1;
if(DIO == 0)
{
k=k&0x7f; //如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
}
else
{ //如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
k=(k|0x80&0xff);
}
CLK=1; //送时钟的上升沿
} //送完一个字节后退出循环
return(k); //返回读到的1字节数据
}
//读取键盘值,一次读五个字节
void read_key()
{
STB=1;
send_data1668(0x42);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
key1=read_data();
key2=read_data();
key3=read_data();
key4=read_data();
key5=read_data();
STB=1;
}
//向tm1668发送数据让数码管显示
void tm1668_led(uchar data6)
{
STB=1;
_nop_();
STB=0;
send_data1668(0x03);//显示模式设置
STB=1;
_nop_();
STB=0;
send_data1668(0x44);//固定地址模式
STB=1;
_nop_();
STB=0;
send_data1668(0xca);//发送地址,LED灯
send_data1668(data6);//发送数据,data6
STB=1;
_nop_();
STB=0;
send_data1668(0x8B);//发送显示命令
}
void tm1668(uchar data1,data2,data3,data4,data5)
{
STB=1;
_nop_();
STB=0;
send_data1668(0x03);//显示模式设置
STB=1;
// _nop_();
STB=0;
send_data1668(0x44);//固定地址模式
STB=1;
// _nop_();
STB=0;
send_data1668(0xc0);//发送地址数码管第一位
send_data1668(data1);//发送数据
STB=1;
// _nop_();
STB=0;
send_data1668(0xc2);//发送地址第二位
send_data1668(data2);//发送数据
STB=1;
// _nop_();
STB=0;
send_data1668(0xc4);//发送地址第三位
send_data1668(data3);//发送数据
STB=1;
// _nop_();
STB=0;
send_data1668(0xc6);//发送地址第四位
send_data1668(data4);//发送数据
STB=1;
// _nop_();
STB=0;
send_data1668(0xc8);//发送地址,第五位
send_data1668(data5);//发送数据,data5
STB=1;
// _nop_();
STB=0;
send_data1668(0x8B);//发送显示命令
}
现在有个问题,当按下按键的时候(比如这个按键发送过来是数据是0x02),这个芯片会一直发送0x02,我想只接收第一个0x02后就不再接收之后的0x02,这样好处理s1,直等到松手后,再按下这个按键,再接收第二0x02
一周热门 更多>