久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

AT89s52-LCD12864多頁菜單按鍵選擇操作

作者:佚名   來源:本站原創   點擊數:  更新時間:2011年07月11日   【字體:

      這篇程序的代碼還未理解清楚,再一次深刻發現自己的算法水平不行。今天學到的東西還行,就是那些C文件的一些知識。反正都是些優化的東西,以后肯定也用的著,過幾天有興趣的話,再去學習一下AVR單片機。

        程序代碼:硬件上與前面一樣,有點變化就是多了兩個翻頁的按鍵。到現在一整天的飯都還沒吃,該去吃了,干這個果然不會困。


#include <reg52.h>
#include <intrins.h>

sbit RS = P2^4;
sbit RW = P2^5;
sbit E  = P2^6;
sbit PSB= P2^1; //串并口選擇端  并高串低
#define DataPort P0   

sbit KEY_ADD=P3^3; //按鍵
sbit KEY_DEC=P3^4;

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,
};

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

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

void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     DelayUs2x(245);
  DelayUs2x(245);
 }
}

/***********************************************
                判忙函數
***********************************************/
void Check_Busy()
{  
    RS=0;  //寫命令
    RW=1;  //讀狀態
    E=1;
    DataPort=0xff;
    while((DataPort&0x80)==0x80);//忙則等待
    E=0;
}

/***********************************************
                寫入命令
***********************************************/
void Write_Cmd(unsigned char Cmd)
{
 Check_Busy();
 RS=0;  //寫命令
 RW=0;  //write
 E=1;
 DataPort=Cmd;
 DelayUs2x(5);
 E=0;
 DelayUs2x(5);
}

/***********************************************
                 寫入數據
***********************************************/
void Write_Data(unsigned char Data)
{
 Check_Busy();
 RS=1; //寫數據
 RW=0; //write
 E=1;
 DataPort=Data;
 DelayUs2x(5);
 E=0;
 DelayUs2x(5);
}

/***********************************************
               液晶屏初始化
***********************************************/
void Init_ST7920()
{  
   DelayMs(40);           //大于40MS的延時程序
   PSB=1;                 //設置為8BIT并口工作模式
   DelayMs(1);            //延時
   Write_Cmd(0x30);       //選擇基本指令集
   DelayUs2x(50);         //延時大于100us
   Write_Cmd(0x30);       //選擇8bit數據流
   DelayUs2x(20);         //延時大于37us
   Write_Cmd(0x0c);       //開顯示(無游標、不反白)
   DelayUs2x(50);         //延時大于100us
   Write_Cmd(0x01);       //清除顯示,并且設定地址指針為00H
   DelayMs(15);           //延時大于10ms
   Write_Cmd(0x06);       //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動
   DelayUs2x(50);         //延時大于100us
}

/***********************************************
                用戶自定義字符
***********************************************/
void CGRAM()
{ 
     int i;
     Write_Cmd(0x30); 
     Write_Cmd(0x40);
     for(i=0;i<16;i++)
       {
        Write_Data(user16x16[i*2]);
        Write_Data(user16x16[i*2+1]);
      }
}   

/***********************************************
               顯示用戶自定義字符
***********************************************/
void DisplayCGRAM(unsigned char x,unsigned char y)
{ 
 switch(y)
     {
   case 1: Write_Cmd(0x80+x);break;
   case 2: Write_Cmd(0x90+x);break;
   case 3: Write_Cmd(0x88+x);break;
   case 4: Write_Cmd(0x98+x);break;
      default:break;
  }
    Write_Data(00);
    Write_Data(00);
}         

/***********************************************
                  顯示字符串
            x:橫坐標值,范圍0~8
            y:縱坐標值,范圍1~4
***********************************************/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s)
{ 
 switch(y)
     {
   case 1: Write_Cmd(0x80+x);break;
   case 2: Write_Cmd(0x90+x);break;
   case 3: Write_Cmd(0x88+x);break;
   case 4: Write_Cmd(0x98+x);break;
      default:break;
  }
 while(*s>0)
   { 
      Write_Data(*s);
      s++;
      DelayUs2x(50);
   }
}

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

/***********************************************
                 MAIN
***********************************************/
void main()
{
   Init_ST7920(); 
   CGRAM(); //寫入自定義字符 
   DisplayUpdata();
   while(1)
   {     
     if(curr!=currold) //光標位置變化,則更新顯示
      {
       DisplayUpdata();
       currold=curr;
      } 
 
   if(!KEY_ADD)  
    {
     DelayMs(10);
     if(!KEY_ADD)     
    {
        while(!KEY_ADD);
      {
    if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)
     //判斷數組中數值個數
     { curr++; }
      }
    }
 }

  if(!KEY_DEC) 
    {
     DelayMs(10);
     if(!KEY_DEC)     
    {
        while(!KEY_DEC);
      {
       if(curr>0)
     { curr--; }
    }
    }
 }  
  }
}

 

這篇程序還是沒有涉及到變量,需要再去另外找一篇有涉及變量的程序。
關閉窗口

相關文章

主站蜘蛛池模板: 日韩三级在线 | 狠狠躁躁夜夜躁波多野结依 | 国产在线色 | 久久亚洲国产精品 | 正在播放亚洲 | 另类在线 | 国产精品欧美精品日韩精品 | 中文字幕一区二区三区四区不卡 | 亚洲精品一区二区三区四区高清 | 国产一区二区三区亚洲 | 日本不卡一区 | 日日干夜夜操天天操 | 日韩高清三区 | 国产激情精品视频 | 天天插天天射天天干 | 在线视频a | 久久伊| 免费看91| www.青娱乐 | 国产精品18hdxxxⅹ在线 | 91精品久久久 | av国产精品| 天天干,夜夜操 | 自拍偷拍第一页 | 国产精品成人在线播放 | 中文久久 | 国产一区二区在线免费观看 | 亚洲国产精品一区二区三区 | 国产亚洲一区二区三区 | 无吗视频 | www.久久.com| 国产精品国产三级国产aⅴ无密码 | 亚洲精品一区二区三区四区高清 | 欧美一区二区三区久久精品 | 1区2区视频| 91精品国产综合久久小仙女图片 | 欧美在线视频a | 瑟瑟免费视频 | 亚洲精品一区二区网址 | 美女黄18岁以下禁止观看 | 91精品国产综合久久久久久 |