找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1889|回復(fù): 0
收起左側(cè)

51單片機(jī)12864顯示和按鍵控制程序

[復(fù)制鏈接]
ID:997284 發(fā)表于 2022-1-7 08:47 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit CS =P2^6;
sbit SCK=P2^7;
sbit SID=P2^5;
sbit PSB=P3^2;
sbit KEY_ADD=P3^0;         //定義按鍵輸入端口
sbit KEY_DEC=P3^1;



unsigned char code AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a, 0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};

//#define keyport P3


unsigned char curr,currold;//全局變量,當(dāng)前箭頭位置
unsigned char code user16x16[]={ //箭頭圖片
0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,
0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,
};

//☆(0)
unsigned char code star16x16[]={//五角星
0xBF,0x3F,0xBF,0xBF,0xBF,0x9F,0xE3,0xFC,0xE3,0x9F,0xBF,0xBF,0xBF,0x3F,0xBF,0xFF,
0xFF,0xFF,0xBE,0xC6,0xD9,0xEF,0xEF,0xF7,0xF7,0xEF,0xD9,0xC6,0xBE,0xFF,0xFF,0xFF};/*"☆",0*/


unsigned char code *MainMenu[]=
{
{"1.設(shè)置1"},
{"2.設(shè)置2"},
{"3.設(shè)置3"},
{"4.設(shè)置4"},
{"5.設(shè)置5"},
{"6.設(shè)置6"},
{"7.設(shè)置7"},
{"8.設(shè)置8"},
{"9.設(shè)置9"},
{"10. 設(shè)置10"},
};




/*------------------------------------------------
   延時
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}

void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延時1mS
     DelayUs2x(245);
     DelayUs2x(245);
}
}

/*------------------------------------------------
   發(fā)送
------------------------------------------------*/
void SendByte(unsigned char Dbyte)
{
         unsigned char i;
         for(i=0;i<8;i++)
         {
                 SCK = 0;
                 Dbyte=Dbyte<<1;
                 SID = CY;
                 SCK = 1;
                 SCK = 0;
         }
}
/*------------------------------------------------
   接收
------------------------------------------------*/
unsigned char ReceiveByte(void)
{
         unsigned char i,temp1,temp2;
         temp1=temp2=0;
         for(i=0;i<8;i++)
         {
                 temp1=temp1<<1;
                 SCK = 0;
                 SCK = 1;               
                 SCK = 0;
                 if(SID) temp1++;
         }
         for(i=0;i<8;i++)
         {
                 temp2=temp2<<1;
                 SCK = 0;
                 SCK = 1;
                 SCK = 0;
                 if(SID) temp2++;
         }
         return ((0xf0&temp1)+(0x0f&temp2));
}
/*------------------------------------------------
   忙檢測
------------------------------------------------*/
void CheckBusy( void )
{
         do    SendByte(0xfc);     //11111,RW(1),RS(0),0
         while(0x80&ReceiveByte());
}
/*------------------------------------------------
   寫指令
------------------------------------------------*/
void WriteCommand( unsigned char Cbyte )
{
         CS = 1;
         CheckBusy();
         SendByte(0xf8);          //11111,RW(0),RS(0),0
         SendByte(0xf0&Cbyte);
         SendByte(0xf0&Cbyte<<4);
         CS = 0;
}
/*------------------------------------------------
   寫數(shù)據(jù)
------------------------------------------------*/
void WriteData( unsigned char Dbyte )
{
         CS = 1;
         CheckBusy();
         SendByte(0xfa);          //11111,RW(0),RS(1),0
         SendByte(0xf0&Dbyte);
         SendByte(0xf0&Dbyte<<4);
         CS = 0;
}
/*------------------------------------------------
   延時
------------------------------------------------*/
void delay(unsigned int MS)
{
         unsigned char us,usn;
         while(MS!=0)             //for 12M
                 { usn = 2;
                         while(usn!=0)
                                 {
                                         us=0xf5;
                                         while (us!=0){us--;};
                                         usn--;
                                 }
                         MS--;
                 }
}
/*------------------------------------------------
   12864初始化
------------------------------------------------*/
void LcmInit( void )
{
         WriteCommand(0x30);
         WriteCommand(0x03);
         WriteCommand(0x0C);
         WriteCommand(0x01);
         WriteCommand(0x06);
}
/*------------------------------------------------
                      清屏
------------------------------------------------*/
void ClrScreen()
{
   WriteCommand(0x01);
   DelayMs(15);
}
/*void LcmClearTXT( void )
{
         unsigned char i;
         WriteCommand(0x30);
         WriteCommand(0x80);
         for(i=0;i<64;i++)
            WriteData(0x20);
}
void LcmClearBMP( void )
{
         unsigned char i,j;
         WriteCommand(0x34);
         WriteCommand(0x36);
         for(i=0;i<32;i++)
         {
                 WriteCommand(0x80|i);
                 WriteCommand(0x80);
                 for(j=0;j<32;j++)
                    WriteData(0);
         }
}*/
/*------------------------------------------------
                      字符串
------------------------------------------------*/
void PutStr(unsigned char x,unsigned char y,unsigned char code *s)
{
switch(y)
     {
      case 1: WriteCommand(0x80+x);break;
      case 2: WriteCommand(0x90+x);break;
      case 3: WriteCommand(0x88+x);break;
      case 4: WriteCommand(0x98+x);break;
      default:break;
     }
while(*s>0)
   {
      WriteData(*s);
      s++;
      DelayUs2x(50);
   }
}
/*------------------------------------------------
                      圖片
------------------------------------------------*/
void PutBMP(unsigned char *puts)
{
         unsigned int x=0;
         unsigned char i,j;
         WriteCommand(0x34);
         WriteCommand(0x36);
         for(i=0;i<32;i++)
         {
                 WriteCommand(0x80|i);
                 WriteCommand(0x80);
                 for(j=0;j<32;j++)   
                 {                     
                     WriteData(puts[x]);
                     x++;
                 }
         }
}

/*------------------------------------------------
                   用戶自定義字符
------------------------------------------------*/
void CGRAM()
{
     int i;
     WriteCommand(0x30);
     WriteCommand(0x40);
     for(i=0;i<16;i++)
       {
        WriteData(user16x16[i*2]);
        WriteData(user16x16[i*2+1]);
      }
}   
void STRAM()
{
     int i;
     WriteCommand(0x30);
     WriteCommand(0x40);
     for(i=0;i<16;i++)
       {
        WriteData(star16x16[i*2]);
        WriteData(star16x16[i*2+1]);
      }
}   
/*------------------------------------------------
                   顯示用戶自定義字符
------------------------------------------------*/
void DisplayCGRAM(unsigned char x,unsigned char y)
{
switch(y)
     {
      case 1: WriteCommand(0x80+x);break;
      case 2: WriteCommand(0x90+x);break;
      case 3: WriteCommand(0x88+x);break;
      case 4: WriteCommand(0x98+x);break;
      default:break;
     }
    WriteData(00);
    WriteData(00);

}  
/*------------------------------------------------
                   調(diào)用顯示更新
------------------------------------------------*/
void DisplayUpdata(void)
{   
    unsigned char num;
     ClrScreen();
    num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判斷數(shù)組中數(shù)值個數(shù)
    if((0+(curr/4)*4)<num)
      PutStr(0,1,MainMenu[0+(curr/4)*4]);
    else //如果超出數(shù)組最大元素,則寫空信息,不判斷此信息可能會出現(xiàn)亂碼
      PutStr(0,1,"");
    if((1+(curr/4)*4)<num)
      PutStr(0,2,MainMenu[1+(curr/4)*4]);
    else
      PutStr(0,2,"");
    if((2+(curr/4)*4)<num)
      PutStr(0,3,MainMenu[2+(curr/4)*4]);
    else
      PutStr(0,3,"");
    if((3+(curr/4)*4)<num)
      PutStr(0,4,MainMenu[3+(curr/4)*4]);
    else
      PutStr(0,4,"");
    DisplayCGRAM(0,curr%4+1);
}
   


///////////////////////////////////////////////////////////
void main( void )
{
     
         PSB=0;
         LcmInit();
         PutStr(0,0,*MainMenu);//開機(jī)界面
         DisplayUpdata();
         delay(10);

         while(1)
             {  
          if(curr!=currold) //光標(biāo)位置變化,則更新顯示
            {
        DisplayUpdata();
        currold=curr;
            }
         if(KEY_ADD == 0)
         {
           delay(10);
           if(KEY_ADD == 0)
           {
            while (KEY_ADD == 0);
            {
            if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)
            {
                curr++;
            }
            }
           }
         }
         if (KEY_DEC == 0)
         {
         delay(10);
         if(KEY_DEC == 0)
         {
         while (KEY_DEC == 0);
         {
           if(curr>0)
           {
           curr--;
           }
         }
         
         }
         }
                    
         }
         
         
         //end while
}//end main

Keil代碼下載: 1.zip (48.02 KB, 下載次數(shù): 21)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表