3221|0

280

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

发一个键盘处理函数,4*4的方式 [复制链接]

发一个键盘处理函数,4*4的方式,他可以要求对方输入数据,并确认后,才能输入下一个数据,当输入4个数据后,再完全显示输入的4个数
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//      REV0.1      :
//  Author  :toby
//  Date  : 2009/11/05/PM:9:44
//      Function : 用4*4按键的方式来输入 当分别输入1234里,在数码管上显示1234
//  MCU   : PIC16F817
//  C Compiler : PICC 8.05
//  IDE   : MPLAB IDE v8.36               
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include            
  __CONFIG(0x1836);  
  #define ENTER   RB0
  const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90};  //定义常数0-9的数据表格
     
  unsigned char  result=0,set_time=0,show=3;
  unsigned int   total=0,ge=0,shi=0,bai=0,qian=0,a=0,b=0,c=0,d=0;
  unsigned char scan_ok[]={0,0,0,0};
  unsigned char kuangun[]={0B11111110,0B11111101,0B11111011,0B11110111};
  void  delay(unsigned char x);              //delay函数申明
  void  init();                              //I/O口初始化函数申明
  void  display(unsigned int x);            //显示函数申明
  void interrupt clkint(void);
  void tmint(void);  
  unsigned char scan();                      //按键扫描程序申明
//---------------------------------------------------
                                             //主程序  
  void main(){
                init();    //调用初始化子程序
                asm("clrwdt");                  
                while(1){     
                           asm("clrwdt");        //循环工作
     
                           display(8888);
                           scan();
                           asm("clrwdt");
                           if(ENTER==0){  
                              PORTD=0XFF;
                              result=0;    while(ENTER==0)    { asm("clrwdt");  display(a);       }   while(1){ scan();   asm("clrwdt");     a=1000*scan();   display(a);          show=0;     if(ENTER==0)    break; }
                              result=0;    while(ENTER==0)    { asm("clrwdt");  display(a+b);     }   while(1){ scan();   asm("clrwdt");     b=100*scan();    display(a+b);        show=1;     if(ENTER==0)    break; }
                              result=0;    while(ENTER==0)    { asm("clrwdt");  display(a+b+c);   }   while(1){ scan();   asm("clrwdt");     c=10*scan();     display(a+b+c);      show=2;     if(ENTER==0)    break; }
                              result=0;    while(ENTER==0)    { asm("clrwdt");  display(a+b+c+d); }   while(1){ scan();   asm("clrwdt");     d=scan();        display(a+b+c+d);    show=3;     if(ENTER==0)    break; }
                              while(1){ asm("clrwdt"); display(a+b+c+d);}
                           }
            
                }
  }
//---------------------------------------------------
//初始化函数
  void init(){
              TRISB=0B11111111;
              ADCON1=0X07;               //设置A口为普通I/O口
              TRISA=0B00000000;         
              TRISC=0B11110000;          //设置C口高4位为输入,低4位为输出
              asm("clrwdt");
              TRISD=0X00;                //设置D口为输出
              PORTA=0XFF;              
              PORTD=0XFF;                //先清除所有显示
              tmint();
              GIE=1;
  }
//------------------------------------------------
//按键扫描程序
  unsigned char scan() {
               asm("clrwdt");
               PORTC=0xff;
               RC3=0;        {if(RC4==0) result=1;   if(RC5==0) result=5;   if(RC6==0) result=9;    if(RC7==0) result=13;}  
               PORTC=0xff;
               RC2=0;       {if(RC4==0) result=2;    if(RC5==0) result=6;   if(RC6==0) result=10;    if(RC7==0) result=14;}  
               asm("clrwdt");
               PORTC=0xff;
               RC1=0;       {if(RC4==0) result=3;   if(RC5==0) result=7;    if(RC6==0) result=11;    if(RC7==0) result=15;}   
               PORTC=0xff;
               RC0=0;       {if(RC4==0) result=4;    if(RC5==0) result=8;    if(RC6==0) result=12;   if(RC7==0) result=16;}  
               return  result;
}
//----------------------------------------------------------
//显示程序
void  display(unsigned int x){            //按键值显示函数  
   
       unsigned char a=0;
       scan_ok[0]=x/1000;                  //求显示的千位   
       scan_ok[1]=x%1000/100;              //求显示的百位      
       scan_ok[2]=x%100/10;                //求显示的十位
       scan_ok[3]=x%10;                    //求显示的个位   
       asm("clrwdt");
       for(a;a<=show;++a){
         PORTD=TABLE[scan_ok[a]];         
         PORTA=kuangun[a];               
         delay(21);                       //延迟以保持亮度
         asm("clrwdt");
      }
         PORTD=0XFF;                     //消影
   }
//------------------------------------------------------------------
//延时程序
void  delay(unsigned char x){            //延时程序     
     for(x;--x;) asm("clrwdt");
}

void tmint(void)               //定时初始化函数               
{
        asm("clrwdt");
        T0CS=0;                //T0CS是TMR0的时钟源选择位,当其=1时是用RA4(T0CKI)的外部输入时钟,当其=0时是用内部指令周期时钟(CLKOUT)
        PSA=0;                 //PSA是预分频器分配位,当其=1预分频器分配给WDT,当其=0时预分频器分配给Timer0 模块
        PS2=1;                 //PS2S1S0:预分频比选择位  1 1 1是256分频
        PS1=1;
        PS0=1;
        T0IF=0;                //T0IF是TMR0溢出中断标志位,当其=1时TMR0 寄存器已经溢出(必须用软件清零),当其=0时寄存器尚未发生溢出
        T0IE=1;                //T0IE是TMR0 溢出中断允许位当其=1时允许TMR0 溢出中断,当其=0时禁止TMR0 溢出中断
}
void interrupt clkint(void)      //定时器中断函数
{         
           asm("clrwdt");
           set_time++;
           T0IF=0;
}
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表