51单片机1按键切换3种不同状态的c程序??

51单片机1按键切换3种不同状态的c程序??,第1张

主程序大致是这样的

flag=0;//记录按键次数

While(1)

{

if(key==0){delayms(20);if(key==0)flag++;}//按键检测

if(flag==3)flag=0

if(flag==0){正向流水}

else if(flag==1){反向流水}

else {间隔流水}

}存在问题,由于流水灯执行时间较长,因此对按键响应缓慢,可以在流水灯之间加入按键检测语句,当检测到按键按下时,用break语句退出当前循环

这个可以吗?肯定要改下

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

//实验六 数码管电子钟

//by 阿朱 893437703@qq.com 转载请注明来源

//通电后,数码管电子钟一直处于秒表状态,蜂鸣5秒响一次,要求使用T0,T1中断

//与一般的应用不同,本实验在数码管前面未使用译码器

//思路:定时器中断的使用:

//1、初始化

//注意:P0口的P0.4接蜂鸣

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

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

//数码管数据 p2口,高电平有效

//数码管控制p0.0~P0.3,低电平有效

//P0.4输出,接蜂鸣器

//P1输入,接矩阵键盘 矩阵键盘定义: P1.0-P1.3为列线,P1.4-P1.7为行线

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

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

//本节知识要点:

//中断

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

#include <AT89X52.H>

//宏定义

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long int

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

* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256*

* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *

* 间为1ms*65536=65.536ms *

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

#define V_TMOD 0x01 //工作方式1

#define V_TH0 0x3C //50ms延时常数 C=50000 //0XDC

#define V_TL0 0xB0 //50ms延时常数 C=50000 /0X58

//#define V_TH1 0xFF //5ms延时常数 C=5000 //0XDC

//#define V_TL1 0xFB //5ms延时常数 C=5000 /0X58

#define V_TH1 0xDC //1ms延时常数 C=1000 //0XDC

#define V_TL1 0x58 //1ms延时常数 C=1000 /0X58

#define MAXFUN 6 //功能切换,表示最多的功能状态,

sbit k10=P1^0

//sbit BEEP = P3^7//蜂鸣器驱动线----------------请修改为sbit BEEP = P0^4

uchar bee//蜂鸣器01开关

uchar key//键顺序吗

uchar fun=10//功能状态, <= MAXFUN

uchar it0=0,it1 //Timer0中断计数

uchar text=0 //数字

//uchar text_ctrl[4]={0xFE,0xFD,0xFB,0xF7}//位选通值, 11111110, 11111101, 11111011, 11110111

uchar text_ctrl[4]={0xE,0xD,0xB,0x7}//位选通值, 00001110, 00001101, 00001011, 00000111

//uchar text_code[11]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff}//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效

//uchar text_code[17]= {0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1}//数码管代码

uchar text_code[11]={ 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6,0xff}//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效

uchar text_index=0//当前显示第几个

uchar dis_buf[4] //显示缓存

uchar refresh=0 //刷新否 T1蜂鸣

uchar min=0 //minutes

uchar sec=0 //scconds

uchar hour=0 //scconds

uchar onsetup=0

uchar keydown0=0,keydown1=0

uchar data PWM=0xFf //PWM值增加,则占空比减小,LED 灯渐暗。

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

// 延时子程序

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

void delay0(uchar x)//x*0.14MS

{

uchar i

while(x--)

for (i = 0i<13i++) {}

}

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

//T1蜂鸣

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

void beepT1()

{

if(refresh >0 )

{

refresh++

bee=!bee

if(refresh>=30)

refresh = 0

}

}

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

//文字输出

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

void textout()

{

//P0 = 0xff // 先关闭所有数码管

P2 = dis_buf[text_index] //传入数字的码

bee = bee<<4

P0 = text_ctrl[text_index]|bee//选择位

//P0 = bee//选择位

text_index++ //下一位

if( text_index >=4 )

text_index = 0

}

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

//键扫描子程序

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

void keyscan(void)

{

uchar temp

key = -1 //不按键

P1=0x0F//低四位输入

delay0(12)

temp=P1//读P1口

temp=temp&0x0F

temp=~(temp|0xF0)

if(temp==1)

key=0

else if(temp==2)

key=1

else if(temp==4)

key=2

else if(temp==8)

key=3

else

key=16

P1=0xF0 //高四位输入

delay0(12)

temp=P1 //读P1口

temp=temp&0xF0

temp=~((temp>>4)|0xF0)

if(temp==1)

key=key+0

else if(temp==2)

key=key+4

else if(temp==4)

key=key+8

else if(temp==8)

key=key+12

else

key=16

if( key!= -1)

fun = key

//key =0

//dis_buf=text_code[key]//查表得键值

}

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

//判断键是否按下

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

int keydown(void)

{

P1=0xF0

if(P1!=0xF0)

{

keyscan()

//delay0(250)

return 1

//

//beep()

// while(P1!=0xF0) //等待键释放

}

return 0

}

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

//设置显示缓存

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

void settext(uchar text0,uchar text1,uchar text2,uchar text3)

{

dis_buf[0]=text_code[text0]

dis_buf[1]=text_code[text1]

dis_buf[2]=text_code[text2]

dis_buf[3]=text_code[text3]

}

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

//fun10

//秒表 mm:ss

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

void fun10()

{

it0++

if( it0==20 ) //1s

{

it0=0

sec++

if(sec==60)

{

sec = 0

min++

if(min==60)

{

min =0

}

}

refresh = 1

dis_buf[1] = text_code[min%10]

dis_buf[0] = text_code[min/10]

dis_buf[3] = text_code[sec%10]

dis_buf[2] = text_code[sec/10]

}

}

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

//fun11

//时钟 hh:mm

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

void fun11()

{

it0++

if( it0==20 ) //1s

{

it0=0

sec++

if(sec==60)

{

sec = 0

min++

if(min==60)

{

min =0

hour++

if(hour==12)

{

hour =0

}

//dis_buf[1] = text_code[hour%10]

//dis_buf[0] = text_code[hour/10]

}

refresh = 1

}dis_buf[1] = text_code[hour%10]

dis_buf[0] = text_code[hour/10]

dis_buf[3] = text_code[min%10]

dis_buf[2] = text_code[min/10]

}

}

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

//fun12

//倒计时

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

void fun12()

{

it0++

if( it0==20 ) //0.1s

{

it0=0

sec--//sec must >=1

if(sec==0)

{

sec = 60

min--

//dis_buf[1] = text_code[min%10]

//dis_buf[0] = text_code[min/10]

if(min==0)

{

min =60

}

}

refresh = 1

dis_buf[1] = text_code[min%10]

dis_buf[0] = text_code[min/10]

dis_buf[3] = text_code[sec%10]

dis_buf[2] = text_code[sec/10]

}

}

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

//fun13

//设置时间:hh:mm

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

void fun13()

{

onsetup =1

sec=0

min=0

hour=0

dis_buf[1] = text_code[min%10]

dis_buf[0] = text_code[min/10]

dis_buf[3] = text_code[sec%10]

dis_buf[2] = text_code[sec/10]

}

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

//fun3

//设置时间:hh:mm

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

void fun130()

{

if( keydown1!= keydown0)

{

keydown0 = keydown1

if(keydown1==0 ) return//按键d起

if(onsetup==1)

hour = key*10

else if(onsetup==2)

hour += key

else if(onsetup==3)

min = key*10

else if(onsetup==4)

min += key

onsetup++

dis_buf[1] = text_code[hour%10]

dis_buf[0] = text_code[hour/10]

dis_buf[3] = text_code[min%10]

dis_buf[2] = text_code[min/10]

}

}

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

//fun14

//设置

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

void fun14()

{

sec=0

min=0

hour=0

}

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

// 定时器0中断服务程序, 用于数码管的动态扫描

//T0定时器,50ms激发一次,间隔1秒执行一次输出(需要20次)

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

void timer0() interrupt 1

{

//TR1=0

TH0=V_TH0//1ms延时常数

TL0=V_TL0 //频率调节

//TH1=PWM

//TR1=1

keydown1 = keydown()

//if( keydown1!= keydown0)

{

if( fun <=9 )

fun130()

else

switch(fun)

{

case 10:fun10()break

case 11:fun11()break

case 12:fun12()break

case 13:fun13()break

case 14:fun14()break

default:break

}

}

}

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

// 定时器1中断服务程序, 用于数码管的动态扫描

//T1定时器,5ms激发一次,间隔5ms执行一次输出

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

void timer1() interrupt 3

{

//TR1=0

//TH1=PWM

//处理一行

TH1 = V_TH1

TL1 = V_TL1

it1++

//if( it1==200 )

{

it1=0

beepT1()

textout()

}

}

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

//系统初始化

// 函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/

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

void init(void)

{

//变量初始化

bee=1

P0 = 0xFF

P2 = 0xFF

text_index = 0

dis_buf[0]=text_code[0]

dis_buf[1]=text_code[0]

dis_buf[2]=text_code[0]

dis_buf[3]=text_code[0]

//定时器初始化/

TMOD=V_TMOD

TH0=V_TH0 //延时常数

TL0=V_TL0//延时常数

TH1=PWM //脉宽调节

TL1=0

IE = 0x82

ET0=1 //定时/计数器T0中断允许

ET1=1 //定时/计数器T1中断允许

TR0=1//T0启动

TR1=1//T1启动*/

}

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

//主程序

//处理按键时加上了按键消抖

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

void main(void)

{

init()//系统初始化

while(1)

//连run()都没了

}

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

//蜂鸣

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

void beep()

{

uchar i,j

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

{

for(j=20j>7j--)

{

delay0(j)

BEEP=!BEEP //BEEP取反

}

}

BEEP=1 //关闭蜂鸣器

}

*/


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存