历史上的今天
今天是:2024年11月15日(星期五)
2019年11月15日 | avr 12864 矩阵键盘
2019-11-15 来源:51hei
//要做成定时器中断法,节省时间开支
/**************************************
** 说明:线翻转法进行键盘扫描
** 输出:获得高低位的扫描值
** 有键时需要耗时 14ms
**************************************/
unsigned char key_scan(void)
{
unsigned char temp=0,key=0;
KEY_DDR = 0xF0; //高四位输出0,键按下,则对应的值为0
KEY_PORT = 0x0F; //低四位输入,内部电阻上拉,没有键按下时为高
temp = KEY_PIN&0x0F;//与掉高四位
if(temp==0x0F)
{
return 0; // 无按键返回
}
else
{
Delay_ms(10);
temp = KEY_PIN&0x0F; //延时去抖后再检测
if(temp==0x0F)
return 0;
else
key=temp;
}
//翻转
KEY_DDR = 0x0F; //低四位输出0,键按下,则对应的值为0
KEY_PORT = 0xF0; //高四位输入,内部电阻上拉,没有键按下时为高
Delay_ms(3);
//延时等待稳定
temp = KEY_PIN&0xF0;//与掉低四位
if(temp==0xF0)
{
return 0; // 无按键返回
}
else
//这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
{
key |= temp; //高低位的键值进入KEY
}
KEY_DDR = 0x00;/*输出复位*/
KEY_PORT = 0xFF;
return key;
}
/**************************************
** 说明:获得键盘的值
** 内部调用函数key_scan
** 输出:实际键值
**************************************/
unsigned char get_key(unsigned char key_get)
{
switch (key_get)
{/*将按键码转换成键值*/
case Key_0_zero: LCD_WRITE_DAT_CMD(WRDAT,'0');
return 0;
case Key_1_BLACK: LCD_WRITE_DAT_CMD(WRDAT,'1');
return 1;
case Key_2_PRINT: LCD_WRITE_DAT_CMD(WRDAT,'2');
return 2;
case Key_3_REPORT: LCD_WRITE_DAT_CMD(WRDAT,'3');
return 3;
case Key_4_START: LCD_WRITE_DAT_CMD(WRDAT,'4');
return 4;
case Key_5_CURVE: LCD_WRITE_DAT_CMD(WRDAT,'5');
return 5;
case Key_6_TIME: LCD_WRITE_DAT_CMD(WRDAT,'6');
return 6;
case Key_7_CHECK: LCD_WRITE_DAT_CMD(WRDAT,'7');
return 7;
case Key_8_SAVE: LCD_WRITE_DAT_CMD(WRDAT,'8');
return 8;
case Key_9_CORRECTION: LCD_WRITE_DAT_CMD(WRDAT,'9');
return 9;
// case Key_SET: LCD_WRITE_DAT_CMD(WRDAT,'.');
// return '.';
default : return 0x00;
}
}
/**************************************
** 说明:获得键盘的值
** 内部调用函数key_scan
** 输出:实际键值
**************************************/
unsigned char run_key(unsigned char key_get)
{
switch (key_get)
{/*将按键码转换成键值*/
case Key_0_zero:
LCD_WRITE_DAT_CMD(WRDAT,'0');
return 0;
case Key_1_BLACK:
LCD_WRITE_DAT_CMD(WRDAT,'1');
return 1;
case Key_2_PRINT:
LCD_WRITE_DAT_CMD(WRDAT,'2');
return 2;
case Key_3_REPORT:
LCD_WRITE_DAT_CMD(WRDAT,'3');
return 3;
case Key_4_START:
LCD_WRITE_DAT_CMD(WRDAT,'4');
return 4;
case Key_5_CURVE: //进入标定程序
LCD_WRITE_DAT_CMD(WRDAT,'5');
return 5;
case Key_6_TIME:
LCD_WRITE_DAT_CMD(WRDAT,'6');
return 6;
case Key_7_CHECK:
LCD_WRITE_DAT_CMD(WRDAT,'7');
return 7;
case Key_8_SAVE:
LCD_WRITE_DAT_CMD(WRDAT,'8');
return 8;
case Key_9_CORRECTION:
LCD_WRITE_DAT_CMD(WRDAT,'9');
return 9;
case Key_OK:
return 'O';
case Key_Cannel:
return 'C';
default : return 0xFF;
}
}
extern unsigned char l_tmpdate[7];
// 0 1 2 3 4 5 6
// 秒分时日月周年09-11-20 12:00:00
void time_keynum_task(unsigned char ddram_addrc)
{
unsigned char key_test=0;
unsigned char i=1;
unsigned char j[8]={0};
convertChar(X_SHI,Y_SHI,2,FANBAI,1);
Read_RTC();
j[2]=(l_tmpdate[2]/16)*10+l_tmpdate[2]%16;
j[1]=(l_tmpdate[1]/16)*10+l_tmpdate[1]%16;
j[0]=(l_tmpdate[0]/16)*10+l_tmpdate[0]%16;
j[6]=(l_tmpdate[6]/16)*10+l_tmpdate[6]%16;
j[4]=(l_tmpdate[4]/16)*10+l_tmpdate[4]%16;
j[3]=(l_tmpdate[3]/16)*10+l_tmpdate[3]%16;
j[5]=(l_tmpdate[5]/16)*10+l_tmpdate[5]%16;
while(1)
{
Delay_ms(100);
key_test = key_scan();
if(key_test !=0)
{
if(key_test==Key_OK)
史海拾趣
|
内核定制时死在这句话 FMD::FMD_OEMIoControl = 0x71c24? FMD::FMD_OEMIoControl = 0x71c24 用pb向导定制了一个较精简的内核,总是死在这句话上,请问你们遇到过吗?… 查看全部问答> |
|
指令周期是 12/4MHz=3us,电子钟以秒为单位计时。 如何才能做到软件的每天误差小于 1 秒?晶振误差不考虑。 如果定时器以 3ms 中断一次,那么 333.33333 次中断就是一秒, 如果用 333 来近似,那么软件每天大约会快 80 秒。 请问有没有好的办法 ...… 查看全部问答> |
|
老师叫我这几天做自学习红外遥控器,目前以美的空调遥控器为例。查阅过资料说空调遥控器码和普通电视遥控器 码不同。我用示波器看了下 我的这款美的空调遥控器的码 是 先4MS高电平和4MS低电平引导码,然后是用户码和数据码&n ...… 查看全部问答> |
|
对于照明设计的五点期望期望一:有待提高——照明设计水平 照明设计行业从无到有,从被动的需要到主动的设计经历了较长的发展过程。现在,人们越来越重视照明环境,照明设计师在建筑环境中发挥的作用也越来越大。在不同的建筑环境中,照明设计 ...… 查看全部问答> |
|
电子工程师/技术员 硬件工程师 岗位职责: 1. 根据产品需求,完成产品的电路及PCB设计; 2. 完成工程样机的装配、调试与改进; 3. 完成产品各 ...… 查看全部问答> |
|
今天在拿到这个芯片的时候迫不及待的拿起我的项目主控ZIGBEE来调通并加入组网实验中来看这个存储效果如何,利用两天天的时间两个个人终于完全整好了,没想到稳定性以及速度都非常乐观。 在zigbee光伏景观灯中,需要用 ...… 查看全部问答> |




