新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于stc89c52rc单片机的数字钟设计(数码管显示)

基于stc89c52rc单片机的数字钟设计(数码管显示)

作者:时间:2012-08-15来源:网络收藏

事情总是看着简单,做起来没那么容易。
这个程序我开始时是根据教程编的,有些地方不理解就匆匆略过……事实证明这是不可取的……
写了百十来行以后编译,报错!就不会解决了。
这时才体会到基础是多么重要!!!
学习方法要科学,要知其然,更要知其所以然。
就像罗哥说的,从原理入手……
感谢 刘鹏 百忙之中抽出时间指导,真是我的良师和益友。。。。。。。
*****************************************************
把程序贴出来。大家学习学习。千万不要ctrl c,ctrl v。
全部代码下载地址:http://www.51hei.com/f/ssz.rar
********************************************

我已经加了部分注释……

*************************************************************
P1口接4*4矩阵键盘
P2口作为数码管的片选控制端
P0口送给数码管数据
1:实现时分秒的显示
2:通过S1调节秒,S2调节分钟,S3调节小时,S4退出调节模式。
3:按键松手有效

*************************************************************
矩阵键盘的扫描
定时器的应用
*****************************************
c语言函数调用
形参
实参
******************************************************************

#includereg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};//共阴数码管字模uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
//P2口位选8个数码管uchar key_code[] ={0xb7,0xbb,0xbd,0xbe};uchar key;uchar hour,min,sec;uchar k;void delay(uchar z)  //延时函数{uchar x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}void display() //显示函数{if(k==20)//定时器定时50ms,20次就是1秒{k=0;sec++;}if(sec>59){sec=0;min++;}if(min>59){min=0;hour++;}if(hour>23){hour=0;}P2=table2[5];  //片选P0=table1[hour/10];//送数据,十位delay(10);P2=table2[4];  //片选P0=table1[hour%10];//个位delay(10);P2=table2[3]; P0=table1[min/10];delay(10);P2=table2[2]; P0=table1[min%10];delay(10);P2=table2[1]; P0=table1[sec/10];delay(10);P2=table2[0]; P0=table1[sec%10];delay(10);}unsigned char keyscan()//键盘扫描程序{unsigned char scan1, scan2, keycode, j;P1 = 0xf0;scan1 = P1;if (scan1 != 0xf0)//判键是否按下{delay(10); //延时10msscan1 = P1;if (scan1 != 0xf0)//二次判键是否按下{TR0=0;P1 = 0x0f;scan2 = P1;keycode = scan1 | scan2; //组合成键扫描编码for (j = 0; j  4; j++){if (keycode == key_code[j])//查表得键值{key = j;while(P1!= 0x0f)display();return (key); //返回有效键值   }}}}elseP1 = 0xff;return (key = 4); //返回无效码}void system_Ini() //定时器初始化{TMOD= 0x01;TH0=(65535-50000)/256; TL0=(65535-50000)%256; ET0 = 1; TR0  = 1;EA=1;}void timer0 () interrupt 1 //中断程序{TH0=(65535-50000)/256; TL0=(65535-50000)%256;k++;}void contral(uchar key) //调整时间{if(key==0||key==1||key==2){if(key==0){sec++;if(sec>59){sec=0;}}else if(key==1){min++;if(min>59){min=0;}}else if(key==2){hour++;if(hour>23){hour=0;}}}else if(key==3){TR0=1;}}void main(){uchar a;system_Ini();//函数调用,初始化while(1){a=keyscan();contral(a);display();}}


评论


相关推荐

技术专区

关闭