导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→关于UPD16312的按键接收问题[yuangli]

 *第39126篇: 关于UPD16312的按键接收问题

  
楼 主:yuangli 2006年4月6日09:21
 关于UPD16312的按键接收问题
做过UPD16312的朋友,请指点一下UPD16312的键盘接收问题,我的程序显示没问题,但是键盘接收不稳定,时有时无。

我的VFD测试程序

#include  <pic.h>  

#define STB     RA0
#define SCK     RA1
#define SDA     RA2
#define nop     asm("NOP")

char key_value1;
char key_value2;
char key_value3;
char temp1;
char temp2;
char temp3;
char dis_data;
char usec;
char dis_add;
char dis_value;

const char display_value[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6};//字符编码

void dmsec(int msec);
void dusec(char usec);
void dis_byte(char dis_data);
void dis_ini();
void display(char add,char xs_value);
void key_scan();
read_key();

main()
{
 char i;

 dis_ini();
 
        temp1=7;//观查变量方便随便赋的值
 temp2=8;//观查变量方便随便赋的值
 temp3=9;//观查变量方便随便赋的值
 key_value1=1;//观查变量方便随便赋的值
 key_value2=2;//观查变量方便随便赋的值
 key_value3=3;//观查变量方便随便赋的值
 
 while(1)
        {
                dis_add=0xc1;
         dis_value=display_value[1];
         display(dis_add,dis_value);
         
         dis_add=0xc0;
         dis_value=display_value[5];
         display(dis_add,dis_value);
         
         dis_add=0xc5;
         dis_value=display_value[5];
         display(dis_add,dis_value);
         
         dis_add=0xc4;
         dis_value=display_value[8];
         display(dis_add,dis_value);
         
         dis_add=0xc7;
         dis_value=display_value[0];
         display(dis_add,dis_value);
         
         dis_add=0xc6;
         dis_value=display_value[9];
         display(dis_add,dis_value);

                key_scan();
         
         if(key_value1!=0)//有按键按下则退出循环
          break;
         if(key_value2!=0)
          break;
         if(key_value3!=0)
          break;
        }

        temp1=key_value1;

        temp2=key_value2;

        temp3=key_value3;

        dusec(255);

 while(1)
 {
                nop;
        }
}
//=====================================
void dusec(char usec)
{
 for(usec;usec>  0;usec--)
 {
  nop;
 }
 nop;
}
//=====================================
void dmsec(int msec)
{
        char TempCyc;
       for(msec;msec>  0;msec--)
      {
               for(TempCyc=125; TempCyc>  0; TempCyc--);
               {
                     nop;
                }
      }
      nop;
}
//=====================================
void dis_ini()
{
          char loop_temp;
 
         ADCON1=0xff;            //设置A口为IO口
        PORTA=0;dusec(10);
        TRISA=0;dusec(10);     //初始化IO口

        STB=1;
        dmsec(1000);
        STB=0;

        dis_data=0b00000001;         //设定显示方式:

        dis_byte(dis_data);
        STB=1;dusec(1);

        STB=0;
        dis_data=0b01000100;        //设定数据:1、正常操作 2、数据写入后的增量地址
        dis_byte(dis_data);       //3、写数据至显示存储器
         STB=1;dusec(1);

         STB=0;
        dis_data=0b1100000;        //设定地址:地址=00000
        dis_byte(dis_data);
        
          dis_add=0xbf;
         for(loop_temp=12;loop_temp>  0;loop_temp--)
        {
                   dis_add++;
                  dis_data=0b00000000;        //显示值为0,清空
                  display(dis_add,dis_data);
         }
          STB=1;dusec(1);

         STB=0;
        dis_data=0b10001111;        //设定显示控制:1、显示通 2、脉冲为14/16
        dis_byte(dis_data);
        STB=1;dusec(1);
}

//=====================================
void display(char dis_add,char dis_value)
{
          TRISA=0;nop;
          STB=0;
        dis_data=0b01000100;    //设定数据:1、正常操作 2、数据写入后的固定地址
        dis_byte(dis_data);     //3、写数据至显示存储器
        STB=1;nop;

         STB=0;
        dis_data=dis_add;       //设定地址
        dis_byte(dis_data);

        dis_data=dis_value;
        dis_byte(dis_data);
        STB=1;nop;
}

//=====================================
void dis_byte(char dis_data)
{
        char i;
        TRISA=0;nop;
        for(i=8;i>  0;i--)
 {
      SCK=0;nop;
      if(dis_data&0x01)
       SDA=1;
      else
       SDA=0;
      nop;
      SCK=1;nop;
         dis_data>  >  =1;
        }
        nop;
}

//=====================================
void key_scan()
{
 TRISA=0;nop;
        STB=0;nop;
 dis_data=0b01000010;
        dis_byte(dis_data);
        
        key_value1=read_key();
                        
        key_value2=read_key();
        
        key_value3=read_key();

       //STB=1;nop;//有这一句显示亮度会变暗(不知为什么?)
}        

//=====================================        
read_key()
{
 char i;

 TRISA=0x04;nop;
 dis_data=0;
        for(i=8;i>  0;i--)
 {
      SCK=1;dmsec(5);
      dis_data  <  <=1;
  if(SDA)
  {
   dis_data|=0x01;
  }
  SCK=0;dmsec(5);
        }
        return(dis_data);
}



>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]::请教keil高手 ?C_ADDXBP是个函数,我找不到其原形呢?

[下一篇主题]:跪求,请那位告诉我ATMEGA8L-8PL的资料?????