| 
 
| K1-K4 分组控制LED里面的一段代码 记按键检测的各类方式,这里看程序.我觉得很新意的想法.
 void main()
 {
 uchar k,t,Key_State;
 P0=0xff;
 P1=0xff;
 while(1)
 {
 t=P1;                //这一段是在循环判断是否有按键按下
 if(t!=0xff)
 {
 DelayMS(10);
 if(t!=P1)
 continue;             //为结束本次循环,break为跳出所有判断
 //取得 4 位按键值,由模式 XXXX1111(X 中有一位为 0,其他均为 1)
 //变为模式 0000XXXX(X 中有一位为 1,其他均为 0)
 Key_State=~t>>4;   //这一段,当有按键按下时,根据仿真图里的接法来看.为了以  k=0;              //累加移位方便,这里先将数据移位,同时将K清零.
 //检查 1 所在位置,累加获取按键号 k
 while(Key_State!=0)     //整个循环,计算出按键是第几个,对应switch执行对应的语法
 {
 k++;
 Key_State>>=1;
 }
 //根据按键号 k 进行 4 种处理
 switch(k)
 {
 case 1:    if(P0==0x00) P0=0xff; P0<<=1; DelayMS(200); //明白了,防止出现当8个灯全break;                                         //部亮了的时候,将其全部熄灭.
 case 2:    P0=0xf0;break;
 case 3:    P0=0x0f;break;
 case 4:    P0=0xff;
 }
 }
 }
 }
 
 
 这个是INT0中断计数程序里的一段代码
 if(DSY_Buffer[2]==0)           //高位为 0 时不显示
 {
 DSY_Buffer[2]=0x0a;
 if(DSY_Buffer[1]==0)      //高位为 0,若第二位为 0 同样不显示
 DSY_Buffer[1]=0x0a;
 }
 比较喜欢,这里没有忘记判断高位为零的情况.然后,要显示的数和数组里的数的地址正好对应,直接调用数组里面的16进制数就行.
 P0=DSY_CODE[DSY_Buffer[0]];
 P1=DSY_CODE[DSY_Buffer[1]];
 P2=DSY_CODE[DSY_Buffer[2]];
 
 
 TIMER0控制流水灯的完整程序
 #include<reg51.h>
 #include<intrins.h>
 #define uchar unsigned char
 #define uint unsigned int
 //主程序
 void main()
 {
 uchar T_Count=0;
 P0=0xfe;
 P2=0xfe;
 TMOD=0x01;                         //定时器 0 工作方式 1
 TH0=(65536-40000)/256;                //40ms 定时
 TL0=(65536-40000)%256;
 TR0=1;                              //启动定时器
 可以不用写EA=1;ET0=1;TR0=1; // EA总中断允许位,ET0定时器IE寄存器,TR0定时器运行而是直接判断TFR定时器0溢出标志位.  //  启停控制位:
 while(1)
 {
 if(TF0==1)       //直接对定时器0的溢出标志位进行扫描判断,
 {
 TF0=0;                    //先软件清零
 TH0=(65536-40000)/256;     //恢复初值
 TL0=(65536-40000)%256;
 奇葩在这里,这里没有用到中断服务函数,在主函数里面直接恢复初值.让后判断也能实现…..明白了,这里是时间倒++T_Count再判断.    嘿嘿  这里.明白了,不是一定要写服务中断子函数,在主函数里面恢复初值也成.
 if(++T_Count==5)
 {
 P0=_crol_(P0,1);
 P2=_crol_(P2,1);
 T_Count=0;
 }
 }
 }
 }
 
 下面给出TIMER0控制流水灯的完整程序含中断服务函数的程序,对比一下.也是好使的,一样的功能.
 #include<reg51.h>
 #include<intrins.h>
 #define uchar unsigned char
 #define uint unsigned int
 uchar T;
 //主程序
 void main()
 {
 P0=0xfe;
 P2=0xfe;
 ET0=1;    //允许定时器0中断
 EA=1;     //允许总中断
 TR0=1;    //启动定时器0
 TMOD=0x01;                         //定时器 0 工作方式 1
 TH0=(65536-40000)/256;             //40ms 定时
 TL0=(65536-40000)%256;
 while(1)
 {
 
 if(T==5)
 {
 P0=_crol_(P0,1);
 P2=_crol_(P2,1);
 T=0;
 }
 }
 }
 void it_timer0(void) interrupt 1
 {
 TH0=(65536-40000)/256;             //恢复初值
 TL0=(65536-40000)%256;
 T++;
 }
 这里我在中断服务函数里面将T作为标志位,函数的执行部分还是在主函数里.这样在多中断事件中,通过这样的写法能很清楚的知道执行顺序.
 
 | 
 |