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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6251|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

很詳細(xì)的LCD12864偽菜單單片機(jī)程序,同時(shí)實(shí)現(xiàn)任意位置的反白

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:197531 發(fā)表于 2017-12-23 08:32 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
LCD偽菜單程序,我覺得注釋還是寫的很詳細(xì)滴。同時(shí)實(shí)現(xiàn)任意位置的反白,我查了很多資料,發(fā)現(xiàn)12864的字符RAM和繪圖RAM之間的異或關(guān)系

單片機(jī)源程序如下:
  1.         #include <reg52.h>
  2.         #include <intrins.h>
  3.         #include "Delay.h"
  4.         #include "key.h"
  5.         #define uint unsigned int
  6.         #define uchar unsigned char

  7.         #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
  8.        
  9.         uchar code  DIS1[] = {"    菜單查詢       "};//一行一共有16個(gè)字符,空格也占一個(gè)字符位
  10.         uchar code  DIS2[] = {"    地圖導(dǎo)航       "};
  11.         uchar code  DIS3[] = {"    語音導(dǎo)航       "};
  12.         uchar code  DIS4[] = {"    商品查詢       "};

  13.         /************* 12864LCD引腳定義 *************/
  14.         #define LCD_data  P0       //數(shù)據(jù)口
  15.         sbit LCD_RS  =  P2^6;      //寄存器選擇輸入
  16.         sbit LCD_RW  =  P2^5;      //液晶讀/寫控制
  17.         sbit LCD_EN  =  P2^7;      //液晶使能控制
  18.         sbit LCD_PSB =  P3^2;      //串/并方式控制
  19.         //sbit LCD_RST =  P3^7;      //液晶復(fù)位端口
  20.         /************* LCD12864字符 *************/
  21.     uchar code Photo_inverse_1[] ={                                                                                                                   //將第一行進(jìn)行反白
  22.         /*--  調(diào)入了一幅圖像:這是您新建的圖像  --*/
  23.         /*--  寬度x高度=128x16  --*/
  24.         0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  25.         ……字庫(kù)請(qǐng)下載附件……
  26.         0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
  27.         };


  28.         /*******************************************************************/
  29.         /*                                                                 */
  30.         /*檢查L(zhǎng)CD忙狀態(tài)                                                    */
  31.         /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。      */
  32.         /*                                                                 */
  33.         /*******************************************************************/
  34.         bit lcd_busy()                //定義了一個(gè)函數(shù)返回值類型lcd_busy()該函數(shù)只會(huì)有兩個(gè)值,一個(gè)是0,一個(gè)是1                 
  35.         {                   //位定義:bit的值只有兩個(gè),分別是0和1  如果P0&0x80的值為真,通過位定義(bit定義),那么result的值就是1。如果P0&0x80的值為假,通過位定義(bit定義),那么result的值就是0。         
  36.             bit result;
  37.             LCD_RS = 0;          //時(shí)序圖:  
  38.             LCD_RW = 1;
  39.             LCD_EN = 1;
  40.             delayNOP();
  41.             result = (bit)(P0&0x80);   //把P0口讀到的數(shù)據(jù)與0x80相與(0x80是1000 0000即判斷最高位P0^7的狀態(tài)是0還是1) 開發(fā)板原理圖上8個(gè)數(shù)據(jù)口都是連在P0口上
  42.                                                                //讀取P0^7引腳上的狀態(tài) 1&1=1 1&0=0
  43.                                                                    /*此程序是判斷液晶忙程序,rs = 0;rw = 1;ep = 1;為讀狀態(tài)字功能,
  44.                                                                    而狀態(tài)字一共有8位,STA0~STA7,其中,STA0~STA6表示當(dāng)前數(shù)據(jù)地址指針的數(shù)值,
  45.                                                                    STA7是讀寫操作使能,1表示禁止,也就是禁止操作液晶,也就是液晶忙,此時(shí)result為1,
  46.                                                                    反之,0表示允許,因此只需要狀態(tài)字STA0~STA7中的最高位,你的程序中是通過P0控制狀態(tài)字,
  47.                                                                    因此,就有result = (bit)(P0 & 0x80)*/
  48.                 LCD_EN = 0;                  //EN信號(hào)下降沿鎖存DB7~DB0
  49.             return(result);   //返回0或者1
  50.         }
  51.         /*******************************************************************/
  52.         /*                                                                 */
  53.         /*寫指令數(shù)據(jù)到LCD                                                  */
  54.         /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  55.         /*                                                                 */
  56.         /*******************************************************************/
  57.         void lcd_wcmd(uchar cmd)  //write_cmd寫命令  想要對(duì)液晶進(jìn)行操作,肯定先要在它空閑的時(shí)候操作
  58.         {                          
  59.             while(lcd_busy()); //等待lcd_busy()=0;是不是檢測(cè)忙標(biāo)志BF,因?yàn)锽F=1,表示模塊內(nèi)部執(zhí)行命令,不接受任何外部指令;BF=0,說明隨時(shí)可以接收外部指令
  60.             LCD_RS = 0;           //RS為0表示DB7~DB0為顯示指令數(shù)據(jù)
  61.             LCD_RW = 0;           //RW為0表示數(shù)據(jù)被寫到IR或者DR
  62.             LCD_EN = 0;           //E下降沿鎖存DB7~DB0
  63.             _nop_();
  64.             _nop_();
  65.             P0 = cmd;
  66.             delayNOP();
  67.             LCD_EN = 1;           //E下降沿鎖存DB7~DB0
  68.             delayNOP();
  69.             LCD_EN = 0;  
  70.         }
  71.         /*******************************************************************/
  72.         /*                                                                 */
  73.         /*寫顯示數(shù)據(jù)到LCD                                                  */
  74.         /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  75.         /*                                                                 */
  76.         /*******************************************************************/
  77.         void lcd_wdat(uchar dat) //write_data寫數(shù)據(jù)
  78.         {                          
  79.             while(lcd_busy());
  80.             LCD_RS = 1;          //RS = 1;表示DB7~DB0為顯示數(shù)據(jù)
  81.             LCD_RW = 0;          //DB7~DB0數(shù)據(jù)被讀入IR
  82.             LCD_EN = 0;
  83.             P0 = dat;
  84.             delayNOP();
  85.             LCD_EN = 1;
  86.             delayNOP();
  87.             LCD_EN = 0;
  88.         }
  89.         /*******************************************************************/
  90.         /*                                                                 */
  91.         /*  LCD初始化設(shè)定                                                  */
  92.         /*                                                                 */
  93.         /*******************************************************************/
  94.         void lcd_init()
  95.         {
  96.             LCD_PSB = 1;         //PSB為高電平--并口方式:并口快,需要8+3條io口,讀寫快,特別適合圖形方式;數(shù)據(jù)是從并口DB0-DB7(7-14)腳傳輸數(shù)據(jù)的
  97.                                                      //PSB為低電平--串口方式:占用Io口少,最少好像是兩條,cs需要特殊處理一下,控制起來比較好使,占用單片機(jī)資源多,當(dāng)然也有些小技巧可以解決
  98.                                                          //串口方式,是從串口4(RS/CS并行的指令/數(shù)據(jù)選擇信號(hào));串行的片選信號(hào)、5(R/W/SID)并行的讀寫選擇信號(hào),串行的數(shù)據(jù)口,6(E/CLK)并行的使能信號(hào)
  99.        
  100.         //        LCD_RST = 0;                 //液晶復(fù)位
  101.         //    delay(3);                  
  102.         //   LCD_RST = 1;               //復(fù)位置高
  103.         //    delay(3);
  104.             
  105.             lcd_wcmd(0x34);      //擴(kuò)充指令操作
  106.             delay(5);
  107.             lcd_wcmd(0x30);      //基本指令操作
  108.             delay(5);
  109.             lcd_wcmd(0x0C);      //顯示開,關(guān)光標(biāo),不反白
  110.             delay(5);
  111.             lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容(清屏)指針歸位,設(shè)置地址指針魏00H
  112.             delay(5);
  113.         //  lcd_wcmd(0x06);      //指定在資料的讀取和寫入時(shí),設(shè)定游標(biāo)的移動(dòng)方向及指定顯示的一位,光標(biāo)先從右向左加1位移動(dòng)
  114.         //  delay(5);
  115.         }
  116.         /*********************************************************/
  117.         /*                                                       */
  118.         /* 設(shè)定顯示位置                                          */
  119.         /*                                                       */
  120.         /*********************************************************/
  121.         void lcd_pos(uchar X,uchar Y)         //漢字顯示坐標(biāo)函數(shù)          X代表第幾行 Y代表第幾列
  122.         {                          
  123.                    uchar  pos;
  124.                    if (X==1)                 //1代表第一行
  125.                      {X=0x80;}
  126.                    else if (X==2)         //2代表第二行
  127.                      {X=0x90;}
  128.                    else if (X==3)         //3代表第三行
  129.                      {X=0x88;}
  130.                    else if (X==4)         //4代表第四行
  131.                      {X=0x98;}
  132.                    pos = X+Y ;                                  //pos = 0x80+0 = 0x80
  133.                  
  134.                    lcd_wcmd(pos);     //顯示地址
  135.         }
  136.         /*********************************************************
  137.         *                                                        *
  138.         * 閃爍函數(shù)                                               *
  139.         *                                                        *
  140.         *********************************************************/
  141.         void lcdflag()                 //效果:閃三下
  142.         {
  143.            lcd_wcmd(0x08);   
  144.            delay(400);
  145.            lcd_wcmd(0x0c);   
  146.            delay(400);
  147.            lcd_wcmd(0x08);   
  148.            delay(400);
  149.            lcd_wcmd(0x0c);   
  150.            delay(400);
  151.            lcd_wcmd(0x08);   
  152.            delay(200);
  153.            lcd_wcmd(0x0c);   
  154.            delay(5);
  155.            lcd_wcmd(0x01);   
  156.            delay(5);
  157.         }
  158.        
  159.        
  160.         /*********************************************************
  161.         *                                                        *
  162.         * 圖形顯示                                               *
  163.         *                                                        *
  164.         *********************************************************/
  165.         void photodisplay(uchar *bmp)       
  166.         {
  167.           uchar i,j;
  168.        
  169.           lcd_wcmd(0x34);        //寫數(shù)據(jù)時(shí),關(guān)閉圖形顯示
  170.        
  171.           for(i=0;i<32;i++)
  172.           {
  173.             lcd_wcmd(0x80+i);    //先寫入水平坐標(biāo)值
  174.             lcd_wcmd(0x80);      //寫入垂直坐標(biāo)值
  175.             for(j=0;j<16;j++)   //再寫入兩個(gè)8位元的數(shù)據(jù)   
  176.             lcd_wdat(*bmp++);     
  177.             delay1(1);
  178.           }
  179.        
  180.           for(i=0;i<32;i++)
  181.           {
  182.             lcd_wcmd(0x80+i);
  183.             lcd_wcmd(0x88);
  184.             for(j=0;j<16;j++)         
  185.                 lcd_wdat(*bmp++);   
  186.                 delay1(1);
  187.           }
  188.           lcd_wcmd(0x36);       //寫完數(shù)據(jù),開圖形顯示
  189.         }
  190.         /*********************************************************
  191.         *                                                        *
  192.         * 清屏函數(shù)                                               *
  193.         *                                                        *
  194.         *********************************************************/
  195.         void  clr_screen()
  196.         {
  197.            lcd_wcmd(0x34);      //擴(kuò)充指令操作
  198.            delay(5);   
  199.            lcd_wcmd(0x30);      //基本指令操作
  200.            delay(5);
  201.            lcd_wcmd(0x01);      //清屏
  202.            delay(5);     
  203.         }
  204.         /**********************************************************
  205.         ; 顯示字符表代碼
  206.         **********************************************************/
  207.         void  bytecode()
  208.         {
  209.            uchar  s;
  210.            clr_screen();          //清屏   
  211.            lcd_wcmd(0x80);        //設(shè)置顯示位置為第一行  
  212.            for(s=0;s<16;s++)
  213.            {
  214.              lcd_wdat(0x30+s);
  215.            }
  216.            lcd_wcmd(0x90);        //設(shè)置顯示位置為第二行
  217.            for(s=0;s<16;s++)
  218.            {
  219.              lcd_wdat(0x40+s);
  220.            }
  221.            lcd_wcmd(0x88);        //設(shè)置顯示位置為第三行  
  222.            for(s=0;s<16;s++)
  223.            {
  224.              lcd_wdat(0x50+s);
  225.            }
  226.            lcd_wcmd(0x98);       //設(shè)置顯示位置為第四行   
  227.            for(s=0;s<16;s++)
  228.            {
  229.              lcd_wdat(0x60+s);
  230.            }
  231.         }
  232.         /*********************************************************
  233.         *                                                        *
  234.         * 用于檢測(cè)程序能不能跑起來。。。沒啥用 就是測(cè)試          *
  235.         *                                                        *
  236.         *********************************************************/
  237.         void lcd_action_up()
  238.         {
  239.              uchar i;  
  240.              lcd_pos(1,0);             //設(shè)置顯示位置為第一行  輸出第一個(gè)數(shù)組
  241.              for(i=0;i<16;i++)
  242.              {
  243.                         lcd_wdat(DIS1[i]);
  244.                         delay(1);
  245.              }
  246.                  for(i=0;i<16;i++)
  247.              {
  248.                         lcd_wdat(DIS2[i]);
  249.                         delay(1);
  250.              }
  251.                  for(i=0;i<16;i++)
  252.              {
  253.                         lcd_wdat(DIS3[i]);
  254.                         delay(1);
  255.              }
  256.                  for(i=0;i<16;i++)
  257.              {
  258.                         lcd_wdat(DIS4[i]);
  259.                         delay(1);
  260.              }
  261.                  photodisplay(Photo_inverse_5);    //反白設(shè)置
  262.                  delay(3000);
  263.         }
  264.         void lcd_action_down()       
  265.         {
  266.              uchar i;  
  267.              lcd_pos(1,0);             //設(shè)置顯示位置為第一行  輸出第一個(gè)數(shù)組
  268.              for(i=0;i<16;i++)
  269.              {
  270.                         lcd_wdat(DIS1[i]);
  271.                         delay(1);
  272.              }
  273.                  for(i=0;i<16;i++)
  274.              {
  275.                         lcd_wdat(DIS2[i]);
  276.                         delay(1);
  277.              }
  278.                  for(i=0;i<16;i++)
  279.              {
  280.                         lcd_wdat(DIS3[i]);
  281.                         delay(1);
  282.              }
  283.                  for(i=0;i<16;i++)
  284.              {
  285.                         lcd_wdat(DIS4[i]);
  286.                         delay(1);
  287.              }
  288.                  photodisplay(Photo_inverse_6);    //反白設(shè)置
  289.                  delay(3000);
  290.         }
  291.         void lcd_action_enter()       
  292.         {
  293.              uchar i;  
  294.              lcd_pos(1,0);             //設(shè)置顯示位置為第一行  輸出第一個(gè)數(shù)組
  295.              for(i=0;i<16;i++)
  296.              {
  297.                         lcd_wdat(DIS1[i]);
  298.                         delay(1);
  299.              }
  300.                  for(i=0;i<16;i++)
  301.              {
  302.                         lcd_wdat(DIS2[i]);
  303.                         delay(1);
  304.              }
  305.                  for(i=0;i<16;i++)
  306.              {
  307. ……………………

  308. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
  1.         /*******************************************************************************
  2.         *  描述:                                                                       *
  3.         *      12864標(biāo)準(zhǔn)字庫(kù)液晶演示 數(shù)據(jù)p0,控制p2                                     *
  4.         ********************************************************************************/
  5.         #include <reg51.h>
  6.         #include <intrins.h>
  7.         #include "LCD12864.h"
  8.         #include "Delay.h"
  9.         #include "key.h"
  10.         #define uchar unsigned char
  11.         #define uint  unsigned int
  12.                
  13.         #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};

  14.         /*********************************************************
  15.         *                                                        *
  16.         * 主函數(shù)                                                 *
  17.         *                                                        *
  18.         *********************************************************/
  19.         void main()
  20.         {          
  21.            delay(1000);                 //上電,等待穩(wěn)定
  22.            lcd_init();                 //初始化LCD
  23.            while(1)
  24.            {
  25.                    Menu_temp_judge();
  26.            }
  27.                        
  28.         }
復(fù)制代碼
  1.         #include <reg52.h>
  2.         #include "LCD12864.h"
  3.         #include "Delay.h"
  4.         #define uint unsigned int
  5.         #define uchar unsigned char

  6.         sbit key_UP = P1^0;
  7.         sbit key_Down = P1^1;
  8.         sbit key_Enter = P1^2;
  9.         sbit key_Cancel = P1^3;

  10.         uchar fresh_keytemp; //用于保存從按鍵判斷函數(shù)uchar keyscan()的返回值

  11.         uchar keyscan()
  12.         {
  13.                 uchar keytemp;
  14.                 if (key_UP == 0)         //反白上移
  15.                 {
  16.                         delays(10);
  17.                         if (key_UP == 0)
  18.                         {
  19.                                 delays (10);          
  20.                                 while(!key_UP); //按鍵的完整操作是:按鍵按下再松開,算按一次
  21.                                 /*按鍵按下后的具體指令位置*/
  22.                                 keytemp = 1; //鍵碼值為1,對(duì)應(yīng)UP鍵
  23.                         }       
  24.                 }
  25.                 if (key_Down == 0)
  26.                 {
  27.                         delays(10);
  28.                         if (key_Down == 0)
  29.                         {
  30.                                 delays (10);
  31.                                 while(!key_Down); //按鍵的完整操作是:按鍵按下再松開,算按一次
  32.                                 /*按鍵按下后的具體指令位置*/
  33.                                 keytemp = 2; //鍵碼值為2,對(duì)應(yīng)Down鍵
  34.                         }       
  35.                 }
  36.                 if (key_Enter == 0)
  37.                 {
  38.                         delays(10);
  39.                         if (key_Enter == 0)
  40.                         {
  41.                                 delays (10);
  42.                                 while(!key_Enter); //按鍵的完整操作是:按鍵按下再松開,算按一次
  43.                                 /*按鍵按下后的具體指令位置*/
  44.                                 keytemp = 3; //鍵碼值為3,對(duì)應(yīng)Enter鍵
  45.                         }       
  46.                 }
  47.                 if (key_Cancel == 0)
  48.                 {
  49.                         delays(10);
  50.                         if (key_Cancel == 0)
  51.                         {
  52.                                 delays (10);
  53.                                 while(!key_Cancel); //按鍵的完整操作是:按鍵按下再松開,算按一次
  54.                                 /*按鍵按下后的具體指令位置*/
  55.                                 keytemp = 4; //鍵碼值為4,對(duì)應(yīng)Cancel鍵
  56.                         }       
  57.                 }
  58.                 return keytemp;
  59.         }
  60.         void Menu_temp_judge()
  61.         {
  62.                 fresh_keytemp = keyscan();
  63.                 if (fresh_keytemp == 1)        //按鍵效果:對(duì)應(yīng)菜單1
  64.                 {
  65.                         /*替換成相應(yīng)的函數(shù)*/
  66.                         lcd_action_up();
  67.                 }
  68.                 else if(fresh_keytemp == 2)        //按鍵效果:對(duì)應(yīng)菜單二
  69.                 {
  70.                         lcd_action_down();
  71.                 }
  72.                 else if(fresh_keytemp == 3)        //按鍵效果:對(duì)應(yīng)菜單三
  73.                 {
  74.                         lcd_action_enter();
  75.                 }
  76.                 else if(fresh_keytemp == 4)        //按鍵效果:對(duì)應(yīng)菜單四
  77.                 {
  78.                         lcd_action_cancel();
  79.                 }
  80.                 else
  81.                 {
  82.                 //空
  83.                 }
  84. //                delay(20);
  85.         }
復(fù)制代碼

所有資料51hei提供下載:
成功實(shí)現(xiàn)LCD12864任意一行中間四個(gè)漢字的反白.zip (70.62 KB, 下載次數(shù): 164)




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:406128 發(fā)表于 2018-11-8 20:48 | 只看該作者
載了打不開。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 男人的天堂久久 | 亚洲精品一区二区三区蜜桃久 | 午夜免费影视 | 国产日韩欧美一区 | 国产福利91精品一区二区三区 | 亚洲成人中文字幕 | 欧美日韩综合一区 | 国产一区二区三区久久久久久久久 | 色一情一乱一伦一区二区三区 | 99色视频| 亚洲视频一区二区 | 久久久久久久久久久丰满 | 日日夜夜草 | 97国产精品视频 | 99精品视频免费观看 | 国产精品资源在线 | 国产精品美女久久久久久久久久久 | 日日夜精品视频 | 亚洲精品丝袜日韩 | 精品久久一区 | 蜜桃在线视频 | 在线日韩 | 亚洲精品国产成人 | 亚洲激情在线观看 | 亚洲协和影视 | 午夜影院中文字幕 | 怡红院成人在线视频 | 欧美舔穴 | 自拍偷拍小视频 | 黄视频网站在线 | 少妇一区二区三区 | 国产精品久久久久久久久婷婷 | 特级特黄特色的免费大片 | 日韩在线免费 | 亚洲成色777777在线观看影院 | www性色| 国产视频精品在线 | 五月天国产视频 | 国产精品久久久久久久久久不蜜臀 | 成人片免费看 | 精品国产一区二区三区性色av |