亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lm3033basicserialoperation.c

?? 主要是用430單片機的一些程序
?? C
字號:
#include "Lm3033BasicOperation.h"
struct MenuStruct *nowmenupt;
void LcdWriteOneLineString(unsigned char row,unsigned char col,unsigned char* p);
void LcdClearScreen(void)  ;                   //清屏
BYTE menu1[4][17]={
"1 進入menu1_1  ",
"2 進入menu1_2  ",
"3 進入menu1_3",
"  null "
};
MenuStruct menu1struct;

BYTE menu1_1[4][17]={
"1 進入menu1_1_1  ",
"2 進入menu1_1_2  ",
"process1",
"null"
};

MenuStruct menu1_1struct;

BYTE menu1_2[4][17]={
"process2 ",
"process3 ",
"process4",
" null"
};
MenuStruct menu1_2struct;


BYTE menu1_3[4][17]={
"menu1_3 ",
"menu1_3 ",
"process5",
"null"
};
MenuStruct menu1_3struct;

BYTE menu1_1_1[4][17]={
"process7 ",
"process8",
"null",
"null"
};

struct MenuStruct menu1_1_1struct;

BYTE menu1_1_2[4][17]={
"  null",
"  null ",
"process6",
"  null"
};

struct MenuStruct menu1_1_2struct;

/****以下函數用于菜單測試***********************/
void Process1(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process1 running");
}

void Process2(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process2 running");
}

void Process3(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process3 running");
}

void Process4(void)
{

 LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process4 running");
}

void Process5(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process5 running");
}

void Process6(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process6 running");
}

void Process7(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process7 running");
}

void Process8(void)
{
LcdClearScreen();
 LcdWriteOneLineString(1,1,"Process8 running");
}
void MenuInit(void)    //初始發菜單
{
 nowmenupt=&menu1struct;
 
 menu1struct.menusize=4;
 menu1struct.menuconcentpt=menu1[0];
 menu1struct.premenupt=NULL;
 menu1struct.nextmenupt[0]=&menu1_1struct;
 menu1struct.nextmenupt[1]=&menu1_2struct;
 menu1struct.nextmenupt[2]=&menu1_3struct;
 menu1struct.nextmenupt[3]=NULL;
 menu1struct.funpt[0]=NULL;
 menu1struct.funpt[1]=NULL;
 menu1struct.funpt[2]=NULL;
 menu1struct.funpt[3]=NULL;
 
 menu1_1struct.menusize=4;
 menu1_1struct.menuconcentpt=menu1_1[0];
 menu1_1struct.premenupt=&menu1struct;
 menu1_1struct.nextmenupt[0]=&menu1_1_1struct;
 menu1_1struct.nextmenupt[1]=&menu1_1_2struct;
 menu1_1struct.nextmenupt[2]=NULL;
 menu1_1struct.nextmenupt[3]=NULL;
 menu1_1struct.funpt[0]=NULL;
 menu1_1struct.funpt[1]=NULL;
 menu1_1struct.funpt[2]=Process1;
 menu1_1struct.funpt[3]=NULL;

 

 menu1_2struct.menusize=4;
 menu1_2struct.menuconcentpt=menu1_2[0];
 menu1_2struct.premenupt=&menu1struct;
 menu1_2struct.nextmenupt[0]=NULL;
 menu1_2struct.nextmenupt[1]=NULL;
 menu1_2struct.nextmenupt[2]=NULL;
 menu1_2struct.nextmenupt[3]=NULL;
 menu1_2struct.funpt[0]=Process2;
 menu1_2struct.funpt[1]=Process3;
 menu1_2struct.funpt[2]=Process4;
 menu1_2struct.funpt[3]=NULL;
 
 
 menu1_3struct.menusize=4;
 menu1_3struct.menuconcentpt=menu1_3[0];
 menu1_3struct.premenupt=&menu1struct;
 menu1_3struct.nextmenupt[0]=NULL;
 menu1_3struct.nextmenupt[1]=NULL;
 menu1_3struct.nextmenupt[2]=NULL;
 menu1_3struct.nextmenupt[3]=NULL;
 menu1_3struct.funpt[0]=NULL;
 menu1_3struct.funpt[1]=NULL;
 menu1_3struct.funpt[2]=Process5;
 menu1_3struct.funpt[3]=NULL;

 
 menu1_1_1struct.menusize=4;
 menu1_1_1struct.menuconcentpt=menu1_1_1[0];
 menu1_1_1struct.premenupt=&menu1_1struct;
 menu1_1_1struct.nextmenupt[0]=NULL;
 menu1_1_1struct.nextmenupt[1]=NULL;
 menu1_1_1struct.nextmenupt[2]=NULL;
 menu1_1_1struct.nextmenupt[3]=NULL;
 menu1_1_1struct.funpt[0]=Process7;
 menu1_1_1struct.funpt[1]=Process8;
 menu1_1_1struct.funpt[2]=NULL;
 menu1_1_1struct.funpt[3]=NULL;
 
 menu1_1_2struct.menusize=4;
 menu1_1_2struct.menuconcentpt=menu1_1_2[0];
 menu1_1_2struct.premenupt=&menu1_1struct;
 menu1_1_2struct.nextmenupt[0]=NULL;
 menu1_1_2struct.nextmenupt[1]=NULL;
 menu1_1_2struct.nextmenupt[2]=NULL;
 menu1_1_2struct.nextmenupt[3]=NULL;
 menu1_1_2struct.funpt[0]=NULL;
 menu1_1_2struct.funpt[1]=NULL;
 menu1_1_2struct.funpt[2]=Process6;
 menu1_1_2struct.funpt[3]=NULL;
 
}


 
/*void LcdModeSel(unsigned int mode)            //LCD 串并行模式選擇
{
 if(mode==SERIALMODE)
     {
      LcdSerialModSel_ ;
      LcdModeFlag=SERIALMODE;
     }
 else
     {
      LcdParallelModSel_;
      LcdModeFlag=PARALLELMODE;
     }
}*/

void LcdDelay(int i)                          //等待LCD處理指令
{
 int j=0xff;
 for(;i>0;i--)
   for(;j>0;j--);
}

void LcdSMWrite1ByteData(unsigned char data)  //LCD串行模式寫一個字節數據
{ 
  unsigned int i=0;
  //LcdEnable;
  LcdSID_H;          //發送5個1
  for(i=5;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  LcdSID_L;         //發送1個0
  LcdClock_L;
  LcdClock_H;
  LcdSID_H;         //發送1個1   RS=1
  LcdClock_L;
  LcdClock_H;
  LcdSID_L;         //發送1個0
  LcdClock_L;
  LcdClock_H;
  
  for(i=4;i>0;i--)  //發送高4位
  {
   if(data&0x80)
      {LcdSID_H;LcdClock_L; LcdClock_H;}
   else
      {LcdSID_L;LcdClock_L; LcdClock_H;}
   data=data<<1;
  }
  LcdSID_L;         //發送4個0
  for(i=4;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  for(i=4;i>0;i--)  //發送低4位
  {
   if(data&0x80)
      {LcdSID_H;LcdClock_L; LcdClock_H;}
   else
      {LcdSID_L;LcdClock_L; LcdClock_H;}
   data=data<<1;
  }
  LcdSID_L;         //發送4個0
  for(i=4;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  //LcdDisable;
  LcdClock_L;
}

void LcdSMWrite1ByteInstruc(unsigned char data)  //LCD串行模式寫一個字節指令
{ 
  unsigned int i=0;
  //LcdEnable;
  LcdSID_H;          //發送5個1
  for(i=5;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  LcdSID_L;         //發送3個0
  for(i=3;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  for(i=4;i>0;i--)  //發送高4位
  {
   if(data&0x80)
      {LcdSID_H;LcdClock_L; LcdClock_H;}
   else
      {LcdSID_L;LcdClock_L; LcdClock_H;}
   data=data<<1;
  }
  LcdSID_L;         //發送4個0
  for(i=4;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  for(i=4;i>0;i--)  //發送低4位
  {
   if(data&0x80)
      {LcdSID_H;LcdClock_L; LcdClock_H;}
   else
      {LcdSID_L;LcdClock_L; LcdClock_H;}
   data=data<<1;
  }
  LcdSID_L;         //發送4個0
  for(i=4;i>0;i--)
  { 
    LcdClock_L;
    LcdClock_H;
  }
  //LcdDisable;
  LcdClock_L;
}

/*
void ResetLCD(void)  //LCD 復位
{ 
 LcdRest;
}
*/


void LcdClearScreen(void)                     //清屏
{
  LcdSMWrite1ByteInstruc(CLEAR);
  LcdDelay(1200); 

}

void LcdAddrReset(void)                       //address count 寄存器復位為0
{
 LcdSMWrite1ByteInstruc(HOME); 
}

void LcdAddrInc(void)                        //address count 每次遞增1,光標右移
{
 LcdSMWrite1ByteInstruc(AC_INC); 
}

void LcdAddrDec(void)                       //address count 每次遞減1,光標左移
{
 LcdSMWrite1ByteInstruc(AC_DEC); 
}

void LcdDisplayMode(unsigned int is_on)     //LCD顯示模式:是否顯示,光標是否顯示與閃爍
{
 LcdSMWrite1ByteInstruc(is_on); 
}

void LcdCursorDisplayMode(unsigned int is_on)  //?????????????????????????
{
 LcdSMWrite1ByteInstruc(is_on); 
}

void LcdFunSet(unsigned int mode)           //設置是用基本還是擴展指令,是8bit還是4bit輸入
{
 LcdSMWrite1ByteInstruc(mode); 
}

void LcdCGRAMAddrSet(unsigned int address)  //設置用戶自定義漢字數據地址
{
 LcdSMWrite1ByteInstruc(CGRAM_ADDR+address); 
}

void LcdDDRAMAddrSet(unsigned int address)  //設置顯示數據的地址
{
 LcdSMWrite1ByteInstruc(CGRAM_ADDR+address); 
}

/*void IniLCD(void)  //初始化LCD
{
 LcdClearScreen();
}*/

//設置顯示開始的位置,共4行(1--4),8列(1--8),第一個參數為行數,第二個為列數。
void LcdSetDDRAMADDR(unsigned char row,unsigned char col)
{
 switch(row)
 {
  case 1:LcdSMWrite1ByteInstruc(0x80+col-1);break;
  case 2:LcdSMWrite1ByteInstruc(0x90+col-1);break;
  case 3:LcdSMWrite1ByteInstruc(0x80+col+7);break;
  case 4:LcdSMWrite1ByteInstruc(0x90+col+7);break;
  default:break;
 }
}
 
//在指定的位置顯示一行字符,超過一行的將截止(不顯示),
void LcdWriteOneLineString(unsigned char row,unsigned char col,unsigned char* p)
{
 unsigned char i;
 i=col+col;
 LcdSetDDRAMADDR(row,col);
 while((*p)&&i<18)
 {
  LcdSMWrite1ByteData(*p);
  p++;
  i++;
 }
}

void LcdBasicFunctionSelect(void)                    //使用基本指令
{
  LcdSMWrite1ByteInstruc(0x30);
}


void LcdExtendFunctionSelect(void)                  //使用擴展指令
{
  LcdSMWrite1ByteInstruc(FUNCTION_SET+EIGHT_INTER+EX_INSTRUCTION);
}

void LcdReverse(unsigned char row)                 //隔行反顯,為0反顯1  3行,為1反顯2  4行
{
 LcdSMWrite1ByteInstruc(0x04+row);
}

void LcdGraphicsDisplaySelect(void)                 //選擇顯示圖形
{
 LcdSMWrite1ByteInstruc(0x36);
}

void LcdSetGDRAMADDR(unsigned char x,unsigned char y)//設置圖形顯示的地址
{
 if(y<32)
  {
   LcdSMWrite1ByteInstruc(0x80+y);
   LcdSMWrite1ByteInstruc(0x80+x);
  }
 else
  {
   LcdSMWrite1ByteInstruc(0x80+y-32);
   LcdSMWrite1ByteInstruc(0x80+x+8);
  }
}

void LcdWriteDataToGDRAM(unsigned char data)       //向圖形顯示RAM區寫數據
{
 LcdSMWrite1ByteData(data);
}

void LcdClearGDRAM(void)                            //清楚GDRAM內的內容
{
 unsigned char x,y;
 for(x=0;x<8;x++)
    for(y=0;y<64;y++)
      {
       LcdSetGDRAMADDR( x, y);
       LcdSMWrite1ByteData(0);
       LcdSMWrite1ByteData(0);
      }
}

void LcdDisplayOnePage(const unsigned char *p)     //在圖形顯示模式下顯示一屏
{
 int i,j=0;
  for(i=0;i<64;i++)
  {
   for(j=0;j<8;j++)
    {LcdSetGDRAMADDR(j,i);
     LcdSMWrite1ByteData(*p++);
     LcdSMWrite1ByteData(*p++);
    }
    j=0;
  }
}


//在指定的位置顯示一個整數,超過一行的將截止(不顯示),
void LcdDisplayInteger(unsigned char row,unsigned char col,unsigned long value)
{
 unsigned char number[11],temp[11];
 unsigned j;
 int i;
 j=0;
 for(i=0;i<11;i++)
   {
    temp[i]=value%10;
    value=value/10;
    if(value==0)
        {
         number[i+1]='\0';
         for(j=0;i>-1;i--)
              {
               number[j++]=temp[i]+48;
              }
         i=100;
        }
    }
 LcdWriteOneLineString( row, col,number);
}

void LcdWriteOneChar(unsigned char data)//在當前位置顯示一個字符
{
 static  unsigned char count=0;
 switch(count)
 {
  case 0:LcdSetDDRAMADDR(1,1);break;
  case 16:LcdSetDDRAMADDR(2,1);break;
  case 32:LcdSetDDRAMADDR(3,1);break;
  case 48:LcdSetDDRAMADDR(4,1);break;
  default:break;
 }
  LcdSMWrite1ByteData(data);
  count++;
  if(count==64)
    count=0;
}

void ShowMenu(BYTE max,BYTE *pt) //顯示下一級菜單
{
  BYTE index=0;
  LcdClearScreen();
  for(;index<max;index++)
     LcdWriteOneLineString(index+1,1,pt+index*17);
}



void MenuKeyProcess(BYTE key)//菜單按鍵處理函數
{
    switch(key)
  {
    case 0x01:if((*nowmenupt).premenupt==NULL);
              else
               { nowmenupt=(*nowmenupt).premenupt ;
                ShowMenu((*nowmenupt).menusize,(*nowmenupt).menuconcentpt);
               } break;
    case 0x02:if(((*nowmenupt).nextmenupt[0]==NULL)&&((*nowmenupt).funpt[0]==NULL)) break;
              else if((*nowmenupt).funpt[0]==NULL) 
               { 
                nowmenupt=(*nowmenupt).nextmenupt[0];
                ShowMenu((*nowmenupt).menusize,(*nowmenupt).menuconcentpt);
               } 
                else 
                     (*nowmenupt).funpt[0]();
              break;
    case 0x04:if(((*nowmenupt).nextmenupt[1]==NULL)&&((*nowmenupt).funpt[1]==NULL)) break;
              else if((*nowmenupt).funpt[1]==NULL) 
               { 
                nowmenupt=(*nowmenupt).nextmenupt[1];
                ShowMenu((*nowmenupt).menusize,(*nowmenupt).menuconcentpt);
               } 
                else 
                     (*nowmenupt).funpt[1]();
              break;
    case 0x08:if(((*nowmenupt).nextmenupt[2]==NULL)&&((*nowmenupt).funpt[2]==NULL)) break;
              else if((*nowmenupt).funpt[2]==NULL) 
               { 
                nowmenupt=(*nowmenupt).nextmenupt[2];
                ShowMenu((*nowmenupt).menusize,(*nowmenupt).menuconcentpt);
               } 
                else 
                     (*nowmenupt).funpt[2]();
              break;
     case 0x10:if(((*nowmenupt).nextmenupt[3]==NULL)&&((*nowmenupt).funpt[3]==NULL)) break;
              else if((*nowmenupt).funpt[3]==NULL) 
               { 
                nowmenupt=(*nowmenupt).nextmenupt[3];
                ShowMenu((*nowmenupt).menusize,(*nowmenupt).menuconcentpt);
               } 
                else 
                     (*nowmenupt).funpt[3]();
              break;
    default:_NOP();
  }
}


void InitLCD(void)//初始化液晶
{

 P3DIR|=0x30;                      //P3.4 5口為輸出
 MenuInit();    //初始發菜單
 LcdBasicFunctionSelect();                  
 LcdDisplayMode(DISPLAY_CTL+DISPLAY_ON);// 
 LcdAddrReset();
 LcdClearScreen();
 //ShowMenu((*nowmenupt).menusize,(*nowmenupt).menuconcentpt);
 //LcdWriteOneLineString(1,1,"電子科技大學");
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品第一页| 丁香婷婷综合网| 国产一区二区看久久| 色哟哟欧美精品| 精品久久久久久亚洲综合网| 亚洲精品亚洲人成人网| 激情文学综合网| 欧美撒尿777hd撒尿| 亚洲国产精品av| 久久精品国产色蜜蜜麻豆| 欧美三级视频在线观看| 国产精品久久精品日日| 国产又黄又大久久| 日韩一级大片在线| 亚洲国产aⅴ天堂久久| 97精品国产露脸对白| www久久精品| 日韩1区2区3区| 欧美日韩电影在线| 亚洲国产日产av| 欧美专区日韩专区| 最新高清无码专区| 成人精品一区二区三区中文字幕 | 国产老肥熟一区二区三区| 欧美视频你懂的| 夜夜嗨av一区二区三区网页 | 最新国产成人在线观看| 国产精品一区二区久久精品爱涩 | 国内外精品视频| 精品久久久久99| 精品一区二区三区免费| 日韩精品影音先锋| 免费一级欧美片在线观看| 欧美老女人第四色| 亚洲成人第一页| 91精品国产欧美日韩| 日日骚欧美日韩| 日韩午夜激情av| 久久成人免费日本黄色| 26uuu国产电影一区二区| 韩国三级在线一区| 久久久久久久性| 波多野结衣在线一区| 中文字幕中文乱码欧美一区二区| 成人在线综合网| 综合色中文字幕| 欧美日韩中文国产| 另类小说图片综合网| 久久婷婷国产综合国色天香| 福利电影一区二区三区| 国产精品白丝在线| 欧美日韩免费一区二区三区 | 91片在线免费观看| 亚洲一区在线观看免费| 欧美一区二区日韩| 国产馆精品极品| 樱花草国产18久久久久| 91.com视频| 国产精品一区二区黑丝| 亚洲欧美日韩一区| 欧美一区二区三区在| 国产盗摄一区二区三区| 亚洲最大的成人av| 精品国产伦一区二区三区观看方式| 国产一区二区三区香蕉| 亚洲精品视频在线观看网站| 欧美一级高清大全免费观看| 国产成人精品免费一区二区| 亚洲曰韩产成在线| 久久久久久麻豆| 欧美色窝79yyyycom| 国内精品久久久久影院一蜜桃| 国产精品乱码人人做人人爱| 欧美狂野另类xxxxoooo| 国产电影一区二区三区| 性欧美疯狂xxxxbbbb| 国产嫩草影院久久久久| 91麻豆精品国产91久久久| 成人小视频在线| 裸体在线国模精品偷拍| 亚洲日本在线观看| 久久这里只有精品6| 欧美日韩一区二区三区免费看| 丰满岳乱妇一区二区三区| 日本伊人午夜精品| 亚洲欧美一区二区三区极速播放| 欧美电影精品一区二区| 欧美视频一区二区三区四区 | 久久99精品国产麻豆婷婷洗澡| 一区在线中文字幕| 精品国产乱码久久久久久蜜臀| 欧美在线三级电影| 国产精品亚洲午夜一区二区三区 | 国产精品一区二区你懂的| 日韩影视精彩在线| 亚洲欧美一区二区久久| 国产精品久久久久久久久免费相片| 欧美一卡二卡三卡| 欧美性生活影院| 成人美女视频在线看| 精品亚洲成av人在线观看| 亚洲曰韩产成在线| 中文字幕亚洲一区二区av在线| 久久伊人中文字幕| 91精品国产综合久久久久久| 在线精品视频一区二区| 成人av第一页| 丰满亚洲少妇av| 成人在线综合网站| 男人的j进女人的j一区| 五月婷婷久久综合| 亚洲va欧美va天堂v国产综合| 亚洲欧美日韩电影| 一区二区三区免费看视频| 国产精品久久久久国产精品日日| 国产日韩高清在线| 国产日韩精品一区| 中文字幕第一区二区| 日韩精品最新网址| 精品日韩欧美一区二区| 精品乱人伦一区二区三区| 在线综合视频播放| 欧美高清视频www夜色资源网| 精品视频在线免费看| 欧美日韩中文精品| 欧美精品乱人伦久久久久久| 欧美日韩国产欧美日美国产精品| 欧美视频你懂的| 日韩一区二区麻豆国产| 日韩欧美一区二区不卡| 精品毛片乱码1区2区3区| 日本一区二区三区四区| 久久男人中文字幕资源站| 久久综合久久综合久久综合| 久久无码av三级| 亚洲色图丝袜美腿| 亚洲一区二区三区免费视频| 婷婷中文字幕综合| 精品一区二区在线视频| 国产一区福利在线| 成人黄页毛片网站| 色94色欧美sute亚洲线路二| 欧美日韩国产大片| 精品久久久久久久久久久久久久久久久| 久久久久久久综合色一本| 亚洲人成网站在线| 亚洲成av人片在线观看无码| 久久99精品一区二区三区三区| 国产不卡视频在线观看| 日本韩国欧美国产| 日韩视频免费观看高清在线视频| 中文字幕+乱码+中文字幕一区| 亚洲综合小说图片| 国产一区三区三区| 欧美主播一区二区三区| 26uuu国产电影一区二区| 亚洲综合一二区| 美女诱惑一区二区| 北岛玲一区二区三区四区| 在线成人午夜影院| 中文字幕在线免费不卡| 蜜臀av一区二区| 色综合婷婷久久| 久久色视频免费观看| 亚洲地区一二三色| 国产一区二区三区视频在线播放| 色婷婷久久久综合中文字幕| 久久亚洲影视婷婷| 亚洲第一狼人社区| av一区二区久久| 精品欧美黑人一区二区三区| 一区二区三区国产| 国产成都精品91一区二区三| 欧美年轻男男videosbes| ●精品国产综合乱码久久久久| 久久精品二区亚洲w码| 91久久精品一区二区| 久久久久久久精| 精品在线你懂的| 欧美一二三区精品| 午夜精品久久久久久久蜜桃app| 成人高清视频在线| 久久久精品免费观看| 久久精品久久精品| 6080午夜不卡| 亚洲mv大片欧洲mv大片精品| 一本大道av伊人久久综合| 国产欧美视频一区二区| 国产曰批免费观看久久久| 日韩视频在线一区二区| 日韩成人午夜电影| 6080午夜不卡| 日本午夜精品视频在线观看 | 国产偷国产偷亚洲高清人白洁 | 欧美刺激午夜性久久久久久久| 亚洲图片一区二区| 欧美中文字幕一区二区三区亚洲 | 欧美日产在线观看| 亚洲福利一二三区| 欧美日韩国产欧美日美国产精品|