按键处理程序分析与设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键处理程序分析与设计

参考程序:

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

时钟显示程序

设计:黄有全

2011年10月26日

关键词:动态显示程序设计

显示连接:P3→J_WM,接数码管的位控制,P1→J_DM,接共阳极数码管段码,动态显示。

按键连接:按键KEY→P2。k1→P2.0,k2→P2.1,k3→P2.2,k4→P2.3。按键作用说明:k1、k2小时加减,k3、k4分钟加减

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

#include

unsigned char duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x8 3,0xc6,0xa1,0x86,0x8e,0x89,0xc7,0x8c,0xbf,0xff};

//数组,定义共阳极数码管显示段码:0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,H,L,P,-,熄灭。

#define uchar unsigned char

uchar ms=0,sec=0,min=30,hour=10;

uchar keyv;

/**************延时2.5ms函数***************/

void delay() //延时函数,带参数i。

{ //在调用函数时通过设置参数,改变延时时间。int j=0,k=0;

// for(j=0;j

for(k=0;k<350;k++);

}

/**************延时250ms函数***************/

void delay_250() //延时函数,带参数i。

{ //在调用函数时通过设置参数,改变延时时间。int j=0,k=0;

for(j=0;j<100;j++)

for(k=0;k<350;k++);

}

/**************时间显示函数***************/

void display()

{

P1=duanma[sec%10]; //送秒的个位的段码,显示;P3=0xfe; //送第一位的位码,点亮第1位数码管。delay(); //延时2.5ms

P1=duanma[sec/10]; //送秒的十位的段码,显示;

P3=0xfd; //送第二位的位码,点亮第2位数码管。delay(); //延时2.5ms

P1=duanma[19]; //送-的段码,显示-;

P3=0xfb; //送第三位的位码,点亮第3位数码管。delay(); //延时2.5ms

P1=duanma[min%10]; //送分的个位的段码,显示;

P3=0xf7; //送第4位的位码,点亮第4位数码管。delay(); //延时2.5ms

P1=duanma[min/10]; //送秒的十位的段码,显示;

P3=0xef; //送第5位的位码,点亮第5位数码管。delay(); //延时2.5ms

P1=duanma[19]; //送-的段码,显示-;

P3=0xdf; //送第6位的位码,点亮第7位数码管。delay(); //延时2.5ms

P1=duanma[hour%10]; //送小时的个位的段码,显示;P3=0xbf; //送第7位的位码,点亮第7位数码管。

delay(); //延时2.5ms

P1=duanma[hour/10]; //送秒的十位的段码,显示;

P3=0x7f; //送第8位的位码,点亮第8位数码管。

delay(); //延时2.5ms

}

/**************按键处理函数**************/

void key()

{ uchar i;

keyv=P2;

keyv=~keyv&0x1f; //取反,去掉高三位(只要5个按键)

if(keyv==1) //K1按键按下,小时单元在0-23之间循环加1

{if(hour<23)hour++;else hour=0; }

if(keyv==2) //K2按键按下,小时单元在0-23之间循环减1

{if(hour>0)hour--;else hour=23; }

if(keyv==4) //K3按键按下,分钟单元在0-59之间循环加1

{if(min<59)min++;else min=0; }

if(keyv==8) //K4按键按下,分钟单元在0-59之间循环减1

{if(min>0)min--;else min=59; }

if(keyv!=0){for(i=0;i<10;i++)display();}//延时0.2秒,用显示程序代替延时,等待按键松开

}

/**************时间数据产生函数************** */

void time()

{

ms++; //ms单元增加1

if(ms>=50) //ms单元>50(是否到1秒)

{

sec++;ms=0; //到1秒,则sec增加1,且ms清0.

if(sec>59) //sec单元>59(是否到1分)

{

min++;sec=0; //秒进位到分钟,即分钟加1.且sec清0. if(min>59)

{

hour++;min=0;

if(hour>23)

{

hour=0;

}

}

}

}

}

相关文档
最新文档