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作为标志位,函数的执行部分还是在主函数里.这样在多中断事件中,通过这样的写法能很清楚的知道执行顺序.
|