[问题点数:0分,结帖人kltwjt]　一键查看最优答案　确认一键查看最优答案?　本功能为VIP专享,开通VIP获取答案速率将提升10倍哦!　取消　本版专家分:64　结帖率　89.61%　本人刚开始学弹片,对C语言也是刚刚接触,看了<<十天学会单片机和C语言编程>>　对于入门还不错.　在这里贴出自己写的键盘扫描实现,小弟初学者,也没考虑那么多,如效率之类的　有不足之处　欢迎大家讨论　#include　#include　#define　uint　unsigned　int　#define　uchar　unsigned　char　sbit　dula=P2^6;　sbit　wela=P2^7;　uchar　code　table[]={　0x3f,0x06,0x5b,0x4f,　0x66,0x6d,0x7d,0x07,　0x7f,0x6f,0x77,0x7c,　0x39,0x5e,0x79,0x71,0};　uchar　num,temp;　void　init();　void　display(uchar);　void　keyscan();　void　main()　{　init();　while(1)　{　keyscan();　display(num);　}　}　void　init()　{　//初始化时显示所有数码管　num=1;　dula=1;　P0=0;　dula=0;　wela=1;　P0=0xc0;　wela=0;　}　void　display(uchar　i)　{　dula=1;　P0=table[i-1];　dula=0;　}　void　keyscan()　{　uchar　i;　P3=0xfe;　//初始化检测第一排键盘　for(i=0;i<4;i+由于是用Proteus模拟,所以没有消抖检测　temp=P3;　temp=temp&0xf0;　if(temp!=0xf0)　{　temp=P3;　switch(temp&0xf0)　//因为用了for循环,所以只比较高4位即可　{　case　0xe0:num=1;　break;　case　0xd0:num=2;　break;　case　0xb0:num=3;　break;　case　0x70:num=4;　break;　}　num=num+i*4;　//i表示第几排　while(temp!=0xf0)　//键盘释放显示数字　{　temp=P3&0xf0;P3=_crol_(P3,1);　//每左移一位检测下一排按键　}　}　本版专家分:64　4*4按键的效果是显示0-F的16进制数字　本版专家分:185　MARK　本版专家分:20　如果想提高代码的效率,直接网上搜索。比较一小就行了。按键程序已经很稳定了　本版专家分:108　不错,基本上都是这样写啦　匿名用户不能发表回复!