📄 key_init.h
字号:
//******************************************************************************
//程序名称:按键初始化
//designed by lvshichao
//2008.10.1
//******************************************************************************
//#include "io430.h"
unsigned char key_real; //全局变量,按键返回值
unsigned char key_setflag=0; //定时器翻转,控制字的闪烁频率
unsigned char key_flash=0; //日期闪烁指针
unsigned key_va1,key_va2; //按键读取函数
unsigned char key_set_datah=0,key_set_datal=0; //用于日期高低位设定的标志位
unsigned char key_set_1302;
//-------------------------------------------
//函数名称:delay_key()
//功能:软件延时
//-------------------------------------------
void delay_key(unsigned int i)
{
while(i--);
}
//------------------------------------------
//函数名称:row_scan()
//功能:确定键值
//------------------------------------------
unsigned char row_scan(void)
{
unsigned char temp,key_temp;
P1DIR=0XF0;
P1OUT&=0X0F;
temp=P1IN;
if((temp&0x0f)<0x0f) //检查是否有键按下
{
delay_key(0x5ff); //延时,消除抖动
temp=P1IN;
if((temp&0x0f)<0x0f) //确定按键
{
switch(temp)
{
case 0x07: key_temp=1;break; //第一行,有键按下
case 0x0b: key_temp=2;break; //第二行,有键按下
case 0x0d: key_temp=3;break; //第三行,有键按下
case 0x0e: key_temp=4;break; //第四行,有键按下
}
return key_temp; //返回键值
}
}
return 0x7f; //无键按下时,返回0x7f
}
//------------------------------------------
//函数名称:key_scan
//功能:按键扫描
//------------------------------------------
unsigned char key_scan(void)
{
unsigned char row_flag=0;//列扫描标志,当有键按下时,置位,确定键值
unsigned char row_temp=0;//存放列扫描数据
unsigned char key_temp=0;//
P1DIR=0X0F; //P1口设置为输出,行设置为低电平
P1OUT&=0xf0; //低四位设置为低电平
key_temp=P1IN; //读取键值
if((key_temp&0XF0)<0XF0)//检查是否有键按下
{
delay_key(0x5ff);//延时,消除抖动
key_temp=P1IN; //确定按键
if((key_temp&0xf0)<0xf0)
{
//列按键有按下
row_flag=1; //列按键有键按下,下一步判断键值
switch(key_temp) //确认键值
{
case 0xe0: row_temp=1;break; //第一列,有键按下
case 0xd0: row_temp=2;break; //第二列。有键按下
case 0xb0: row_temp=3;break; //第三列,有键按下
case 0x70: row_temp=4;break; //第四列,有键按下
}
}
}
else
{
return 0x7f; //无键按下,返回0x7f
}
if(row_flag==1) //扫描到有键按下,判断具体按键
{
row_flag=0 ;//清除置位标志
switch(row_temp)
{
case 1:key_temp=row_scan();
switch(key_temp)
{
case 1:key_real=1;break;//第一个按键按下
case 2:key_real=5;break;//
case 3:key_real=9;break;//
case 4:key_real=13;break;//
}break;
case 2:key_temp=row_scan();
switch(key_temp)
{
case 1:key_real=2;break;
case 2:key_real=6;break;
case 3:key_real=10;break;
case 4:key_real=14;break;
}break;
case 3:key_temp=row_scan();
switch(key_temp)
{
case 1:key_real=3;break;
case 2:key_real=7;break;
case 3:key_real=11;break;
case 4:key_real=15;break;
}break;
case 4:key_temp=row_scan();
switch(key_temp)
{
case 1: key_real=4;break;
case 2: key_real=8;break;
case 3: key_real=12;break;
case 4: key_real=16;break;
}break;
}
return key_real;//返回键值
}
}
//------------------------------------------------------------------------------
//函数名称:key_1302_write()
//功能:按键修改DS1302的时间写入函数
//------------------------------------------------------------------------------
void key_1302_write(unsigned char select,unsigned char data)
{
unsigned char time_temp[8];
unsigned char i;
//-----------------------------------------------------------------------
//读取现在时间
for(i=0;i<8;i++)
{
time_temp[i]=time_real_buf[i];
}
//disp_char(0x94,time_temp[1]);
// LCD_write_data(time_temp[2]);
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//修改时间,先判断高低位修改顺序
if(key_set_datah==1) //是否修改高位
{
key_set_datah=0; //高位修改关闭
key_set_datal=1; //允许低位修改
data=(data<<4);
for(i=1;i<7;i++)
{
time_temp[i]=(time_temp[i]&0x0f);
time_temp[i]+=data;
}
disp_char(0x95,time_temp[1]);
}
else if(key_set_datal==1)
{
key_set_datah=1;
key_set_datal=0;
for(i=1;i<7;i++)
{
time_temp[i]=(time_temp[i]&0xf0);
time_temp[i]+=data;
}
}
//------------------------------------------------------------------------
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
switch(select)
{
case 1: ds1302_write_byte(ds1302_year_add,time_temp[1]); break; //年
case 2: ds1302_write_byte(ds1302_month_add,time_temp[2]); break; //月
case 3: ds1302_write_byte(ds1302_date_add,time_temp[3]); break; //日
case 4: ds1302_write_byte(ds1302_hr_add,time_temp[4]); break; //时
case 5: ds1302_write_byte(ds1302_min_add,time_temp[5]);break; //分
case 6: ds1302_write_byte(ds1302_sec_add,time_temp[6]); break; //秒
}
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
}
//------------------------------------------------------------------------------
//函数名称:key_function
//功能:按键功能
//------------------------------------------------------------------------------
void key_function(void)
{
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
key_va1=key_scan(); //读取按键
if(key_va1!=0x7f)
{
do key_va2=key_scan();
while(key_va1==key_va2);//等待按键释放
//按键功能函数
switch(key_va1)
{
//------------------------------------------------------------------------
//功能按键区
case 11:break;
case 12: //确定按键
//key_set_1302=0; //确定修改
break;
case 13: //设置按键
TACTL|=MC0; //定时器A允许工作,进入选定步骤
key_setflag=1; //开始闪烁
key_set_1302=1; //时间设置标志,允许修改时间
key_set_datah=1; //允许修改高位
key_set_datal=0;
//----------------------------------------------------------------
key_flash++; //闪烁指针
if(key_flash==7) //每次按键,日期闪烁指针+1
key_flash=1;
//----------------------------------------------------------------
//disp_char(0x94,(key_flash+0x30));
break;
case 14:break;
case 15:break;
case 16: //返回按键
TACTL&=0XFFCF; //关闭定时器A
key_set_1302=0; //关闭时间修改
key_setflag=0; //正常显示
key_flash=0; //闪烁指针清零
disp_char(0x94,0x02);
break;
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//数字按键区
case 1: if(key_set_1302) //是否允许修改时间
{
//if(key_set_datah==0) //高位是否修改
key_1302_write(key_flash,1); //修改时间
//disp_char(0x95,0x31);
}
break;
case 2:
if(key_set_1302) //
{
key_1302_write(key_flash,2); //修改时间
//disp_char(0x95,0x32);
}
break;
case 3:
if(key_set_1302)
{
key_1302_write(key_flash,3);
}
break;
case 4:
if(key_set_1302)
{
key_1302_write(key_flash,4);
}
break;
case 5:
if(key_set_1302)
{
key_1302_write(key_flash,5);
}
break;
case 6:
if(key_set_1302)
{
key_1302_write(key_flash,6);
}
break;
case 7:
if(key_set_1302)
{
key_1302_write(key_flash,7);
}
break;
case 8:
if(key_set_1302)
{
key_1302_write(key_flash,8);
}
break;
case 9: //s数字‘1’
if(key_set_1302)
{
key_1302_write(key_flash,9);
}
break;
case 10: //数字‘0’
if(key_set_1302)
{
key_1302_write(key_flash,0);
}
break;
}
}
//-----------------------------------------------------------------------------
// 时间显示
if(key_setflag)
{
switch(key_flash)
{
case 1:
disp_char(0x88,0x20);
LCD_write_data(0x20);
break;
case 2:
disp_char(0x8a,0x20);
LCD_write_data(0x20);
break;
case 3:
disp_char(0x8c,0x20);
LCD_write_data(0x20);
break;
case 4:
disp_char(0x98,0x20);
LCD_write_data(0x20);
break;
case 5:
disp_char(0x9a,0x20);
LCD_write_data(0x20);
break;
case 6:
disp_char(0x9c,0x20);
LCD_write_data(0x20);
break;
}
}
else
{
disp_number(0x88,time_real_buf[1]);//年
disp_number(0x8a,time_real_buf[2]);//月
disp_number(0x8c,time_real_buf[3]);//日
disp_number(0x98,time_real_buf[4]);//时
disp_number(0x9a,time_real_buf[5]);//分
disp_number(0x9c,time_real_buf[6]);//秒
disp_char(0x84,time_real_buf[1]);
LCD_write_data(time_real_buf[2]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -