默认分类 2011-01-09 13:29:28 阅读60 评论2 字号:大中小 订阅
//矩阵键盘扫描和可调的电子时钟
//采用翻转识别法(相对代码少一些)处理矩阵键盘, //在按下15号键的时候处理电子时钟,然后可以启动12号键
//用来调节时间
#include #define uchar unsigned char //类型重定义 #define uint unsigned int uchar key=0; uchar count=0; int second=40,minute=59,hour=23; int second_shi=0,second_ge=0,minute_shi=0,minute_ge=0,hour_shi=0,hour_ge=0; uchar flag=0; //定义标志位(判断15号键是不是按下) uchar movePlace; //调节时钟时的定位位置计数 //以下是定义6个数码管是否加上小数点 uchar point0=0; uchar point1=0; uchar point2=0x80; uchar point3=0; uchar point4=0x80; uchar point5=0; //共阴数码管编码如下(0-15) uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //位选编码(选中第0-7位数码管) uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //函数声明 void display(uchar Duan_value); //显示按键值函数 void delay(uchar t); //延时1ms函数 void key_scan(); //按键扫描函数 void display_time(); //显示电子时钟函数 void init(); //寄存器初始化函数 { init(); //寄存器初始化 { while(1) { { key_scan();//按键扫描 void main() if(flag==1) //15号键按下,处理电子时钟 if(movePlace==1) point0=0x80; point1=0x80; point2=0; point3=0; //按键定位到秒值位置,对应的秒值小数点亮 { { { point4=0; point5=0; } else if(movePlace==2) point0=0; point1=0; point2=0x80; point3=0x80; point4=0; point5=0; } //按键定位到秒值位置,对应的分值小数点亮 else if(movePlace==3) point0=0; point1=0; point2=0; point3=0; point4=0x80; point5=0x80; } //按键定位到秒值位置,对应的小时小数点亮 else if(movePlace==0) //按键定位归零,关闭时钟显示,回复默认值 } //定时器初始化函数 void init() } } { } point1=0; point3=0; point4=0x80; point5=0; } point2=0x80; point0=0; //小时与分中间加小数点,分与秒之间加小数点 display_time(); //显示时钟值 else //15号键没有按下 display(key);//最后一位显示按键值 { TMOD=0x01; //设定定时器0工作在方式1:16位定时器 TH0=(65536-50000)/256; //每50ms中断1次 TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; //开启总中断 //开启定时器中断 //开启定时器 } //延时1ms函数 void delay(uchar t) { uchar x,y; for(x=t;t>0;t--) for(y=111;y>0;y--); } //按键数码管显示函数 void display(uchar value) { P2=table[value]; delay(10); } //按键扫描函数 void key_scan() { uchar m0,m1; uchar temp; P1=0xf0;//这样设置是为了能使低四位将高四位拉低,释放时自动拉高高四位 temp=P1; if(temp!=0xf0) { P3=table1[5]; //只显示最后一位 delay(10); //延时,去除抖动 if(temp!=0xf0) { m0=temp; //获得按键的列号(对应的就是高4位) P1=0x0f; temp=P1; if(temp!=0x0f) { m1=temp; //获得按键的行号(对应的就是低4位) temp=m0|m1; flag=0; //组合成最终的按键好 } { //按键对应的码表 switch(temp) case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key=10;break; case 0x7b:key=11;break; case 0xe7:key=12; TR0=0; { //设置时,关闭定时器 if(flag==1) //15号键按下后,12号键按下,开始设置时钟 movePlace++; //对应的位置标量+1 if(movePlace==4)//如果按下了4下,表示取消 } break; { //重新开启定时器 movePlace=0; //关闭时钟显示,重新打开按键显示 } TR0=1; case 0xd7:key=13; { { second++; if(second==60) second=0; } { minute++; if(flag==1) //若开始设置时钟,13键表示向上+1按键 if(movePlace==1) //秒值设置 else if(movePlace==2) //分值设置 if(minute==60) minute=0; } { hour++; if(hour==24) } } break; hour=0; else if(movePlace==3) //小时设置 case 0xb7:key=14; do{ } break; { //秒值设置 { second--; if(second==-1) second=59; } { minute--; if(minute==-1) minute=59; } { hour--; if(hour==-1) hour=23; } if(flag==1) //若开始设置时钟,14键表示向上-1按键 if(movePlace==1) else if(movePlace==2) //分值设置 else if(movePlace==3) //小时设置 case 0x77:key=15; break; } flag=1;//当15号键按下去之后,把标志位置1,表示显示时钟 temp=P1; //消除按起抖动 temp&=0X0f; } }while(temp!=0x0f); } } //显示电子时钟函数 void display_time() { second_shi=second/10; //分别得到时,分,秒值的个位,十位 second_ge=second%10; minute_ge=minute%10; hour_shi=hour/10; hour_ge=hour%10; P3=0xff; //消影处理 P3=0xff; P3=0xff; P3=0xff; P3=0xff; P3=0xff; 显示秒值的个位 P2=table[second_ge]|point0; //是否显示小数点 P3=table1[5]; delay(3); //显示秒值的十位 P3=table1[4]; delay(3); //显示分值的个位 P3=table1[3]; delay(3); //显示分值的十位 P3=table1[2]; delay(3); //显示小时的个位 P3=table1[1]; delay(3); //显示小时的十位 P3=table1[0]; delay(3); P2=table[hour_shi]|point5; P2=table[hour_ge]|point4; P2=table[minute_shi]|point3; P2=table[minute_ge]|point2; P2=table[second_shi]|point1; minute_shi=minute/10; } //定时器0中断函数 void time0() interrupt 1 using 0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; } } } count++; if(count==20) { count=0; if(second==60) { second=0; if(minute==60) hour++; } { minute=0; //小时加1 { hour=0; } if(hour==24) second++; //定时1s钟,秒值加1 minute++; //分钟加1 因篇幅问题不能全部显示,请点此查看更多更全内容