打印

按键标志位连续取反的问题,

[复制链接]
2079|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xu0801hua|  楼主 | 2014-2-13 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在按键按下2键时,不能连续取反(标志位为:pt),
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ch451_rst            0x0201             //复位
#define ch451_lmov           0x0300             //设置移动方式-左移
#define ch451_lcyc           0x0301             //设置移动方式-左循
#define ch451_rmov           0x0302             //设置移动方式-右移
#define ch451_rcyc           0x0303             //设置移动方式-右循
                                    
#define ch451_soff           0x0400             //关显示、键盘、看门狗
#define ch451_son            0x0401             //开显示

#define ch451_dsp       0x0500             //设置默认显示方式
#define ch451_BCD       0x0580             //设置BCD译码方式
#define ch451_twinkle   0x0600             //设置闪烁控制

#define ch451_DIG0      0x0800             //数码管位0显示
#define ch451_DIG1      0x0900             //数码管位1显示  
#define ch451_DIG2      0x0A00             //数码管位2显示
#define ch451_DIG3      0x0B00             //数码管位3显示
#define ch451_DIG4      0x0C00             //数码管位4显示
#define ch451_DIG5      0x0D00             //数码管位5显示  
#define ch451_DIG6      0x0E00             //数码管位6显示  
#define ch451_DIG7      0x0F00             //数码管位7显示
/*
:TLV2543端口配置
*/
sbit TCL2543_CS=P3^5;
sbit TCL2543_CLK=P3^6;
sbit EOC=P3^7;
sbit TCL2543_ADIN=P2^4;
sbit TCL2543_DOUT=P2^3;

/*
ch451端口配置
*/
sbit ch451_load=P2^0;//片选输入端
sbit ch451_din =P2^1;//串行数据输入/输出端
sbit ch451_dclk=P2^2;//同步时钟输入端
/*
hc245端口配置
*/
sbit hc245_E=P1^0;//输出使能端
sbit hc245_E1=P1^1;//
sbit hc373_LE1=P1^5;
sbit hc373_LE2=P1^6;
sfr P4=0xe8;
sbit led1=P0^4;
bit flag,fdeng=0,shuc=0,pt=0;
unsigned char key,pp;
unsigned int ad_ji;
unsigned char num=0,pj=0,x=5,mj=0;
/*
开8个单元
*/
unsigned char  a[8]/*={0,10,12,13,14,15,16,17}*/;
//sbit LED1=P0^4;
/*
  led编码
*/
unsigned char code LED[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,/*0,1,2,3,4,5,6,7,8,9*/
                                   0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3e,0x5c,0x38,/*a,b,c,d,e,f,p,u,o,L*/
                                   0x76,0x00,0x40,0x54,0x1E,0x86,0xdb,0x01,0x08,0x09/*H,black,-,n,J,1.,2.,*/};
                                                           /* H    L                 口          */

const uint DigCode[8]={ch451_DIG0,ch451_DIG1,ch451_DIG2,ch451_DIG3,
                      ch451_DIG4,ch451_DIG5,ch451_DIG6,ch451_DIG7};
/*
:AT24C02B口配置
*/
sbit sda=P2^7;
sbit scl=P2^6;
sbit wp=P2^5;
bit write;
uchar num,z;
//微秒级延时函数(晶振为11.0592MHz, 延时大概4~5微秒, 用来操作I2C总线用)
void delay()
{
    ;
    ;
}
//发送启动信号: scl为高电平期间, sda发生负跳变
void start()
{
    sda = 1;
    delay();
    scl = 1;
    delay();
    sda = 0;
    delay();
}

//发送停止信号: scl为高电平, sda发生正跳变
void stop()
{
    sda = 0;
    delay();
    scl = 1;
    delay();
    sda = 1;
    delay();
}

//应答信号: scl为高电平期间, sda被接受设备拉为低电平, 最后scl置0
void response()
{
    uchar i;

    scl = 1;
    delay();
    while((sda == 1) && (i < 250))
        i++;

    scl = 0;
    delay();
}

//总线初始化: 将总线拉高以释放总线
void init()
{
    sda = 1;
    delay();
    scl = 1;
    delay();
}

//写字节数据: 将8位数据通过左移到CY(进位),然后赋值给数据线SDA
//每发送一位,scl出现正跳变
//发送完数据后,需要将scl置0, sda置1
void write_byte(uchar dat)
{
    uchar i, temp;

    temp = dat;
    for (i = 0; i < 8; i++)
    {
        temp = temp << 1;
        scl = 0;
        delay();
        sda = CY;
        delay();
        scl = 1;
        delay();
    }
    scl = 0;
    delay();
    sda = 1;
    delay();
}

//读字节数据: 将数据一位一位从sda中获取, 每读取一位scl出现负跳变
//通过变量k将8位数据整合为1个字节数据
//读数据前, 先将scl置0, sda置1
uchar read_byte()
{
    uchar i, k;

    scl = 0;
    delay();
    sda = 1;
    delay();
    for (i = 0; i < 8; i++)
    {
        scl = 1;
        delay();
        k = (k << 1) | sda;
        scl = 0;
        delay();
    }

    return k;
}

//特定地址写数据
void write_add(uchar address, uchar dat)
{
    //发送启动信号
    start();
   
    //发送控制字
    //at24c02的芯片地址为1010,地址控制字格式为1010A2A1A0R/W
    //1010对应16进制为a, R/W为0(写操作), 合并起来就是0xa0
    write_byte(0xa0);
    //写入地址后,需要响应
    response();
    //送一个字节存储单元的子地址
    write_byte(address);
    //写入地址后,需要响应
    response();
    //发送8为数据位
    write_byte(dat);
    //响应信号
    response();
    //发送停止信号
    stop();
}

//特定地址读数据
uchar read_add(uchar address)
{
    uchar dat;

    //发送启动信号
    start();
    //发送写控制字
    //at24c02的芯片地址为1010,地址控制字格式为1010A2A1A0R/W
    //1010对应16进制为a, R/W为0(写操作), 合并起来就是0xa0
    write_byte(0xa0);
    //写入地址后,需要响应
    response();
    //送一个字节存储单元的子地址
    write_byte(address);
    //写入地址后,需要响应
    response();

    //发送启动信号
    start();
    //发送读控制字
    //at24c02的芯片地址为1010,地址控制字格式为1010A2A1A0R/W
    //1010对应16进制为a, R/W为1(读操作), 合并起来就是0xa1
    write_byte(0xa1);
    //读地址后,需要响应
    response();
    //读取数据赋值给变量dat
    dat = read_byte();
    //发送停止信号
    stop();

    return dat;
}
/*
函数:write_ch451()
功能:执行ch451带数据指令
参数:
cmd:命令字
*/
void write_ch451(unsigned int cmd)
{
        uchar i;
        ch451_load=0;
        for(i=0;i<12;i++)
        {
                ch451_din=cmd&1;
                ch451_dclk=0;
                cmd=cmd>>1;
                ch451_dclk=1;
        }
        ch451_load=1;
}
/******
  显示函数
*******/
void display()
{
    if(pj>=1)
        {
        pj=0;
    write_ch451(DigCode[0]|LED[a[0]]);
        write_ch451(DigCode[1]|LED[a[1]]);
        write_ch451(DigCode[2]|LED[a[2]]);
        write_ch451(DigCode[3]|LED[a[3]]);
        write_ch451(DigCode[4]|LED[a[4]]);
        write_ch451(DigCode[5]|LED[a[5]]);
        write_ch451(DigCode[6]|LED[a[6]]);
        write_ch451(DigCode[7]|LED[a[7]]);
        }        
}
/*
ch451初始化
*/
void ch451_init()
{
        write_ch451(ch451_rst);
        write_ch451(0x0500);
           write_ch451(0x0401);          //开显示
}
/*
:P0口初始化
*/
void kchushua()
{
wp=0;
hc373_LE1=0;
hc373_LE2=0;
}
/*
延时函数
*/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
/*
矩阵键盘
*/
//P4.6----(*)----(*)----(*)----(*)----(*)
//         |      |      |      |      |      
//P4.5----(*)----(*)----(*)----(*)----(*)
//         |      |      |      |      |      
//P4.4----(*)----(*)----(*)----(*)----(*)          
//         |      |      |      |      |      
//         P0.4   P0.3   P0.2   P0.1   P0.0
unsigned char KeyScan()
{
unsigned char temp6;
P4=P4|0x70;//P4=x111 xxxx
P4=P4&0xef;//P4=x110 xxxx
P0=P0|0x1f;//P0=xxx1 1111
temp6=P0;
temp6=P0&0x1f;//temp6=0001 1111
if(temp6!=0x1f)
{
  delayms(10);
  P4=P4|0x70;//P4.6~4都是1
  P4=P4&0xef;//P4.4为0
  P0=P0|0x1f;//P0.4~0都是1
  temp6=P0;
  temp6=temp6&0x1f;
        if(temp6!=0x1f)
        {
                    flag=1;//有键按下了
            temp6=P0&0x1f;
            switch(temp6)
            {
            case 0x1e:
            key=15;
            break;
            case 0x1d:
            key=1;
            break;
            case 0x1b:
            key=2;
            break;
            case 0x17:
            key=3;
            break;
            case 0x0f:
            key=4;
            break;
            }
                        }
                        while(temp6!=0x1f/*()&&(++afolat<500)*/)
                        {
                         temp6=P0;
                         temp6=temp6&0x1f;
                        }
                         //display();
                         return key;//返回key值,退出程序   
    }       
        //P4.5取0;其他全1
   P4=P4|0x70;//P4=x111 xxxx
   P4=P4&0xdf;//P4=x110 xxxx
   P0=P0|0x1f;//P0=xxx1 1111
   temp6=P0;
   temp6=P0&0x1f;//temp6=0001 1111
   if(temp6!=0x1f)
   {
    delayms(10);
    P4=P4|0x70;//P4.6~4都是1
     P4=P4&0xdf;//P4.5为0
        P0=P0|0x1f;//P0.4~0都是1
        temp6=P0;
        temp6=temp6&0x1f;
        if(temp6!=0x1f)
        {
                     flag=1;//有键按下了
            temp6=P0&0x1f;
            switch(temp6)
            {
            case 0x1e:
            key=5;
            break;
            case 0x1d:
            key=6;
            break;
            case 0x1b:
            key=7;
            break;
            case 0x17:
            key=8;
            break;
            case 0x0f:
            key=9;
            break;
            }
                        }
                        while(temp6!=0x1f)
                        {
                         temp6=P0;
                         temp6=temp6&0x1f;
                        }
                         //display();
                return key;//返回key值,退出程序
    }

        //P4.6取0;其他全1
    P4=P4|0x70;//P4=x111 xxxx
    P4=P4&0xbf;//P4=x110 xxxx
    P0=P0|0x1f;//P0=xxx1 1111
    temp6=P0;
    temp6=P0&0x1f;//temp6=0001 1111
    if(temp6!=0x1f)
   {
    delayms(10);
    P4=P4|0x70;//P4.6~4都是1
    P4=P4&0xbf;//P4.4为0
        P0=P0|0x1f;//P0.4~0都是1
        temp6=P0;
        temp6=temp6&0x1f;
        if(temp6!=0x1f)
        {
                    flag=1;//有键按下了
            temp6=P0&0x1f;
            switch(temp6)
            {
            case 0x1e:
            key=10;
            break;
            case 0x1d:
            key=11;
            break;
            case 0x1b:
            key=12;
            break;
            case 0x17:
            key=13;
            break;
            case 0x0f:
            key=14;
            break;
            }
                        }
                        while(temp6!=0x1f)
                        {
                         temp6=P0;
                         temp6=temp6&0x1f;
                        }
                         //display();
           return key;//返回key值,退出程序
    }                    
                   return key;
}

/*
:按键测试
*/
void kaiqi()
{
  hc245_E=0;
  key=KeyScan();
  if(flag!=0)
{
  }
  hc245_E=1;
}
/*
:
*/
  void wait(unsigned int T_ms)
{
   unsigned int i,j ;
   for(j=0;j<T_ms;j++)
     for(i=0;i<100;i++);
}
/***********串 口 初  始  化  函  数***************/
  void TimerInit()
  {
  TMOD=0x01;//T1,计数模式,T0,定时模式,方式1
  EA=1;//开中中断
  ET0=1;//开定时器T0中断
  TH0=0x4c;//T0,50ms定时初值
  TL0=0x00;//T0,50ms定时初值
  TR0=1;//开定时0
  }
/***********定  时  中  断***************/
void T0_time() interrupt 1
{
TH0=0x4c;
TL0=0x00;
num++;
if(num>=10)
{
num=0;
pj=1;
}
}
/*

*/
  void anjianpd()
{
kaiqi();
if(key==2)
{
   hc373_LE2=1;
   led1=~led1;
   hc373_LE2=0;
   pt=~pt;
}
}
/*

*/
void AT24c02()
{
kaiqi();
if(pt==0)
{
  a[0]=16;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=21;pp=0x00;
  }
  display();
  }
  /*
  :
  */
  void cztai()
  {
  if(pt==1)
  {
  a[0]=12;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=21;pp=0x01;
  }
   display();
  }
/*
:ad
*/
void adcaij()
{
a[0]=16;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=21;
display();
}
/*
:主函数
*/
void main()
{
//uchar z;
init();//总线初始化
TimerInit();//串口初始化
kchushua();
ch451_init();
//adcaij();  
while(1)
{
anjianpd();
AT24c02();       
cztai();
}
}

相关帖子

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

本版积分规则

34

主题

81

帖子

1

粉丝