打印

学习笔记一

[复制链接]
1753|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
仙人球W|  楼主 | 2013-1-14 18:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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作为标志位,函数的执行部分还是在主函数里.这样在多中断事件中,通过这样的写法能很清楚的知道执行顺序.

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

720

帖子

5

粉丝