?? z12864.c
字號:
//[字符圖象輸出文件=hzk.c]
//[字體名稱=宋體]
//[字體大小=16]
//[字節方向=垂直]
//[字位順序=從低到高]
#include <reg51.h>
#include <math.h>
#include <hzk.c>
#define UP 0xfe
#define DOWN 0xfd
#define LEFT 0xfb
#define RIGHT 0xf7
#define ESC 0xdf
#define ENTER 0xef
#define BLACK 1
#define WHITE 0
#define MENU_BACK_COLOR WHITE //定義菜單系統當中的背景色
#define MENU_FONT_COLOR BLACK //定義菜單系統當中的文字色
#define MENU_SELE_COLOR BLACK//定義菜單系統當中被選擇的菜單項背景色
#define MENU_SELF_COLOR WHITE //定義菜單系統當中被選擇的菜單項文字色
#define Y_WIDTH_MENU 16
#define Dis_Menu_Num 4
#define Dis_X_MAX 127
#define Dis_Y_MAX 64
#define Key P1
unsigned char First_Index_old=0xff ;
unsigned char y_Index_old=0xff ;
code unsigned char Menu_String01[]={"繪點"};
code unsigned char Menu_String02[]={"繪直線"};
code unsigned char Menu_String03[]={"繪矩形"};
code unsigned char Menu_String04[]={"字符顯示"};
code unsigned char Menu_String05[]={"幫助"};
code unsigned char Menu_String06[]={"單個西文字符"};
code unsigned char Menu_String07[]={"西文字符串"};
code unsigned char Menu_String08[]={"中文字符"};
code unsigned char Menu_String09[]={"返回"};
code unsigned char Menu_List01_Config[]={5};
code unsigned char Menu_List02_Config[]={4};
code unsigned char *Menu_List01[]=//
{
(unsigned char *)Menu_List01_Config,
(unsigned char *)Menu_String01,
(unsigned char *)Menu_String02,
(unsigned char *)Menu_String03,
(unsigned char *)Menu_String04,
(unsigned char *)Menu_String05
};
code unsigned char *Menu_List02[]=//
{
(unsigned char *)Menu_List02_Config,
(unsigned char *)Menu_String06,
(unsigned char *)Menu_String07,
(unsigned char *)Menu_String08,
(unsigned char *)Menu_String09
};
unsigned char data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask;
unsigned char code LeftMask[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80};
unsigned char code RightMask[]={0xff,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f};
unsigned char code Mask1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code Mask2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//前兩位由5個口線決定,見SMG12864說明書 基本操作時序
//Epin—p2.7 R/W—p2.1 cs1—p2.3 cs2—p2.2 RS—p2.0
unsigned char xdata Lcd_Chip1_Cmd_W_Reg _at_ 0x8800;
unsigned char xdata Lcd_Chip2_Cmd_W_Reg _at_ 0x8400;
unsigned char xdata Lcd_Chip1_Data_W_Reg _at_ 0x8900;
unsigned char xdata Lcd_Chip2_Data_W_Reg _at_ 0x8500;
unsigned char xdata Lcd_Chip1_Data_R_Reg _at_ 0x8b00;
unsigned char xdata Lcd_Chip2_Data_R_Reg _at_ 0x8700;
unsigned char xdata Lcd_Chip1_Sta_R_Reg _at_ 0x8a00;
unsigned char xdata Lcd_Chip2_Sta_R_Reg _at_ 0x8600;
#define LCD_CMD_COL 0x40
#define LCD_CMD_PAGE 0xB8
#define LCD_CMD_ON 0x3F
#define LCD_CMD_OFF 0x3E
#define LCD_CMD_STARTLINE 0xC0
#define LCD_LEFT 0
#define LCD_TOP 0
#define LCD_RIGHT 127
#define LCD_BOTTOM 63
//延時子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//片1測忙
void lcdwaitidle1(void)
{ while(((Lcd_Chip1_Sta_R_Reg)&0x80)==0x80);
}
//片2測忙
void lcdwaitidle2(void)
{ while(((Lcd_Chip2_Sta_R_Reg)&0x80)==0x80);
}
//寫指令代碼到片1
void lcdwc1(unsigned char cmdcode)
{ lcdwaitidle1();
Lcd_Chip1_Cmd_W_Reg=cmdcode;
}
//寫指令代碼到片2
void lcdwc2(unsigned char cmdcode)
{ lcdwaitidle2();
Lcd_Chip2_Cmd_W_Reg=cmdcode;
}
//寫數據到片1
void lcdwd1(unsigned char dispdata)
{ lcdwaitidle1();
Lcd_Chip1_Data_W_Reg=dispdata;
}
//寫數據到片2
void lcdwd2(unsigned char dispdata)
{ lcdwaitidle2();
Lcd_Chip2_Data_W_Reg=dispdata;
}
//讀片1數據
unsigned char lcdrd1(void)
{ lcdwaitidle1();
return Lcd_Chip1_Data_R_Reg;
}
//讀片2數據
unsigned char lcdrd2(void)
{ lcdwaitidle2();
return Lcd_Chip2_Data_R_Reg;
}
//寫指令代碼
void lcdwc(unsigned char cmdcode)
{ if((Lcd_CurrentX)<0x40)
lcdwc1(cmdcode);
else
lcdwc2(cmdcode);
}
//寫數據
void lcdwd(unsigned char dispdata)
{ if(Lcd_CurrentX<64)
lcdwd1(dispdata);
else
lcdwd2(dispdata);
}
//內部數據地址指針定位
void lcdpos(void)
{ lcdwc(LCD_CMD_COL|(Lcd_CurrentX&0x3f)); //設置地址列指針
lcdwc(LCD_CMD_PAGE|((Lcd_CurrentY/8)&0x7)); //設置地址頁指針
}
//讀數據
unsigned char lcdrd(void)
{ unsigned char i;
lcdpos();
if(Lcd_CurrentX<64)
{ i=lcdrd1();
i=lcdrd1(); //讀兩次
}
else
{ i=lcdrd2();
i=lcdrd2();
}
lcdpos();
return i;
}
//當前坐標移動到下一個點
void lcdcursornext(void)
{ Lcd_CurrentX++;
if(Lcd_CurrentX>LCD_RIGHT)
{ Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=8;
if(Lcd_CurrentY>LCD_BOTTOM)
Lcd_CurrentY=LCD_TOP;
}
}
void displaybyte(unsigned char dispdata)
{ lcdpos(); //內部數據地址指針定位
lcdwd(dispdata); //寫數據
lcdcursornext(); //當前坐標移動到下一個點
}
//整屏顯示
void lcdfill(unsigned char FillData)
{ for(Lcd_CurrentX=LCD_LEFT,Lcd_CurrentY=LCD_TOP;1;)
{ displaybyte(FillData);
if((Lcd_CurrentX==LCD_LEFT)&&(Lcd_CurrentY==LCD_TOP))
break;
}
}
/*//填充矩形
void rectfill(signed char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char FillData)
{ for(Lcd_CurrentX=x0,Lcd_CurrentY=y0;1;)
{ displaybyte( FillData);
if((Lcd_CurrentX==x1)&&(Lcd_CurrentY==y1))
break;
}
}
*/
#include <display.c>
#include <point.c>
//=====================================================================//
//函數:void UpDate_Menu(unsigned char First_Index,unsigned char Menu_Index, unsigned char ** Menu_List)
//描述:刷新整屏菜單顯示函數
//參數:First_Index 當面顯示頁的第一條菜單號
// Menu_Index 當前處于選用的菜單項
// Menu_List 菜單資源鏈表指針
//返回:無
//注意:無
//=====================================================================//
void UpDate_Menu(unsigned char First_Index,unsigned char Menu_Index,unsigned char** Menu_List)
{
unsigned int y_width,y_Index;
unsigned char List_Num,i,x;
List_Num = (unsigned int)**Menu_List;
y_width = Y_WIDTH_MENU;
y_Index = 0;
while(First_Index>List_Num) First_Index = List_Num;
if(List_Num>Dis_Menu_Num) List_Num = Dis_Menu_Num;
if(First_Index_old!=First_Index)
{
lcdfill(WHITE); //清屏
if(y_Index_old==0xff)
{
rectfill(0,0,Dis_X_MAX, y_width-1,MENU_SELE_COLOR);
i=First_Index+1;
put_str_xy(x,y_Index,(unsigned char *)Menu_List[i++],MENU_FONT_COLOR);
y_Index = y_Index+Y_WIDTH_MENU;
for(;i<List_Num+1;i++)
{
put_str_xy(x,y_Index,(unsigned char *)Menu_List[i],MENU_SELF_COLOR) ;
y_Index = y_Index+Y_WIDTH_MENU;
}
}
else
{
y_Index_old = Menu_Index-First_Index;
rectfill(0,y_Index_old*Y_WIDTH_MENU,Dis_X_MAX,
y_Index_old*Y_WIDTH_MENU+Y_WIDTH_MENU-1,WHITE);
i=First_Index+1;
while(List_Num)
{
if((i-1)==Menu_Index) put_str_xy(x,y_Index,(unsigned char *)Menu_List[i],MENU_FONT_COLOR);
else put_str_xy(x,y_Index,(unsigned char *)Menu_List[i],MENU_SELF_COLOR);
y_Index = y_Index+Y_WIDTH_MENU;
i++;
List_Num--;
}
}
First_Index_old = First_Index;
}
else
{
y_Index = y_Index_old-First_Index_old;
y_Index = y_Index*Y_WIDTH_MENU;
rectfill(0,y_Index,Dis_X_MAX, y_Index+Y_WIDTH_MENU-1,MENU_BACK_COLOR);
put_str_xy(x,y_Index,(unsigned char *)Menu_List[y_Index_old+1],MENU_SELF_COLOR);
y_Index = Menu_Index-First_Index;
y_Index = y_Index*Y_WIDTH_MENU;
rectfill(0, y_Index,Dis_X_MAX, y_Index+Y_WIDTH_MENU-1,MENU_SELE_COLOR);
put_str_xy(x,y_Index,(unsigned char *)Menu_List[Menu_Index+1],MENU_FONT_COLOR);
}
y_Index_old = Menu_Index;
}
//=====================================================================//
void Redraw_Menu(unsigned char First_Index,unsigned char Menu_Index,unsigned char** Menu_List)
{
// unsigned char *Menu_Config;
//First_Index_old=0xff;
UpDate_Menu(First_Index,Menu_Index,Menu_List);
}
//=====================================================================//
//初始化
void lcdreset()
{ lcdwc1(LCD_CMD_ON);
lcdwc2(LCD_CMD_ON); //開顯示
lcdwc1(LCD_CMD_STARTLINE);
lcdwc2(LCD_CMD_STARTLINE); //設置顯示初始行
}
//初始化菜單
void Init_Menu (unsigned char* Menu_List)
{
UpDate_Menu(0,0,Menu_List);
}
//=====================================================================//
//函數:unsigned char GetMLNum(unsigned char ** Menu_List)
//描述:獲取菜單資源的菜單項個數函數
//參數: Menu_List 菜單資源鏈表指針
//返回:菜單項個數
//注意:無
//=====================================================================//
unsigned char GetMLNum(unsigned char **Menu_List)
{
unsigned char uiTemp;
uiTemp = (unsigned char)**Menu_List;
return uiTemp-1;
}
//=====================================================================//
//函數:unsigned char GetMLiNum_Page(unsigned char ** Menu_List)
//描述:獲取菜單資源在一屏可以顯示的菜單項個數函數
//參數: Menu_List 菜單資源鏈表指針
//返回:菜單項個數
//注意:無
//===================================================== //
unsigned char GetMLiNum_Page(unsigned char** Menu_List)
{
unsigned char uiTemp;
unsigned char *Menu_Config;
Menu_Config = (unsigned char *)(Menu_List[0]);
uiTemp = *(Menu_Config+3);
uiTemp = (Dis_Y_MAX+1)/uiTemp; //
return uiTemp;
}
void Show_DotTest()
{
unsigned char i;
lcdfill(WHITE);
for(i=0;i<100;i++)
{
pointxy(i*3,i*i,1);
}
}
void Show_LineTest()
{
unsigned char uikey,key_flag;
lcdfill(WHITE);
for(i=1;i<10;i++)
{
linexy(0,0,100,11*i,1);
}
}
void Show_RectangleTest()
{
unsigned char i;
lcdfill(WHITE);
for(i=1;i<40;i++)
{
rect(i,i,i*2,i*2,1);
}
}
/* void Show_HelpTest();
{
put_str_xy(0,0,)
}
*/
main()
{
unsigned char uiKey=0;
unsigned char Item_Num,Update_Flag,Enter_Flag=0;
unsigned char PageItem_Num;
unsigned char First_Index=0,Active_Index=0,Temp_Index=0;
// Key_Initial(); //鍵盤掃描初始化(端口)
// LCD_Init(); //初始化LCD
Item_Num = GetMLNum(Menu_List01); //獲取要顯示的菜單的菜單項個數
PageItem_Num = GetMLiNum_Page((unsigned char **)Menu_List01);//獲取顯示的菜單的頁數
Init_Menu((unsigned char**)Menu_List01);
while(1)
{
uiKey = Key; //獲取鍵值
if(uiKey) //如有鍵按下則響應
{
switch(uiKey) //判斷鍵值進行分支控制界面
{
case ENTER: //確定鍵按下
Enter_Flag=1; //enter flag set
break;
case DOWN: //down 向下鍵按下
if(Active_Index<Item_Num)
{
Active_Index++;
if(Temp_Index<PageItem_Num-1) Temp_Index++;
else if(First_Index<Item_Num) First_Index++;
Update_Flag = 1;
}
break;
case UP: //up 向上鍵按下
if(Active_Index>0)
{
Active_Index--;
if(Temp_Index>0) Temp_Index--;
else if(First_Index>0) First_Index--;
Update_Flag = 1;
}
break;
default:break;
}
}
if(Update_Flag) //Update_Flag 為1時刷新菜單
{
UpDate_Menu(First_Index,Active_Index,(unsigned char**)Menu_List01);
Update_Flag=0;
}
if(Enter_Flag) //有確定鍵按下時,則進入相應的功能函數
{
Enter_Flag = 0;
switch(Active_Index)
{
case 0: //”繪點”菜單項
Show_DotTest();
Redraw_Menu(First_Index,Active_Index,(unsigned char**)Menu_List01);
Update_Flag = 1;
break;
case 1: //”繪直線”菜單項
Show_LineTest();
Redraw_Menu(First_Index,Active_Index,(unsigned char**)Menu_List01);
Update_Flag = 1;
break;
case 2: //”繪矩形”菜單項
Show_RectangleTest();
Redraw_Menu(First_Index,Active_Index,(unsigned char**)Menu_List01);
Update_Flag = 1;
break;
case 3: //進入二級菜單
// CharTest_Menu();
Redraw_Menu(First_Index,Active_Index,(unsigned char**)Menu_List01);
Update_Flag = 1;
break;
case 4: //”幫助”菜單項
Show_HelpTest();
Redraw_Menu(First_Index,Active_Index,(unsigned char**)Menu_List01);
Update_Flag = 1;
break;
default:break;
}
}
// KeyScan_Service(); //鍵盤掃描的服務程序,最好在1KHz的定時/時基中斷調用
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -