按键控制7段LED数码显示,仿真显示乱序
#include
#define SEG P0 //将P0口连接7段数码管
char TAB[10] = {0xc0, 0f9, 0a4, 0b0, 099, 092, 083, 0f8, 080, 098};
//定义共阳极数组 0 1 2 3 4 5 6 7 8 9
void debouncer(void); //防抖动函数
sbit PB1 = P2^0; //FB1连P2.0
sbit PB2 = P2^1; //FB2脸P2.1
main()
{
unsigned char i = 0;
PB1 = PB2 = 1; //设置输入口为1
while(1)
{
SEG = TAB[i]; //输出数字到7段LED数码管
if(PB1 == 0) //判断PB1是否按下
{
debouncer(); //调用防抖动函数
i = (i<9)?i+1:0; //若i<9则i=i+1,若i>=9清除为0
}
if(PB2 == 0) //判断PB1是否按下
{
debouncer();
i = (i>0)?i-1:9; //若i>0则i=i-1,若i<=则从9开始显示
}
}
}
void debouncer(void)
{
int i;
for(i=0; i<2400; i++); //单片机晶振12MHz,计数2400,延时20ms
}
char TAB[10] = {0xc0, 0f9, 0a4, 0b0, 099, 092, 083, 0f8, 080, 098}; 这样写没报错?
另外,你那个所谓的消抖函数其实只是个延时函数,如果真的只有20毫秒,那是绝对有问题的,1秒能触发50次,按一下就会变化很多次了。代码里应该要检测一下按键弹起,再次按下才生效,或者加个长按检测,20毫秒对于长按检测是不够的。
char TAB[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x83, 0xf8, 0x80, 0x98};
不允许x多次输入,这是正确代码