单片机键盘去抖动c语言程序!!!

单片机键盘去抖动c语言程序!!!,第1张

使用这个到板子里面:

#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--)

}

是AVRmega128控制步进机的程序

//***********************************************************************

// 包含文件

//***********************************************************************

#include <string.h>

#include <stdio.h>

#define F_CPU 7372800 // 单片机主频为7.3728MHz,用于延时子程序

#include <util/delay.h>

#include <avr/io.h>

#include <avr/iom128.h>

//***********************************************************************

// 定义变量区

//***********************************************************************

#define Data_IO PORTA//液晶数据口

#define Data_DDRDDRA //数据口方向寄存器

#define D_LE0 PORTD &= ~(1 <<PD4) //数码管段控制位为0,锁存端口数据

#define D_LE1 PORTD |= (1 <<PD4) //数码管段控制位为1,锁存器输出与端口一致

#define W_LE0 PORTD &= ~(1 <<PD5) //数码管位控制位为0

#define W_LE1 PORTD |= (1 <<PD5) //数码管位控制位为1

#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)

#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)

#define uchar unsigned char

#define uintunsigned int

uchar F_Rotation[8]={0xE2,0xE6,0xE4,0xEC,0xE8,0xF8,0xF0,0xF2 }//正转表格, 0111,0011 1011,1001 1101,1100 ,1110,0110

uchar B_Rotation[8]={0xF2,0xF0,0xF8,0xE8,0xEC,0xE4,0xE6,0xE2}//反转表格

//***********************************************************************

// 主程序

//***********************************************************************

int main(void)

{

uint i,j

DDRB=0xFF

PORTD=0xFF

DDRD=0xFF

D_LE1//关掉数码管,以免显示乱码

W_LE1

Data_IO=0xFF //关数码管

W_LE0

while(1)

{

for(j=0j<32*8j++) //步距角5.625/64 减速比1/64,8拍,这个循环为反转一圈

{

for(i=0i<8i++)

{

PORTB=B_Rotation[i]

delay_ms(10)

}

}

for(j=0j<64*8j++) //步距角5.625/64 减速比1/64,8拍,这个循环为正转一圈

{

for(i=0i<8i++)

{

PORTB=F_Rotation[i]

delay_ms(10)

}

}

}

}

请给邮箱~

求一个C程序,当P1.0按键按下时,P1.6和P1.7两个管脚所接的LED灯轮流发光,要求延时10秒,再按下按键全灭

------》此程序流程

---->首先判断按键是否按下,即主函数循环while(1)判断是否按键按下

------>按下,则进入防抖动判断,如符合,则开始进入轮流切换状态

---->状态,初始,其中一个亮另一个灯灭。10秒过后再切换状态,其中,加入一个指令

既,判断按键是否再次按下,若按下则给两个灯低电平,退出本次轮流切换状态

------》退出后,再次进入主函数,,即主函数循环while(1)判断是否按键按下

#include<reg51.h>

unsigned char counter

sbit control_s=P1^0

sbit Led1=P1^6

sbit Led1=P1^7

//**** ********* *****

//**** 中断服务 ******

//**** ********* *****

void set_state()

{

TMOD=0x01//选择工作方式1

TH0=0x3c

TL0=0xb0

ET0=1 //打开定时器0

TR0=1 //定时器0中断模式

EA=1 //中断总控制

}

void switch_led()//换灯函数声明

//**** ********* *****

//**** 主函数 ******

//**** ********* *****

void main()

{

void set_state()//打开中断服务

while(1) //开始循环1,等待按键

{

if(control_s== 0) //当按键按下,防抖动

{

delay_time(10)//延迟

if( control_s==0) switch_led() //再次判断,符合则进入轮流发光

}

}

}

//**** ********* *****

//**** 定时器0中断服务 ******

//**** ********* *****

void timer0() interrupt 1

{

TH0=0x3c

TL0=0xb0

counter++

if(counter>19) {counter= 0s++}

}

//**** ********* *****

//**** 轮流发光函数 ******

//**** 切换间隔10s *****

void switch_led()

{

Led1=0 //让Led1暗

Led2=1 //让Led2亮

while(1) //开始循环

if(s>9) //s从0-9,10次,一次1s

{

s= 0

Led1=~Led1 //取反状态,当Led1=1时,则~Led1=0

Led2=~Led2 //同上

if( control_s==0){Led1= 0Led2= 0break} //按键再次按下,灯熄灭,退出此函数回到主函数循环1。

}

}

因为没有说明问题的过程,可以简单些,用楼上的,只不过,楼上的估计和我一样吧,弄不清这延时10秒在哪体现,干脆省了这10秒,嘿。

化雨眠 | 三级

#include<reg51.h>

#define uint unsigned int

#define uchar unsigned char

sbit a=P1^0

void delay(uint x)

{

uint i , j

for(i=xi>0i--)

for(j=110j>0j--)

}

void main()

{

while(1)

{

if(a==0)

{

delay(10)

if(a==0)

{

P1^6=0

delay(50)

P1^6=1

delay(50)

P1^7=0

delay(50)

P1^7=1

delay(50)

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8000723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存