此程序为本人以前刚学时候编写的,还存在许多未经优化的地方,也没有多少注释,请多担待。
功能如下:
1、按下k1,流水灯闪烁。
2、按下k2,开始从20开始计时。
3、按下k3,停止计时,开始累加。
以下为部分程序:
代码:
- #include "reg52.h"
- #include "intrins.h"
- #define led P1 //定义LED
- sbit k1=P0^0;
- sbit k2=P0^1;
- sbit k3=P0^2 ; //定义按键
- char code smguan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字定义
- #define num1 P2
- #define num2 P3//定义数码管管脚
- int a=0,b=2;
- int c=0;d=2;
- void delay(int i)
- {
- while(i--);
- }
- void delay800ms() //误差 0us
- {
- unsigned char a,b,c;
- for(c=95;c>0;c--)
- for(b=138;b>0;b--)
- for(a=29;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- _nop_(); //if Keil,require use intrins.h
- }
- void twinkle()
- {
-
- if(k1==1) //检测按键K1是否按下
- {
- delay(1000); //消除抖动 一般大约10ms
- if(k1==1) //再次判断按键是否按下
- {
- while(1)
- {led=0xaa;
- delay(50000);
- led=~led; //led状态取反
- delay(50000);
- if((k2==1)||(k3==1))break;
- }
- }
- }
- }
- void Timer1Init()
- {
- TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
- TH1=0XFC; //给定时器赋初值,定时1ms
- TL1=0X18;
- ET1=1;//打开定时器1中断允许
- EA=1;//打开总中断
- TR1=1;//打开定时器
- }
- void time()
- {
- if(k2==1) //检测按键K2是否按下
- {
- delay(1000); //消除抖动 一般大约10ms
- if(k2==1) //再次判断按键是否按下
- {
- Timer1Init(); //定时器1初始化
-
- }
- }
- }
- void Timer1() interrupt 3
- {
- static int i;
- TH1=0XFC; //给定时器赋初值,定时1ms
- TL1=0X18;
- i++;
- if(i==1000)
- {
- i=0;
- num2=smguan[a++];
- num1=smguan[b];
- if(a==10)
- {
- a=0;
- if(b==5)
- {
- b=2;
- }
- else b++;
- }
- }
- if((k1==1)||(k3==1))TR1=0;
- }
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- }
- void leijia()
- {
- while(1){
- if(k3==1) //检测按键K1是否按下
- {
- delay(80); //消除抖动 一般大约10ms
- if(k3==1) //再次判断按键是否按下
- { num2=smguan[c];
- num1=smguan[d];
- c=c+1;
- if(c==10)
- {
- c=0;
- if(d==5)
- {
- d=2;
- }
- else d=d+1;
- }
- }
- }delay(20000);
- if((k1==1)||(k2==1)){c=0;d=2;break;}
- }
- }
- void main()
- {
- while(1)
- {
- twinkle();
- time();
- leijia();
- }
- }