|
这个是用定时器实现动态数码管显示,如果有按键按下,数码管数字加一。现在我在readkey()函数多加了一个if语句,如果另一个按键按下会数字减一。但是,放进去后,只能加一次1,或者减一次1了。
下面是整个程序,请大家指点!感激不尽!
- #include <reg51.h>
- #include <intrins.h>
- sbit key = P3^2; //P3为按键接口
- sbit key1 = P3^3; //P3为按键接口
- int display_case=0;
- unsigned char n=0,n1=0;
- float digital=12.26; //定义数字为12.26
- int a,b,c,d,e,f,g;
- unsigned char table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7F};//共阳数码管显示
- unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯0-7
-
- void readkey(void) //按键按下判断函数
- {
- void Delay100ms(int t);
-
- if(key==1)
- {
- Delay100ms(2); //消抖0.2秒
- if(key==1)
- while(key); //等待按键释放
- digital--; //数字+1
- }
- if(key1==1)
- {
- Delay100ms(2); //消抖0.2秒
- if(key1==1)
- while(key1); //等待按键释放
- digital++; //数字-1
- }
- }
- void yima() //获得数字各个位数
- {
- a=digital*100;
- b=a/1000; //千位
- c=a-b*1000; //获得,百、十、个位
- d=c/100; //取出百位
- e=c-d*100; //获得,十、个位
- f=e/10; //取出十位
- g=e-f*10; //取出个位
- }
- void display() //数码管显示函数
- {
- yima(); //获得数字各个位数
-
-
- display_case++; //轮流显示四位数字
- if(display_case>4)
- display_case=0;
- switch (display_case)//轮流显示四位数字
- {
- case (0):
- P2=0xfe; //显示千位
- P0=table[b];
- break;
- case(1):
- P2=0xfd; //显示百位
- P0=table[d];
- break;
-
- case(2):
- P2=0xfd; //显示小数点
- P0=table[10];
- break;
-
- case(3):
- P2=0xfb; //显示十位
- P0=table[f];
- break;
-
- case(4):
- P2=0xf7; //显示个位
- P0=table[g];
- break;
- }
- }
- void timer_init()
- {
- TMOD |= 0x01; //定时器工作方式1,启用T0定时器, GATE位为0,用TCON的TR0控制T0定时器的启动
- //设置定时器的初始计数值
- //计算方法
- //假设定时器为1ms,一个机器周期为 1/单片机的晶振频率 即: 1/12M = 1us
- //而1个机器周期 = 12个时钟周期 所以: n x 机器周期 = 1ms ===> n x 1us = 1ms
- //所以n = 1000,也就是经过1000个机器周期,定时器要溢出(从0开始计数)
- //所以定时器的初始值为65535 - 1000 + 1 = 64536 ===> 0xFC18
- TH0 = 0xFC;
- TL0 = 0x18;
- EA = 1; //总中断开关
- ET0 = 1; //T0中断
- TR0 = 1;//启动T0定时器
- }
- void trigger_timer0() interrupt 1
- {
- TH0 = 0xFC;
- TL0 = 0x18;
- //if(ii>10)
- //{ ii=0;
- display(); //动态显示数字
- }
- //}
- void main (void)
- {
- timer_init();// 定时器初始化
- while(1)
- {
- readkey(); //按键按下判断函数
-
- }
- }
复制代码
|
|