事情总是看着简单,做起来没那么容易。
这个程序我开始时是根据教程编的,有些地方不理解就匆匆略过……事实证明这是不可取的……
写了百十来行以后编译,报错!就不会解决了。
这时才体会到基础是多么重要!!!
学习方法要科学,要知其然,更要知其所以然。
就像罗哥说的,从原理入手……
感谢 刘鹏 百忙之中抽出时间指导,真是我的良师和益友。。。。。。。
*****************************************************
把程序贴出来。大家学习学习。千万不要ctrl c,ctrl v。
全部代码下载地址:http://www.51hei.com/f/ssz.rar
********************************************
我已经加了部分注释……
*************************************************************
P1口接4*4矩阵键盘
P2口作为数码管的片选控制端
P0口送给数码管数据
1:实现时分秒的显示
2:通过S1调节秒,S2调节分钟,S3调节小时,S4退出调节模式。
3:按键松手有效
*************************************************************
矩阵键盘的扫描
定时器的应用
*****************************************
c语言函数调用
形参
实参
******************************************************************
#include#define uchar unsigned char #define uint unsigned int uchar 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); //延时10ms scan1 = 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); //返回有效键值 } } } } else P1 = 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(); } }
上一篇:感觉比较好的矩阵键盘扫描程序
下一篇:一个简单的51单片机操作系统的实现
推荐阅读最新更新时间:2024-03-16 13:05
设计资源 培训 开发板 精华推荐
- 重磅跨界揭晓:realme GT Neo2推稳如泰山国潮联名礼盒
- 制造业因数码化程度不及,恐将影响AI布局
- 搭Android 12系统的三星Galaxy S10/Note 10现身Geekbench
- 京东X事业部:从无人仓储、无人配送到无人零售
- 全球首发18GB+1TB 中兴Axon 30 Ultra航天版细节图公布了
- HomePod mini或和iPhone 12同亮相 体积更小价格实惠
- 坚果手机新品发布会官宣 全新年度旗舰将于10月20日发布
- iPhone 13手机外观解密!正面的刘海设计与众不同
- realme真我Q2系列外观曝光!高端素皮工艺质感高级
- vivo IFEA分离式镜头设计获2020红点设计概念大奖