|
LCD偽菜單程序,我覺得注釋還是寫的很詳細(xì)滴。同時(shí)實(shí)現(xiàn)任意位置的反白,我查了很多資料,發(fā)現(xiàn)12864的字符RAM和繪圖RAM之間的異或關(guān)系
0.png (12.76 KB, 下載次數(shù): 36)
下載附件
2017-12-23 14:58 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include "Delay.h"
- #include "key.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
-
- uchar code DIS1[] = {" 菜單查詢 "};//一行一共有16個(gè)字符,空格也占一個(gè)字符位
- uchar code DIS2[] = {" 地圖導(dǎo)航 "};
- uchar code DIS3[] = {" 語音導(dǎo)航 "};
- uchar code DIS4[] = {" 商品查詢 "};
- /************* 12864LCD引腳定義 *************/
- #define LCD_data P0 //數(shù)據(jù)口
- sbit LCD_RS = P2^6; //寄存器選擇輸入
- sbit LCD_RW = P2^5; //液晶讀/寫控制
- sbit LCD_EN = P2^7; //液晶使能控制
- sbit LCD_PSB = P3^2; //串/并方式控制
- //sbit LCD_RST = P3^7; //液晶復(fù)位端口
- /************* LCD12864字符 *************/
- uchar code Photo_inverse_1[] ={ //將第一行進(jìn)行反白
- /*-- 調(diào)入了一幅圖像:這是您新建的圖像 --*/
- /*-- 寬度x高度=128x16 --*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- ……字庫(kù)請(qǐng)下載附件……
- 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
- };
- /*******************************************************************/
- /* */
- /*檢查L(zhǎng)CD忙狀態(tài) */
- /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。 */
- /* */
- /*******************************************************************/
- bit lcd_busy() //定義了一個(gè)函數(shù)返回值類型lcd_busy()該函數(shù)只會(huì)有兩個(gè)值,一個(gè)是0,一個(gè)是1
- { //位定義:bit的值只有兩個(gè),分別是0和1 如果P0&0x80的值為真,通過位定義(bit定義),那么result的值就是1。如果P0&0x80的值為假,通過位定義(bit定義),那么result的值就是0。
- bit result;
- LCD_RS = 0; //時(shí)序圖:
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80); //把P0口讀到的數(shù)據(jù)與0x80相與(0x80是1000 0000即判斷最高位P0^7的狀態(tài)是0還是1) 開發(fā)板原理圖上8個(gè)數(shù)據(jù)口都是連在P0口上
- //讀取P0^7引腳上的狀態(tài) 1&1=1 1&0=0
- /*此程序是判斷液晶忙程序,rs = 0;rw = 1;ep = 1;為讀狀態(tài)字功能,
- 而狀態(tài)字一共有8位,STA0~STA7,其中,STA0~STA6表示當(dāng)前數(shù)據(jù)地址指針的數(shù)值,
- STA7是讀寫操作使能,1表示禁止,也就是禁止操作液晶,也就是液晶忙,此時(shí)result為1,
- 反之,0表示允許,因此只需要狀態(tài)字STA0~STA7中的最高位,你的程序中是通過P0控制狀態(tài)字,
- 因此,就有result = (bit)(P0 & 0x80)*/
- LCD_EN = 0; //EN信號(hào)下降沿鎖存DB7~DB0
- return(result); //返回0或者1
- }
- /*******************************************************************/
- /* */
- /*寫指令數(shù)據(jù)到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /*******************************************************************/
- void lcd_wcmd(uchar cmd) //write_cmd寫命令 想要對(duì)液晶進(jìn)行操作,肯定先要在它空閑的時(shí)候操作
- {
- while(lcd_busy()); //等待lcd_busy()=0;是不是檢測(cè)忙標(biāo)志BF,因?yàn)锽F=1,表示模塊內(nèi)部執(zhí)行命令,不接受任何外部指令;BF=0,說明隨時(shí)可以接收外部指令
- LCD_RS = 0; //RS為0表示DB7~DB0為顯示指令數(shù)據(jù)
- LCD_RW = 0; //RW為0表示數(shù)據(jù)被寫到IR或者DR
- LCD_EN = 0; //E下降沿鎖存DB7~DB0
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1; //E下降沿鎖存DB7~DB0
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數(shù)據(jù)到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(uchar dat) //write_data寫數(shù)據(jù)
- {
- while(lcd_busy());
- LCD_RS = 1; //RS = 1;表示DB7~DB0為顯示數(shù)據(jù)
- LCD_RW = 0; //DB7~DB0數(shù)據(jù)被讀入IR
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化設(shè)定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- LCD_PSB = 1; //PSB為高電平--并口方式:并口快,需要8+3條io口,讀寫快,特別適合圖形方式;數(shù)據(jù)是從并口DB0-DB7(7-14)腳傳輸數(shù)據(jù)的
- //PSB為低電平--串口方式:占用Io口少,最少好像是兩條,cs需要特殊處理一下,控制起來比較好使,占用單片機(jī)資源多,當(dāng)然也有些小技巧可以解決
- //串口方式,是從串口4(RS/CS并行的指令/數(shù)據(jù)選擇信號(hào));串行的片選信號(hào)、5(R/W/SID)并行的讀寫選擇信號(hào),串行的數(shù)據(jù)口,6(E/CLK)并行的使能信號(hào)
-
- // LCD_RST = 0; //液晶復(fù)位
- // delay(3);
- // LCD_RST = 1; //復(fù)位置高
- // delay(3);
-
- lcd_wcmd(0x34); //擴(kuò)充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo),不反白
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容(清屏)指針歸位,設(shè)置地址指針魏00H
- delay(5);
- // lcd_wcmd(0x06); //指定在資料的讀取和寫入時(shí),設(shè)定游標(biāo)的移動(dòng)方向及指定顯示的一位,光標(biāo)先從右向左加1位移動(dòng)
- // delay(5);
- }
- /*********************************************************/
- /* */
- /* 設(shè)定顯示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y) //漢字顯示坐標(biāo)函數(shù) X代表第幾行 Y代表第幾列
- {
- uchar pos;
- if (X==1) //1代表第一行
- {X=0x80;}
- else if (X==2) //2代表第二行
- {X=0x90;}
- else if (X==3) //3代表第三行
- {X=0x88;}
- else if (X==4) //4代表第四行
- {X=0x98;}
- pos = X+Y ; //pos = 0x80+0 = 0x80
-
- lcd_wcmd(pos); //顯示地址
- }
- /*********************************************************
- * *
- * 閃爍函數(shù) *
- * *
- *********************************************************/
- void lcdflag() //效果:閃三下
- {
- lcd_wcmd(0x08);
- delay(400);
- lcd_wcmd(0x0c);
- delay(400);
- lcd_wcmd(0x08);
- delay(400);
- lcd_wcmd(0x0c);
- delay(400);
- lcd_wcmd(0x08);
- delay(200);
- lcd_wcmd(0x0c);
- delay(5);
- lcd_wcmd(0x01);
- delay(5);
- }
-
-
- /*********************************************************
- * *
- * 圖形顯示 *
- * *
- *********************************************************/
- void photodisplay(uchar *bmp)
- {
- uchar i,j;
-
- lcd_wcmd(0x34); //寫數(shù)據(jù)時(shí),關(guān)閉圖形顯示
-
- for(i=0;i<32;i++)
- {
- lcd_wcmd(0x80+i); //先寫入水平坐標(biāo)值
- lcd_wcmd(0x80); //寫入垂直坐標(biāo)值
- for(j=0;j<16;j++) //再寫入兩個(gè)8位元的數(shù)據(jù)
- lcd_wdat(*bmp++);
- delay1(1);
- }
-
- for(i=0;i<32;i++)
- {
- lcd_wcmd(0x80+i);
- lcd_wcmd(0x88);
- for(j=0;j<16;j++)
- lcd_wdat(*bmp++);
- delay1(1);
- }
- lcd_wcmd(0x36); //寫完數(shù)據(jù),開圖形顯示
- }
- /*********************************************************
- * *
- * 清屏函數(shù) *
- * *
- *********************************************************/
- void clr_screen()
- {
- lcd_wcmd(0x34); //擴(kuò)充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x01); //清屏
- delay(5);
- }
- /**********************************************************
- ; 顯示字符表代碼
- **********************************************************/
- void bytecode()
- {
- uchar s;
- clr_screen(); //清屏
- lcd_wcmd(0x80); //設(shè)置顯示位置為第一行
- for(s=0;s<16;s++)
- {
- lcd_wdat(0x30+s);
- }
- lcd_wcmd(0x90); //設(shè)置顯示位置為第二行
- for(s=0;s<16;s++)
- {
- lcd_wdat(0x40+s);
- }
- lcd_wcmd(0x88); //設(shè)置顯示位置為第三行
- for(s=0;s<16;s++)
- {
- lcd_wdat(0x50+s);
- }
- lcd_wcmd(0x98); //設(shè)置顯示位置為第四行
- for(s=0;s<16;s++)
- {
- lcd_wdat(0x60+s);
- }
- }
- /*********************************************************
- * *
- * 用于檢測(cè)程序能不能跑起來。。。沒啥用 就是測(cè)試 *
- * *
- *********************************************************/
- void lcd_action_up()
- {
- uchar i;
- lcd_pos(1,0); //設(shè)置顯示位置為第一行 輸出第一個(gè)數(shù)組
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS1[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS2[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS3[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS4[i]);
- delay(1);
- }
- photodisplay(Photo_inverse_5); //反白設(shè)置
- delay(3000);
- }
- void lcd_action_down()
- {
- uchar i;
- lcd_pos(1,0); //設(shè)置顯示位置為第一行 輸出第一個(gè)數(shù)組
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS1[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS2[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS3[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS4[i]);
- delay(1);
- }
- photodisplay(Photo_inverse_6); //反白設(shè)置
- delay(3000);
- }
- void lcd_action_enter()
- {
- uchar i;
- lcd_pos(1,0); //設(shè)置顯示位置為第一行 輸出第一個(gè)數(shù)組
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS1[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS2[i]);
- delay(1);
- }
- for(i=0;i<16;i++)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼- /*******************************************************************************
- * 描述: *
- * 12864標(biāo)準(zhǔn)字庫(kù)液晶演示 數(shù)據(jù)p0,控制p2 *
- ********************************************************************************/
- #include <reg51.h>
- #include <intrins.h>
- #include "LCD12864.h"
- #include "Delay.h"
- #include "key.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
- /*********************************************************
- * *
- * 主函數(shù) *
- * *
- *********************************************************/
- void main()
- {
- delay(1000); //上電,等待穩(wěn)定
- lcd_init(); //初始化LCD
- while(1)
- {
- Menu_temp_judge();
- }
-
- }
復(fù)制代碼- #include <reg52.h>
- #include "LCD12864.h"
- #include "Delay.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit key_UP = P1^0;
- sbit key_Down = P1^1;
- sbit key_Enter = P1^2;
- sbit key_Cancel = P1^3;
- uchar fresh_keytemp; //用于保存從按鍵判斷函數(shù)uchar keyscan()的返回值
- uchar keyscan()
- {
- uchar keytemp;
- if (key_UP == 0) //反白上移
- {
- delays(10);
- if (key_UP == 0)
- {
- delays (10);
- while(!key_UP); //按鍵的完整操作是:按鍵按下再松開,算按一次
- /*按鍵按下后的具體指令位置*/
- keytemp = 1; //鍵碼值為1,對(duì)應(yīng)UP鍵
- }
- }
- if (key_Down == 0)
- {
- delays(10);
- if (key_Down == 0)
- {
- delays (10);
- while(!key_Down); //按鍵的完整操作是:按鍵按下再松開,算按一次
- /*按鍵按下后的具體指令位置*/
- keytemp = 2; //鍵碼值為2,對(duì)應(yīng)Down鍵
- }
- }
- if (key_Enter == 0)
- {
- delays(10);
- if (key_Enter == 0)
- {
- delays (10);
- while(!key_Enter); //按鍵的完整操作是:按鍵按下再松開,算按一次
- /*按鍵按下后的具體指令位置*/
- keytemp = 3; //鍵碼值為3,對(duì)應(yīng)Enter鍵
- }
- }
- if (key_Cancel == 0)
- {
- delays(10);
- if (key_Cancel == 0)
- {
- delays (10);
- while(!key_Cancel); //按鍵的完整操作是:按鍵按下再松開,算按一次
- /*按鍵按下后的具體指令位置*/
- keytemp = 4; //鍵碼值為4,對(duì)應(yīng)Cancel鍵
- }
- }
- return keytemp;
- }
- void Menu_temp_judge()
- {
- fresh_keytemp = keyscan();
- if (fresh_keytemp == 1) //按鍵效果:對(duì)應(yīng)菜單1
- {
- /*替換成相應(yīng)的函數(shù)*/
- lcd_action_up();
- }
- else if(fresh_keytemp == 2) //按鍵效果:對(duì)應(yīng)菜單二
- {
- lcd_action_down();
- }
- else if(fresh_keytemp == 3) //按鍵效果:對(duì)應(yīng)菜單三
- {
- lcd_action_enter();
- }
- else if(fresh_keytemp == 4) //按鍵效果:對(duì)應(yīng)菜單四
- {
- lcd_action_cancel();
- }
- else
- {
- //空
- }
- // delay(20);
- }
復(fù)制代碼
所有資料51hei提供下載:
成功實(shí)現(xiàn)LCD12864任意一行中間四個(gè)漢字的反白.zip
(70.62 KB, 下載次數(shù): 164)
2017-12-23 08:30 上傳
點(diǎn)擊文件名下載附件
偽菜單和反白 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|