|
发一个键盘处理函数,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;
}
|
|