找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1337|回复: 0
收起左侧

51单片机12864显示和按键控制程序

[复制链接]
ID:997284 发表于 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;//全局变量,当前箭头位置
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.设置1"},
{"2.设置2"},
{"3.设置3"},
{"4.设置4"},
{"5.设置5"},
{"6.设置6"},
{"7.设置7"},
{"8.设置8"},
{"9.设置9"},
{"10. 设置10"},
};




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

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

/*------------------------------------------------
   发送
------------------------------------------------*/
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;
}
/*------------------------------------------------
   写数据
------------------------------------------------*/
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);

}  
/*------------------------------------------------
                   调用显示更新
------------------------------------------------*/
void DisplayUpdata(void)
{   
    unsigned char num;
     ClrScreen();
    num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判断数组中数值个数
    if((0+(curr/4)*4)<num)
      PutStr(0,1,MainMenu[0+(curr/4)*4]);
    else //如果超出数组最大元素,则写空信息,不判断此信息可能会出现乱码
      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);//开机界面
         DisplayUpdata();
         delay(10);

         while(1)
             {  
          if(curr!=currold) //光标位置变化,则更新显示
            {
        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, 下载次数: 17)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表