凛月天吧 关注:3贴子:20
  • 0回复贴,共1
  • 59.77.10.*
#include <ht46c24.h>
#define uchar unsigned char
#define uint unsigned int
#define FALSE 0
#define TRUEn 1
#define ENTER 0x0a
#define CLEAR 0x0b
///定义中断如何函数
#pragma vector int_4@0x4
#pragma vector timer0_8 @0x8
#pragma vector timer1_c @0xc
uchar readkey;//全局变量声明
//函数声明
void int_4() {}
void system_init(void);
uchar getkey(void);
void display(void);
//主函数
void main()
{
system_init();
while(1)
{   
getkey();
readkey=8;
if(readkey==0xff)
continue;
}
}
void system_init(void)
{      
_intc0=0;
_intc1=0;
   //定时器0,定时模式,上升沿,不分频
_pbc=0;
_pcc=0;
//显示0000
_pc=0;
_pb=0;
readkey=0;
}
void display(void)
{
 _pb|=0x0f;    //b3,2,1,0口输出为1,关显示 
 _pb&=0xfe;    //b0输出0,个位数码管点亮
 _pc&=0xf0;    //保留pc口的高四位
 _pc|=readkey;    //pc口输出temp1值 
 _delay(1000);
 _pb|=0x0f;  
}
uchar getkey(void)
{
uchar pre_key;
uchar temp1,temp2;
//pa7-pa4列线输出,pa3-pa0行线输入
_pac=0x0f;
_pa=0x0f;//列线输出低
_delay(2);//等待pa口数据稳定
temp1=_pa;
temp1&=0x0f;//取pa口低四位
if(temp1==0x0f)
        return  0xff;//无按键返回
//pa7-pa4列线输入,pa3-pa0行线输出
_pac=0xf0;
_pa=0xf0;
_delay(2);
temp2=_pa;
temp2&=0xf0;
if(temp2==0xf0)
return 0xff;
pre_key=temp2|temp1;
//_delay(10000);
    /**************再次判断按键*******************/
// pa7-pa4列线输出,pa3-pa0行线输入
_pac=0x0f;
_pa=0x0f; //列线输出低
_delay(2); //等待pa口数据稳定
temp1=_pa;
temp1&=0x0f; //取pa口低四位
if(temp1==0x0f)
    return 0xff; //无按键返回
//pa7-pa4列线输入,pa3-pa0行线输出
_pac=0xf0;
_pa=0xf0;
_delay(2);
temp2=_pa;
temp2&=0xf0;
if(temp2==0xf0)
return 0xff;
readkey=temp2|temp1;
if(pre_key!=readkey)
   return 0xff;
/****************查表*********************/
switch(readkey)
{
case 0xee:readkey=1;break;
case 0xde:readkey=2;break;
case 0xbe:readkey=3;break;
case 0xed:readkey=4;break;
case 0xdd:readkey=5;break;
case 0xbd:readkey=6;break;
case 0xeb:readkey=7;break;
case 0xdb:readkey=8;break;
case 0xbb:readkey=9;break;
case 0xd7:readkey=0;break;
case 0xe7:readkey=ENTER;break;
case 0xb7:readkey=CLEAR;break;
default:readkey=0xff;break;
}
/***************按键音符匹配***********************/
switch(readkey)
{
case 1:_delay(960);_pc4=~_pc4;break;
case 2:_delay(860);_pc4=~_pc4;break;
case 3:_delay(730);_pc4=~_pc4;break;
case 4:_delay(660);_pc4=~_pc4;break;
case 5:_delay(620);_pc4=~_pc4;break;
case 6:_delay(510);_pc4=~_pc4;break;
case 7:_delay(430);_pc4=~_pc4;break;
case 8:_delay(420);_pc4=~_pc4;break;
case 9:_delay(1205);_pc4=~_pc4;break;
case 0:_delay(1400);_pc4=~_pc4;break;
default:_pc4=0;break;
}
}         



1楼2009-04-10 15:47回复