C语言防抖子函数 c语言按键防抖

求c51单片机电子钟程序(c语言)#include reg51.h
#define uchar unsigned char//定义unsigned int为uint
【C语言防抖子函数 c语言按键防抖】#define uint unsigned int//定义unsigned uchar为uchar
sbit LCD_RS = P2^0 ;
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
sbit D_SDA = P2^6;//定义74HC164数据线为P2.6端口
sbit D_SCL = P2^7;//定义74HC164数据线为P2.7端口
sbit CLK = P1^3;/*实时时钟时钟线引脚 */
sbit IO = P1^4;/*实时时钟数据线引脚 */
sbit RST = P1^5;/*实时时钟复位线引脚 */
sbitACC0 = ACC^0;
sbitACC7 = ACC^7;
uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};
//========= 延时函数 ============
//延时时间以1ms为单位
//s决定延时时间长短
void delay_ms(uint s)
{
uint x;
for(s;s0;s--)
{
x = 200;
while(x--);
}
}
//========= 送出一个字节给74HC164(实现串并转换) ==========
void send_out(unsigned char out)//传送一个字节8位
{
uchar i;
D_SCL = 0;
for (i=8;i=1;i--)
{
D_SDA = out0x80;//送数据到数据口
D_SCL = 1;//时钟线置1
D_SCL = 0;//送一时钟
out=1;//左移
}
}
//========= 写命令函数 ==========
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
send_out(cmd);
LCD_EN = 1;
LCD_EN = 0 ;
}
//========= 写数据函数 ==========
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
send_out(dat);
LCD_EN = 1;
LCD_EN = 0;
}
//========= LCD初始化函数 ==========
void lcd_init()
{
lcd_wcmd(0x38);
delay_ms(1);
lcd_wcmd(0x0c);//显示开,关光标
delay_ms(1);
lcd_wcmd(0x06);//向右移动光标
delay_ms(1);
lcd_wcmd(0x01);//清除LCD显示屏
delay_ms(1);
}
//========== 往DS1302写入1Byte数据 (内部函数) =============
void w_byte(uchar dat)
{
uchar i;
for(i=8; i0; i--)
{
IO = dat0x01;
CLK = 1;
CLK = 0;
dat = dat1;
}
}
//======== 从DS1302读取1Byte数据 (内部函数) ===================
uchar r_byte(void)
{
uchar i;
for(i=8; i0; i--)
{
ACC = ACC1;
ACC7 = IO;
CLK = 1;
CLK = 0;
}
return(ACC);
}
//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============
void write_byte(uchar addr, uchar dat)
{
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
w_byte(dat);
CLK = 1;
RST = 0;
}
//========== 指定地址往DS1302读1Byte数据 (内部函数) =============
uchar read_byte(uchar addr)
{
uchar ucData;
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
ucData = https://www.04ip.com/post/r_byte();
CLK = 1;
RST = 0;
return(ucData);
}
//============ 设置ds1302日期和时间 =============
void write_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x80;
write_byte(0x8e,0x00);// 控制命令,WP=0,写操作
for(i =7; i0; i--)
{
write_byte(addr,*p);// 秒 分 时 日 月 星期 年
p;
addr=2;
}
write_byte(0x8e,0x80);// 控制命令,WP=1,写保护
}
//============ 读ds1302当前日期和时间 =============
void read_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x81;
for (i=0; i7; i)
{
*p = read_byte(addr);//格式为: 秒 分 时 日 月 星期 年
addr= 2;
p;
}
}
//============ 显示函数 ===================
void lcd_disp()
{
uchar addr = 4;
lcd_wcmd(0x80addr);
lcd_wdat(((time[2]4)0x0f) 0x30); //显示小时
addr;
lcd_wcmd(0x80addr);
lcd_wdat((time[2]0x0f) 0x30);
addr;
lcd_wcmd(0x80addr);
lcd_wdat(':'); //显示":"
addr;
lcd_wcmd(0x80addr);
lcd_wdat(((time[1]4)0x0f) 0x30); //显示分
addr;
lcd_wcmd(0x80addr);
lcd_wdat((time[1]0x0f) 0x30);
addr;
lcd_wcmd(0x80addr);
lcd_wdat(':'); //显示":"
addr;
lcd_wcmd(0x80addr);
lcd_wdat(((time[0]4)0x0f) 0x30); //显示秒
addr;
lcd_wcmd(0x80addr);
lcd_wdat((time[0]0x0f) 0x30);
addr = 2;
lcd_wcmd(0xc0addr);//在第二行显示年月日和星期
lcd_wdat('2'); //显示2
addr;
lcd_wcmd(0xc0addr);
lcd_wdat('0'); //显示0
addr;
lcd_wdat(((time[6]4)0x0f) 0x30); //年
addr;
lcd_wcmd(0xc0addr);
lcd_wdat((time[6]0x0f) 0x30);
addr;
lcd_wcmd(0xc0addr);
lcd_wdat(' ');
addr;
lcd_wcmd(0xc0addr);
lcd_wdat(((time[4]4)0x0f) 0x30); //显示月
addr;
lcd_wcmd(0xc0addr);
lcd_wdat((time[4]0x0f) 0x30);
addr;
lcd_wcmd(0xc0addr);
lcd_wdat(' ');
addr;
lcd_wcmd(0xc0addr);
lcd_wdat(((time[3]4)0x0f) 0x30); //显示日
addr;
lcd_wcmd(0xc0addr);
lcd_wdat((time[3]0x0f) 0x30);
addr;
lcd_wcmd(0xc0addr);
lcd_wdat(' ');
addr;
lcd_wcmd(0xc0addr);
lcd_wdat((time[5]0x0f) 0x30); //显示星期
}
//=========== 主函数 ===============
void main()
{
lcd_init();// 初始化LCD
write_ds1302(time);
while(1)
{
read_ds1302(time);//读DS1302数据
lcd_disp(); //LCD显示
delay_ms(500);//延时0.5秒
}
}
这是一个电子时钟 , 在LCD1602上显示,时钟芯片是DS1302
当我用C语言写数码管时为什么我按键按下去它才亮不按它就不亮了键码扫描的地方存在两个问题:
1.如果消抖时 , 发现键盘抖动,函数没有指定返回值,这个不能预测 。
2.在扫描结束之后 , 没有对键盘弹起做判断,弹起时也需要消抖 。
还有一个疑问就是不知你的数码管是动态扫描的来中静态的
代码:void main()
{
unsigned char keytemp;//【定义一个新变量】
p27=0;
P0=s8[16];
while(1)
{
P1=0XF0;
if(P1!=0XF0)
{
//要做防抖,和弹起处理
keytemp=s8[keyscan()];}//【存放变量】
}
P0=keytemp;//【输出显示】
}
}
C语言的按键开关防抖程序~key为按键 , 规定按下为低电平
if(key==0)
{
delay(50); //延时50ms,消抖
if(key==0) //再判断是否按下
{
while(!key); 松手检测
··················································
该按键按下要实现的功能程序
··················································
}
}
我的习惯是这样写
如何用C语言实现按键功能?主要就是按键检测,防抖呗 。
首先给出检测按键代码:(我这个事4*4键盘 。具体你要根据实际情况编写)
uchar TestKey()
{
uchar cord_h,cord_l;
P6=0x0f;
cord_h=P60x0f;
if(cord_h!=0x0f)
{
Delay_Xms(1);
if(cord_h!=0x0f)
{
cord_h=P60x0f;
P6=cord_h|0xf0;
cord_l=P60xf0;
return(cord_h cord_l);
}
}return(0xff);
}
--------------------------------------
然后你在Main函数里编写循环,检测按键然后做你想做的事情 。。。
while(1)
{
key=TestKey();//调用键盘扫描 ,
switch(key)
{
case 0x7e:P4=0xa1;break;//0 按下相应的键显示相对应的码值
case 0x7d:Show1Menu();break;//1
case 0x7b:P4=0x83;break;//2
case 0x77:P4=0x88;break;//3
case 0xbe:P4=0x99;break;//4
case 0xbd:P4=0x90;break;//5
case 0xbb:P4=0x82;break;//6
case 0xb7:P4=0xb0;break;//7
case 0xde:P4=0xc0;break;//8
case 0xdd:P4=0x80;break;//9
case 0xdb:P4=0x92;break;//a
case 0xd7:P4=0xa4;break;//b
case 0xee:P4=0xc6;break;//c
case 0xed:P4=0xf8;break;//d
case 0xeb:P4=0x99;break;//e
case 0xe7:P4=0xf9;break;//f
}
}
问一个关于单片机按键延时防抖方面的问题 , 使用软件防抖(汇编、C语言均可)!D10mS:MOVR7,#50 ;延时的时间一般为 5-20mS
D1:MOVR6,#100;
D2:DJNZR6,D2;
DJNZR7,D1;
RET
D10mS就是一个延时程序,调用它后再进行判断电平判断,就避开了按键按下时的抖动.
单片机键盘去抖动c语言程序?。。?/h2>使用这个到板子里面:
#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,则说明当前是弹起动作
cnt;//按键次数 1
//只用 1 个数码管显示,所以加到 10 就清零重新开始
if (cnt = 10){
cnt = 0;
}
P0 = LedChar[cnt]; //计数值显示到数码管上
}
backup = keybuf; //更新备份为当前值,以备进行下次比较
}
}
}
}
/* 软件延时函数,延时约 10ms */
void delay(){
unsigned int i = 1000;
while (i--);
}
关于C语言防抖子函数和c语言按键防抖的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读