64,649
社区成员
发帖
与我相关
我的任务
分享
#include "CONFIGURE.H"
#ifndef _CONFIGURE_H_
#define _CONFIGURE_H_
#define uint unsigned int
#define uchar unsigned char
extern uchar t;
extern uchar m;
extern uchar f;
extern uchar s;
extern uchar code table[];
extern uchar code tablewe[];
extern void delayms(uint z);
extern void display(uchar n, uchar c, uchar d);
extern void init(void);
extern void Key(int k);
extern unsigned int keyscan(void);
extern void T0_time(void);
#endif
/*这里建议你初始化 :写成 uchar t = 0;uchar m = 0;.......... */
uchar t, m, f, s;
uchar num;
uchar code table[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x7F };
uchar code tablewe[] = { 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe }; //控制位选void delayms(uint z) //延时z ms
{
uint x, y;
for (x = z; x > 0; x--) for (y = 110; y > 0; y--);
}
void display(uchar n, uchar c, uchar d) //分离变量
{
uchar a, b;
a = n / 10; //十位
b = n % 10; //个位
P0 = table[a]; P2 = tablewe[c]; delayms(2); //十位显示
P0 = table[b]; P2 = tablewe[d]; delayms(2); //个位显示
}
void init()
{
t = 0; m = 0; f = 0; s = 0;
TMOD = 0X01; //定时器T0工作于方式1
TH0 = (65536 - 50000) / 256; //晶振为12MHZ
TL0 = (65536 - 50000) % 256; //定时时间为50ms
EA = 1; //开中断
ET0 = 1; //开T0中断
TR0 = 1; //启动T0
}
void Key(int k) //按键扫描
{
if (k == 1) //功能键
{
num++; //功能键按下次数加1
if (num == 1)TR0 = 0; //关闭T0,进入调时模式
if (num == 4)
{
num = 0; TR0 = 1; //启动T0
}
}
if (k == 2) //加1键
{
if (num == 1){ m++; if (m == 60)m = 0; display(m, 6, 7); } //秒加1,显示秒
if (num == 2){ f++; if (f == 60)f = 0; display(f, 4, 5); } //分加1,显示分
if (num == 3){ s++; if (s == 24)s = 0; display(s, 2, 3); } //时加1,显示时
}
if (k == 3) //加1键
{
if (num == 1){ m--; if (m == -1)m = 59; display(m, 6, 7); } //秒减1,显示秒
if (num == 2){ f--; if (f == -1)f = 59; display(f, 4, 5); } //分减1,显示分
if (num == 3){ s--; if (s == -1)s = 23; display(s, 2, 3); } //时减1,显示时
}
}
unsigned int keyscan()
{//键盘特征编号法
unsigned int k;//用于接受最后返回结果
unsigned char temp;
unsigned char temp1 = 0;
M_Key = 0xf0;//先将P2高四位输入高电平,低四位输入低电平
temp = M_Key;//将按了按键后的结果用temp保留高四位
if (temp != 0xf0){//如果高四位不全为1有按键按下
delayms(100);//消去抖动
temp = M_Key;//再次接收保留高四位
if (temp != 0xf0){//再次判断是否有按键按下
M_Key = 0xf0;//重复操作
temp = M_Key;//重复操作(保留高四位)
M_Key = 0x0f;//再将P2高四位输入低电平,低四位输入高电平
temp1 = M_Key;//用templ来保留第四位
temp = temp | temp1;//将保留的用或运算可以的到特征的按键位置
switch (temp){//判断键盘的位置
case 0xee: k = 1; break;//若是键盘s1则让k=1表示按了一键
case 0xed: k = 2; break;//若是键盘s2则让k=2表示按了二键
case 0xeb: k = 3; break;//若是键盘s3则让k=3表示按了三键
}
M_Key = 0xf0;//初始化
temp = M_Key;//初始化
while (temp != 0xf0){ temp = M_Key; }//判断是否有按键按下
return k;//返回键盘相关的键号
}
}
}
void T0_time() interrupt 1
{
TH0 = (65536 - 50000) / 256; //重赋初值
TL0 = (65536 - 50000) % 256;
t++; //中断次数加1
if (t == 20) //到1秒
{
t = 0; //计数清0
m++; //秒加1
if (m == 60) //到1分
{
m = 0; //秒清0
f++; //分加1
if (f == 60) //到1小时
{
f = 0; //分清0
s++; //小时加1
if (s == 24)s = 0;//小时采用24小时制,进行显示
}
}
}
}
#include "CONFIGURE.H"
void main()
{
init();//初始化
while (1)
{
int key = keyscan(); //调键扫描
Key(key);
P0 = 0x40; //显示-
P2 = 0xdb;
delayms(2); //延时
display(s, 2, 3); //秒显示
display(f, 4, 5); //分显示
display(m, 6, 7); //时显示
}
}
extern uchar t;
extern uchar m;
extern uchar f;
extern uchar s;
extern uchar code table[];
extern uchar code tablewe[];
extern void delayms(uint z);
extern void display(uchar n, uchar c, uchar d);
extern void init(void);
extern void Key(int k);
extern unsigned int keyscan(void);
extern void T0_time(void);