数码管显示时间,矩阵键盘设置时间(仿真加程序)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<REG51.H>
- #define LED P0//P0为数码管的段选
- #define WS P2//P2为数码管的位选
- char tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};//0~9最后 “—”号
- unsigned char sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;//定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
- unsigned char t;
- //---------------------------------------------------------------------
- //---------------------------------------------------------------------
- void initT0()
- {
- TMOD=0x01;//定义定时器0工作与方式1
- TH0=(65536-5000)/256;//定时器赋初值
- TL0=(65536-5000)%256; //50ms
- EA=1;//开总中断和T0中断
- ET0=1;
- }
- void TOint()interrupt 1
- {
- TH0=(65536-50000)/256;//定时器赋初值
- TL0=(65536-50000)%256;
- t++;
- }
- //--------------------------------延时子函数------------------------------------
- void Delay_ms(unsigned int x) //延时Xms
- {
- unsigned int i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- //-------------------------------显示子函数---------------------------------------
- void display()
- {
- // TR0=1;
- if(t==20)
- {
- t=0;
- sec++;//秒加1
- }
- if(sec==60)//如果秒为60,则清零,分加1
- {
- sec=0;
- min++;
- }
- if(min==60)//如果分为60,则清零,时加1
- {
- min=0;
- hour++;
- }
- if(hour==24)//如果时为24,则清零
- {
- hour=0;
- }
- sec_ge=sec%10;//秒的个位和十位
- sec_shi=sec/10;
- min_ge=min%10;//分的个位和十位
- min_shi=min/10;
- hour_ge=hour%10;//时的个位和十位
- hour_shi=hour/10;
- WS=0x80;//循环扫描
- LED=tab[sec_ge];
- Delay_ms(1);
- WS=0x40;
- LED=tab[sec_shi];
- Delay_ms(1);
- //-//0X20
- WS=0x20;
- LED=tab[10];
- Delay_ms(1);
- WS=0x10;
- LED=tab[min_ge];
- Delay_ms(1);
- WS=0x08;
- LED=tab[min_shi];
- Delay_ms(1);
- //-// 0X04
- WS=0x04;
- LED=tab[10];
- Delay_ms(1);
- WS=0x02;
- LED=tab[hour_ge];
- Delay_ms(1);
- WS=0x01;
- LED=tab[hour_shi];
- Delay_ms(1);
- }
- void keyscan()
- {
- unsigned char temp;
- P1=0xfe; //第一行置低
- temp=P1; //将P2口的值赋给temp
- temp=temp&0xf0; //将temp跟1111 0000 按位与
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:
- {
- sec++;
- if(sec==60)
- sec=0;
-
- break;
- }
- case 0xde:
- {
- min++;
- if(min==60)
- min=0;
-
- break;
- }
- case 0xbe:
- {
- hour++;
- if(hour==24)
- hour=0;
-
- break;
- }
- case 0x7e:
- break;
- }
- while(temp!=0xf0)
- { TR0=0;
- temp=P1;
- temp=temp&0xf0;
- }
- }
- TR0=1;
- }
- P1=0xfd; //第二行置低
- temp=P1; //将P2口的值赋给temp
- temp=temp&0xf0; //将temp跟1111 0000 按位与
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:
-
- break;
- case 0xdd:
-
- break;
- case 0xbd:
-
- break;
- case 0x7d:
-
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfb; //第二行置低
- temp=P1; //将P2口的值赋给temp
- temp=temp&0xf0; //将temp跟1111 0000 按位与
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:
- break;
- case 0xdb:
- break;
- case 0xbb:
-
- break;
- case 0x7b:
-
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xf7; //第二行置低
- temp=P1; //将P2口的值赋给temp
- temp=temp&0xf0; //将temp跟1111 0000 按位与
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:
-
- break;
- case 0xd7:
-
- break;
- case 0xb7:
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
数码管显示时间4×4键盘矩阵按键.rar
(49.83 KB, 下载次数: 148)
|