初始化函数
voidhd7279_init()
{
delay_ms(50);//上电延迟
P1DIR|=BIT0+BIT1+BIT2;//单片机相关IO口设置
//P1DIR&=~BIT3;//KEY为输入
send_byte(CMD_RESET);//输入清除指令
delay_ms(50);
}
//因为当HD7279A检测到有效的按键时,KEY引脚从高电平变为低电平,并一直保持到按键结束,所以可以用下降沿出发,也可以用上升沿出发
voidinterrupt_init()
{
//在本程序中,按键按下于不按下,key的电平要么为高,要么为低,是确定的,不会有悬空浮动状态,所以下面两句内部拉电阻的设置可以不用要
//P1REN|=BIT3;//pullup内部上拉电阻使能
//////使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断
//P1OUT=BIT3;//当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来
//////0:下拉,1:上拉
P1IE|=BIT3;//P1.3interruptenabledP13中断使能
P1IES|=BIT3;//P1.3Hi/loedge下降沿中断
P1IFG&=~BIT3;//P1.3IFGcleared中断标志位清零
}
voidmain(void)
{
unsignedchars1[]={"key:"};
WDTCTL=WDTPW+WDTHOLD;//停止看门狗定时器
BCSCTL1=CALBC1_12MHZ;//设定cpu时钟DCO频率为12MHz
DCOCTL=CALDCO_12MHZ;
P2DIR|=BIT5+BIT4;//液晶的两条线
init_lcd();
hd7279_init();
interrupt_init();//IO中断初始化
P1DIR|=BIT6;
P1OUT&=~BIT6;
wr_string(0,0,s1);//第一行第一个位置显示s1
_BIS_SR(LPM4_bits+GIE);//进入LPM4开中断
}
//Port1interruptserviceroutine
#pragmavector=PORT1_VECTOR
__interruptvoidPort_1(void)
{
uchari=0;
_DINT();
P1OUT|=BIT6;
key=rd_key();//读取键值
//while((P1IN&BIT3)==0);//等待按键松开
for(i=0;i<10;i++)
{
if(key==key_code[i])//利用数组进行键值转化
key=i;//转化为了对应的数字
}
wr_int(1,0,key);//显示
P1IFG&=~BIT3;//中断标志位清零
_EINT();//打开中断
}
//下面是用死循环检测按键按下,这种方法可以,但是不灵敏,并且浪费cpu资源改进是用key出发IO口中断,然后进行键盘处理
//for(;;)//用死循环检测按键按下
//{
//if((P1IN&BIT3)==0)//当HD7279A检测到有效的按键时,KEY引脚从高电平变为低电平,并一直保持到按键结束。在此期间,
////如果HD7279A接收到‘读键盘数据指令’,则输出当前按键的键盘代码;如果在收到‘读键盘指令’时没有有效按键,HD7279A将输出FFH。
//
//{
//key=rd_key();//读取键值
//while((P1IN&BIT3)==0);//等待按键松开
//}
//wr_int(2,0,key);//显示
//}
//对应键值:1-362-373-384-445-456-467-528-539-540-61*-60#-62A-39B-47C-55D-63