完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 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 |
|
相关推荐
2个回答
|
|
你解决了没有?是怎么解决的。我也遇到了这个问题。
|
|
|
|
可以相互讨论一下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11792 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 20:05 , Processed in 0.608577 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号