本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
//--------------------------------------------------------------------------------------------------------------
// 函数名称:
// 输入参数:
// 输出参数:1
// 功能说明:
//--------------------------------------------------------------------------------------------------------------
#include<AVR/io.h>
#include<util/delay.h>
#include<math.h>
#include<string.h>//标准字符串
#include<ctype.h>//字符操作6.14
#include<avr/interrupt.h>
#include<avr/pgmspace.h>
#define uint unsigned int
#define uchar unsigned char
#include "标准显示.h"
#define key_pressed ((PINC & 0X08)==0X08)
#define key_number (PINC & 0XF0) //按键的值
/*---------------------------------按键执行函数-------------------------------*/
uchar iMenuNextID;
uchar iMenuID ;
void Function_Port ()
{
iMenuID=iMenuNextID;
}
//*---------------------- 菜单架构 *----------------------------//
typedef struct
{
uchar KeyTab_MenuIndex; // 当前状态索引号
uchar KeyTab_MaxItems; // 本级菜单最大条目数
uchar KeyTab_PressOk; // 按下"回车"键时转向的状态索引号
uchar KeyTab_PressEsc; // 按下"返回"键时转向的状态索引号
uchar KeyTab_PressDown; // 按下"向下"键时转向的状态索引号
uchar KeyTab_PressUp; // 按下"向上"键时转向的状态索引号
void (*CurrentOperate)(); // 当前状态应该执行的功能操作
}KeyTabStruct;
void ( *KeyFuncPtr )(); // 按键功能指针
/*-----------------------------------按键架构---------------------------------*/
/*CurMenuID = 本菜单ID
MaxMenuItem = 同级菜单最大项数
OkMenuID = 子菜单层所对应的菜单ID,ID=255为菜单已经到底了
EscMenuID = 父菜单层所对应的菜单ID,ID=255为菜单已经到顶了
DownMenuID = 弟菜单层所对应的菜单ID,ID=255为菜单是独生子
UpMenuID = 兄菜单层所对应的菜单ID,ID=255为菜单是独生子
CurFunction = 本菜单所对应的菜单函数指针 */
KeyTabStruct KeyTab[]={
//CurID Max Ok Esc Down Up CurFunction
{0, 14, 1, 0, 0, 0, *Function_Port },
{1, 14, 6, 0, 2, 5, *Function_Port }, // A
{2, 14, 7, 0, 3, 4, *Function_Port }, // B
{3, 14, 8, 0, 4, 3, *Function_Port }, // C
{4, 14, 9, 0, 5, 2, *Function_Port }, // D
{5, 14, 10, 0, 1, 1, *Function_Port }, // E
{6, 14, 11, 5, 6, 10, *Function_Port }, // A1
{7, 14, 12, 5, 7, 9, *Function_Port }, // B1
{8, 14, 13, 5, 8, 8, *Function_Port }, // C1
{9, 14, 14, 5, 9, 7, *Function_Port }, //D1
{10, 14, 15, 5, 10, 6, *Function_Port }, //E1
{11, 14, 11, 10, 11, 15, *Function_Port }, //A11
{12, 14, 12, 10, 12, 14, *Function_Port }, //B11
{13, 14, 13, 10, 13, 13, *Function_Port }, //C11
{14, 14, 14, 10, 14, 12, *Function_Port }, //D11
{15, 14, 15, 10, 15, 11, *Function_Port }, // E11
};
//-----------------------------------菜单显示---------------------------------
void MenuDisp(uchar iMenuID)
{
switch(iMenuID)
{
case 0: Menu_Port0(); break;
case 1: Menu_Port1(); break;
case 2: Menu_Port2(); break;
case 3: Menu_Port3(); break;
case 4: Menu_Port4(); break;
case 5: Menu_Port5(); break;
case 6: Menu_Port6(); break;
case 7: Menu_Port7(); break;
case 8: Menu_Port8(); break;
case 9: Menu_Port9(); break;
case 10: Menu_Port10(); break;
case 11: Menu_Port11(); break;
case 12: Menu_Port12(); break;
case 13: Menu_Port13(); break;
case 14: Menu_Port13(); break;
case 15: Menu_Port13(); break;
}
}
void key_ctrl()
{
switch (key_number)
{
case 0x10:
iMenuNextID = KeyTab[iMenuID].KeyTab_PressEsc; //常规菜单处理
LcmClear(0);
break;
case 0x20: //上
iMenuNextID = KeyTab[iMenuNextID].KeyTab_PressUp;//常规菜单处理
LcmClear(0);
break;
case 0x30: //下
iMenuNextID = KeyTab[iMenuNextID].KeyTab_PressDown;//常规菜单处理
LcmClear(0);
break;
case 0x40://保存数据
break;
case 0x50: //复位
LcmClear(0); //清屏
iMenuNextID =0;
break;
case 0x60: //OK确定
iMenuNextID = KeyTab[iMenuID].KeyTab_PressOk; //常规菜单处理
LcmClear(0);
break;
case 0x70: //测试开始
break;
case 0x80://光标移动
break;
case 0x90://--------
break;
case 0xA0://++++++
break;
case 0xB0://
break;
case 0xC0:
break;
case 0xD0:
break;
case 0xE0:
break;
}
KeyFuncPtr=KeyTab[iMenuID].CurrentOperate; // 执行当前按键的操作
( * KeyFuncPtr )();
}
/*------------------------------------------------------------------------------
0ooo
ooo0 ( )
( ) ) /
\ ( (_/
\_)
-----------------------------------------------------------------------------
\_)
------------------------------------------------------------------------------*/
int main()
{
DDRA |=(1<<3); PORTA &=~(1<<3);
DDRA |=(1<<4); PORTA &=~(1<<4);
DDRA |=(1<<5); PORTA &=~(1<<5);
DDRA &=~(1<<6); PORTA |=(1<<6);//键盘
DDRA &=~(1<<7); PORTA |=(1<<7);
DDRC &=~(1<<4); PORTC |=(1<<4);//键盘
DDRC &=~(1<<5); PORTC |=(1<<5);
DDRC &=~(1<<6); PORTC |=(1<<6);
DDRC &=~(1<<7); PORTC |=(1<<7);
DDRB=0XFF; PORTB=0XfF; //液晶排线
DDRC|=0X0F; PORTC=0x0f; //液晶控制线
//中断
DDRD &=~(1<<2); PORTD |=(1<<2);
//时钟
DDRD |=(1<<3); PORTD &=~(1<<3);
DDRD |=(1<<4); PORTD &=~(1<<4);
DDRD |=(1<<5); PORTD &=~(1<<5);
//24c02
DDRD |=(1<<6); PORTD |=(1<<6);
DDRD |=(1<<7); PORTD |=(1<<7);
LcmInit(); //lcd初始化
// TCCR1B=0x03;//计时1秒
// TCNT1 = 65536-(12000000/64)*0.02;
//TIMSK |= 0b00000100;
//------------------------------------------------------
MCUCR=0X03; //MCU 控制寄存器- MCUCR
GICR=0X40; //通用中断控制寄存器- GICR
TCCR0=0x05;
TCNT0=256-1000000/1024*0.05;
TIMSK |=0x01;
sei();
//-------------------------------------------------------
while(1)
{
;
}
}
uchar time_isr;
//计时中断T1
ISR(TIMER1_OVF_vect)//计时1秒
{
TCNT1=65536-(12000000/64)*0.02;
// if (++time_isr!=5) return; time_isr=0;
time_isr--;
}
//菜单刷新显示t0中断
ISR(TIMER0_OVF_vect)
{
TCNT0=256-1000000/1024*0.05;
MenuDisp( iMenuID);
}
//键盘中断0
ISR(INT0_vect)
{
key_ctrl();
} |