程序 interface.h #define UI_GOTO_CHILD(index) /* {pUI=(index); KeyDir=GOTO_CHILD;} 移植时要实现以下函数: #define UI_GOTO_FATHER(index) LcdClrScrn(); //清屏 {pUI=(index); KeyDir=GOTO_FATHER;}
ShowARROW(SysSclt); //在某一行显示//=========================================箭头 ===============================
DisShowARROW(SysSclt); //在某一行不显//以下是各个界面的函数实现.每个函数都要在上示箭头 面声明! ShowLine(0, \在某一行显示字 符串 //空闲状态下的循环. uchar GetKey(); //按键检测函数。 void UI_Idle() 返回Key_Up Key_Down Key_Right { Key_Left static INT8U SysSclt=0; //当前选中的是哪一*/ 项 #ifndef __INTERFACE_H__ switch(Key) #define __INTERFACE_H__ { //进入菜单. #include \ case FROM_FATHER: //extern void Interface(void); case FROM_CHILD: //case GOTO_FATHER: #define GOTO_CHILD 0XFC LcdClrScrn(); #define FROM_FATHER 0XFC // 0 1 2 3 4 #define IDLE_MENU_MAX 4 #define GOTO_FATHER 0XFD //之前设置为 ShowLine(0,\0xff 不对,有问题,子界面返回时,不刷新 ShowLine(1,\#define FROM_CHILD 0XFD ShowLine(2,\ ShowLine(3,\ ShowLine(4,\
//######################################### ShowLine(7,\################# ShowARROW(SysSclt); #define INT8U unsigned char break; //箭头上移 INT8U Key; //系统按键. case Key_Up:
INT8U KeyDir = FROM_FATHER; //用来各个界面 DisShowARROW(SysSclt); 之间的切换时传递参数. if(SysSclt==0)SysSclt=IDLE_MENU_MAX; //========================================= else SysSclt--; ===================== ShowARROW(SysSclt); //系统界面函数声明区.(一定要声明!) 有几个不 break; 同的界面就有几个函数 //箭头下移 void UI_Idle(void); case Key_Down: void UI_Help(void); void UI_Time(); DisShowARROW(SysSclt); void UI_Temperature(); SysSclt++; void UI_Play(); if(SysSclt>IDLE_MENU_MAX)SysSclt=0; void UI_Set(); ShowARROW(SysSclt); void (*pUI)()=UI_Idle; //界面指针初始化为 break; IDLE函数. 函数指针 //确定 进入 子项 //pUI();为当前while()大循环下执 case Key_Right: 行的函数 #define UI_GOTO(index) {pUI=(index);} if(SysSclt == 0) //Temperature
{
UI_GOTO_CHILD(UI_Temperature); //KeyDir = GOTO_CHILD;
break; }
if(SysSclt == 1) //Time {
UI_GOTO_CHILD(UI_Time); //KeyDir = GOTO_CHILD;
break; }
if(SysSclt == 2) //Time {
UI_GOTO_CHILD(UI_Play); //KeyDir = GOTO_CHILD;
break; }
if(SysSclt == 3) //Time {
UI_GOTO_CHILD(UI_Set); //KeyDir = GOTO_CHILD;
break; }
if(SysSclt == 4) //help {
UI_GOTO_CHILD(UI_Help); //KeyDir = GOTO_CHILD;
break; }
default:break; }//switch }
void UI_Temperature() {
switch(Key) {
//进入菜单.
case FROM_FATHER: //case FROM_CHILD: LcdClrScrn();
ShowLine(0, \
ShowLine(2, \ ShowLine(4, \
//改天加DS18B20实际测一个 ShowLine(7, \ break;
case Key_Left:
UI_GOTO_FATHER(UI_Idle);
break;
default:break; }//switch }
void UI_Time() {
switch(Key) {
//进入菜单.
case FROM_FATHER: //case FROM_CHILD: LcdClrScrn();
ShowLine(0, \ ShowLine(2, \
ShowLine(4, \ ShowLine(7, \ break;
case Key_Left:
UI_GOTO_FATHER(UI_Idle);
break;
default:break; }//switch }
void UI_Play() {
switch(Key) {
//进入菜单.
case FROM_FATHER: //case FROM_CHILD: LcdClrScrn();
ShowLine(0, \ ShowLine(1, \ ShowLine(2, \
ShowLine(4, \ ShowLine(7, \ break;
case Key_Left:
UI_GOTO_FATHER(UI_Idle);
break;
default:break; }//switch }
void UI_Set() {
switch(Key) {
//进入菜单.
case FROM_FATHER: //case FROM_CHILD: LcdClrScrn();
ShowLine(0, \
ShowLine(7, \ break;
case Key_Left:
UI_GOTO_FATHER(UI_Idle);
break;
default:break; }//switch }
void UI_Help() {
switch(Key) {
//进入菜单.
case FROM_FATHER: //case FROM_CHILD: LcdClrScrn();
ShowLine(0, \ ShowLine(2, \ ShowLine(4, \ ShowLine(7, \ break;
case Key_Left:
UI_GOTO_FATHER(UI_Idle);
break;
default:break; }//switch }
//系统的大循环.
void Interface(void) { //===============================================
//以下为按键的处理. Key = GetKey();
if(KeyDir!=0) //KeyDir=GOTO_CHILD or KeyDir=GOTO_FATHER;
{//建立一种传递信息的变量. Key = KeyDir; KeyDir = 0; }
//===============================================
//以下为界面的相互调用 pUI(); }
#endif
========================================================================
==========================================================================
#############################################################################
#############################################################################
#ifndef __KEY_H__ #define __KEY_H__
#define Key_Up 0x11 #define Key_Down 0x12 #define Key_Left 0x13 #define Key_Right 0x14 //uchar Key_Scan();
void delay_ms(unsigned int t) {
unsigned int i,j; for(i=0;i for(j=0;j<1141;j++); } unsigned char Key_Scan() { unsigned char key; DDRA|=0X0f; //输出 PORTA|=0Xff; //上拉 DDRA&=~0X0f; //输入 if(PINA==0xfe) { delay_ms(10); if(PINA==0xfe) { while(PINA==0xfe); //等待松手 return Key_Up; } } if(PINA==0xfd) { delay_ms(10); if(PINA==0xfd) { while(PINA==0xfd); return Key_Down; } } if(PINA==0xfb) { delay_ms(10); if(PINA==0xfb) { while(PINA==0xfb); return Key_Left; } } if(PINA==0xf7) { delay_ms(10); if(PINA==0xf7) { while(PINA==0xf7); return Key_Right; } } return 0;//没有键按下返回0 } unsigned char GetKey() { return Key_Scan(); } #endif ==================================================== ##################################################### ####################################################### -=============================================================== #ifndef __PG12864_H__ #define __PG12864_H__ #include #define uchar unsigned char #define uint unsigned int #define WR_L() PORTD&=~(1) #define WR_H() PORTD|=(1) #define RD_L() PORTD&=~(1<<1) #define RD_H() PORTD|=(1<<1) #define CE_L() PORTD&=~(1<<2) #define CE_H() PORTD|=(1<<2) #define CD_L() PORTD&=~(1<<3) #define CD_H() PORTD|=(1<<3) #define RST_L() PORTD&=~(1<<4) #define RST_H() PORTD|=(1<<4) void delay(uint t); uchar read_status() { uchar status; DDRB=0;//端口b置为输入 RD_L(); WR_H(); CE_L(); CD_H(); status=PINB; return status; } void check_status() { uchar s; DDRB=0XFF;//端口b置为输出 while((s&0x03)!=0x03) s=read_status();//等待位1,2置为。命令读写准备好。数据读写准备好 } //void init_txt_12864(); void write_data(uchar data); void write_cmd1(uchar cmd); void write_cmd2(uchar data,uchar cmd); void write_cmd3(uchar data1,uchar data2,uchar cmd); //uchar read_status(); for(i=0;i<16;i++) //void clear_screen(); void display_char(uchar x,uchar y,uchar ch); { //void init_graphic_12864(); write_cmd3(((j/2)<<4)|(y*2),x,0x24);//地//void display_HZ(uchar x,uchar y,uchar *hz); 址指针设置..低地址,高地址,命令 ////x 0-3 y 0-7 //void display_string(uchar x,uchar y,uchar write_cmd2(hz[j++],0xc0); *s); write_cmd2(hz[j++],0xc0); /* int main() } { } uchar i,j=0; //处在x y处显示ch init_txt_12864(); void display_char(uchar x,uchar y, uchar display_string(0,0,ch); ch)//x 0-7 y 0-15 { delay(100); write_cmd3((((x*2)<<4)+y),0x00,0x24);//地址 clear_screen(); 指针位置 write_cmd2(ch-32,0xc0);//t6963c字符表与 ASCII差32@@@@@@@@@@@@@@@@ init_graphic_12864(); } void display_string(uchar x,uchar y, uchar *s) { uchar i=0; for(i=0;i<15;i++) while(*s) if(i>=8) { display_HZ(1,i-8,HZ2[i]); display_char( x, y+(i++),*s); else s++; display_HZ(0,i,HZ2[i]); if(i>=16) { x++; i=0; while(1); } } //{//调整文本区首地址,可以实现移屏; } ////i++; void delay(uint t) // write_cmd3(i++,0,0x40);//文本区首地址; { // delay(10000); uint i,j; //} for(i=0;i