
使用这个到板子里面:
#include <reg52.h>
sbit ADDR0 = P1^0
sbit ADDR1 = P1^1
sbit ADDR2 = P1^2
sbit ADDR3 = P1^3
sbit ENLED = P1^4
sbit KEY1 = P2^4
sbit KEY2 = P2^5
sbit KEY3 = P2^6
sbit KEY4 = P2^7
unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}
void delay()
void main(){
bit keybuf = 1//按键值暂存,临时保存按键的扫描值
bit backup = 1//按键值备份,保存前一次的扫描值
unsigned char cnt = 0//按键计数,记录按键按下的次数
ENLED = 0 //选择数码管 DS1 进行显示
ADDR3 = 1
ADDR2 = 0
ADDR1 = 0
ADDR0 = 0
P2 = 0xF7 //P2.3 置 0,即 KeyOut1 输出低电平
P0 = LedChar[cnt] //显示按键次数初值
while (1){
keybuf = KEY4 //把当前扫描值暂存
if (keybuf != backup){ //当前值与前次值不相等说明此时按键有动作
delay() //延时大约 10ms
if (keybuf == KEY4){ //判断扫描值有没有发生改变,即按键抖动
if (backup == 0){ //如果前次值为 0,则说明当前是d起动作
cnt++ //按键次数+1
//只用 1 个数码管显示,所以加到 10 就清零重新开始
if (cnt >= 10){
cnt = 0
}
P0 = LedChar[cnt]//计数值显示到数码管上
}
backup = keybuf//更新备份为当前值,以备进行下次比较
}
}
}
}
/* 软件延时函数,延时约 10ms */
void delay(){
unsigned int i = 1000
while (i--)
}
第一,中断函数里面不能喂狗,本来看门狗也是一个高级别的中断,比定时器的优先级高,自然你的中断时间就不对了。第二,你的是飞思卡尔的单片机吧,貌似单片机的IO口有数据方向寄存器,先要把按键的端口设置为输入,如果没有的话,默认引脚都会是高电平,所以你说检测松开能检测到,其实是端口一直是高电平。
只能帮你这么多,我没用过你这款单片机,猜一下是128不?另外按键去抖动用普通的delay函数就可以,何必搞中断,中断本来就是件麻烦事,对程序运行效果影响很大。
C语言编写的程序运行时闪一下就没了是设置错误造成的,解决方法为:
1、我们以最经典的HELLO WORLD程序为例。
2、当我们写完这个程序 编译完成后单击左上角的叹号运行 可以看到一切正常 按下任意按键后窗口才会消失。
3、但是我们去生成的目录下面找到这个EXE文件。
4、双击运行却发现有个窗口一闪而过。。然后就什么也没有了 这时候我们有必要在程序中添加一些代码 防止程序被关闭先在程序开头包括windows.h这个头文件。
5、接着在主函数末尾的地方写一行system(“pause”)。
6、重新编译之后我们再次打开对应目录下的EXE文件,这次程序运行完之后没有直接关闭掉而是停留在这里了,闪退问题成功解决。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)