久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
很詳細的LCD12864偽菜單單片機程序,同時實現(xiàn)任意位置的反白
[打印本頁]
作者:
全力
時間:
2017-12-23 08:32
標題:
很詳細的LCD12864偽菜單單片機程序,同時實現(xiàn)任意位置的反白
LCD偽菜單程序,我覺得注釋還是寫的很詳細滴。同時實現(xiàn)任意位置的反白,我查了很多資料,發(fā)現(xiàn)12864的字符RAM和繪圖RAM之間的異或關系
0.png
(12.76 KB, 下載次數(shù): 36)
下載附件
2017-12-23 14:58 上傳
單片機源程序如下:
#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個字符,空格也占一個字符位
uchar code DIS2[] = {" 地圖導航 "};
uchar code DIS3[] = {" 語音導航 "};
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; //液晶復位端口
/************* LCD12864字符 *************/
uchar code Photo_inverse_1[] ={ //將第一行進行反白
/*-- 調(diào)入了一幅圖像:這是您新建的圖像 --*/
/*-- 寬度x高度=128x16 --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
……字庫請下載附件……
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
};
/*******************************************************************/
/* */
/*檢查LCD忙狀態(tài) */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。 */
/* */
/*******************************************************************/
bit lcd_busy() //定義了一個函數(shù)返回值類型lcd_busy()該函數(shù)只會有兩個值,一個是0,一個是1
{ //位定義:bit的值只有兩個,分別是0和1 如果P0&0x80的值為真,通過位定義(bit定義),那么result的值就是1。如果P0&0x80的值為假,通過位定義(bit定義),那么result的值就是0。
bit result;
LCD_RS = 0; //時序圖:
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個數(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表示當前數(shù)據(jù)地址指針的數(shù)值,
STA7是讀寫操作使能,1表示禁止,也就是禁止操作液晶,也就是液晶忙,此時result為1,
反之,0表示允許,因此只需要狀態(tài)字STA0~STA7中的最高位,你的程序中是通過P0控制狀態(tài)字,
因此,就有result = (bit)(P0 & 0x80)*/
LCD_EN = 0; //EN信號下降沿鎖存DB7~DB0
return(result); //返回0或者1
}
/*******************************************************************/
/* */
/*寫指令數(shù)據(jù)到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd) //write_cmd寫命令 想要對液晶進行操作,肯定先要在它空閑的時候操作
{
while(lcd_busy()); //等待lcd_busy()=0;是不是檢測忙標志BF,因為BF=1,表示模塊內(nèi)部執(zhí)行命令,不接受任何外部指令;BF=0,說明隨時可以接收外部指令
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初始化設定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //PSB為高電平--并口方式:并口快,需要8+3條io口,讀寫快,特別適合圖形方式;數(shù)據(jù)是從并口DB0-DB7(7-14)腳傳輸數(shù)據(jù)的
//PSB為低電平--串口方式:占用Io口少,最少好像是兩條,cs需要特殊處理一下,控制起來比較好使,占用單片機資源多,當然也有些小技巧可以解決
//串口方式,是從串口4(RS/CS并行的指令/數(shù)據(jù)選擇信號);串行的片選信號、5(R/W/SID)并行的讀寫選擇信號,串行的數(shù)據(jù)口,6(E/CLK)并行的使能信號
// LCD_RST = 0; //液晶復位
// delay(3);
// LCD_RST = 1; //復位置高
// delay(3);
lcd_wcmd(0x34); //擴充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //顯示開,關光標,不反白
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容(清屏)指針歸位,設置地址指針魏00H
delay(5);
// lcd_wcmd(0x06); //指定在資料的讀取和寫入時,設定游標的移動方向及指定顯示的一位,光標先從右向左加1位移動
// delay(5);
}
/*********************************************************/
/* */
/* 設定顯示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y) //漢字顯示坐標函數(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ù)時,關閉圖形顯示
for(i=0;i<32;i++)
{
lcd_wcmd(0x80+i); //先寫入水平坐標值
lcd_wcmd(0x80); //寫入垂直坐標值
for(j=0;j<16;j++) //再寫入兩個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); //擴充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
/**********************************************************
; 顯示字符表代碼
**********************************************************/
void bytecode()
{
uchar s;
clr_screen(); //清屏
lcd_wcmd(0x80); //設置顯示位置為第一行
for(s=0;s<16;s++)
{
lcd_wdat(0x30+s);
}
lcd_wcmd(0x90); //設置顯示位置為第二行
for(s=0;s<16;s++)
{
lcd_wdat(0x40+s);
}
lcd_wcmd(0x88); //設置顯示位置為第三行
for(s=0;s<16;s++)
{
lcd_wdat(0x50+s);
}
lcd_wcmd(0x98); //設置顯示位置為第四行
for(s=0;s<16;s++)
{
lcd_wdat(0x60+s);
}
}
/*********************************************************
* *
* 用于檢測程序能不能跑起來。。。沒啥用 就是測試 *
* *
*********************************************************/
void lcd_action_up()
{
uchar i;
lcd_pos(1,0); //設置顯示位置為第一行 輸出第一個數(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); //反白設置
delay(3000);
}
void lcd_action_down()
{
uchar i;
lcd_pos(1,0); //設置顯示位置為第一行 輸出第一個數(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); //反白設置
delay(3000);
}
void lcd_action_enter()
{
uchar i;
lcd_pos(1,0); //設置顯示位置為第一行 輸出第一個數(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++)
{
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
/*******************************************************************************
* 描述: *
* 12864標準字庫液晶演示 數(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();
}
}
復制代碼
#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,對應UP鍵
}
}
if (key_Down == 0)
{
delays(10);
if (key_Down == 0)
{
delays (10);
while(!key_Down); //按鍵的完整操作是:按鍵按下再松開,算按一次
/*按鍵按下后的具體指令位置*/
keytemp = 2; //鍵碼值為2,對應Down鍵
}
}
if (key_Enter == 0)
{
delays(10);
if (key_Enter == 0)
{
delays (10);
while(!key_Enter); //按鍵的完整操作是:按鍵按下再松開,算按一次
/*按鍵按下后的具體指令位置*/
keytemp = 3; //鍵碼值為3,對應Enter鍵
}
}
if (key_Cancel == 0)
{
delays(10);
if (key_Cancel == 0)
{
delays (10);
while(!key_Cancel); //按鍵的完整操作是:按鍵按下再松開,算按一次
/*按鍵按下后的具體指令位置*/
keytemp = 4; //鍵碼值為4,對應Cancel鍵
}
}
return keytemp;
}
void Menu_temp_judge()
{
fresh_keytemp = keyscan();
if (fresh_keytemp == 1) //按鍵效果:對應菜單1
{
/*替換成相應的函數(shù)*/
lcd_action_up();
}
else if(fresh_keytemp == 2) //按鍵效果:對應菜單二
{
lcd_action_down();
}
else if(fresh_keytemp == 3) //按鍵效果:對應菜單三
{
lcd_action_enter();
}
else if(fresh_keytemp == 4) //按鍵效果:對應菜單四
{
lcd_action_cancel();
}
else
{
//空
}
// delay(20);
}
復制代碼
所有資料51hei提供下載:
成功實現(xiàn)LCD12864任意一行中間四個漢字的反白.zip
(70.62 KB, 下載次數(shù): 164)
2017-12-23 08:30 上傳
點擊文件名下載附件
偽菜單和反白
下載積分: 黑幣 -5
作者:
來生只想做頭豬
時間:
2018-11-8 20:48
載了打不開。。。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人视屏在线观看
|
天天干夜夜操
|
美女天天操
|
免费色网址
|
97在线观看
|
久久精品国产亚洲
|
亚洲精品一区二区三区蜜桃久
|
亚洲 日本 欧美 中文幕
|
中文字幕免费中文
|
羞羞视频免费观看
|
91色视频在线观看
|
日韩欧美在线一区
|
日韩中文字幕在线观看
|
性一交一乱一伦视频免费观看
|
欧美综合国产精品久久丁香
|
美女天天操
|
久久久久久网
|
免费国产精品久久久久久
|
一级做a爰片性色毛片16美国
|
欧洲精品码一区二区三区免费看
|
精品伦精品一区二区三区视频
|
欧美中文字幕在线观看
|
成年人免费看的视频
|
欧美一区二区三区在线观看
|
av片毛片
|
久久久精品视
|
91青青草视频
|
久久久精品一区二区
|
精品国产18久久久久久二百
|
超碰网址
|
在线免费观看黄色
|
国产亚洲一区二区三区在线观看
|
日韩在线不卡视频
|
狠狠操狠狠操
|
国产一区二区三区在线看
|
狠狠干美女
|
亚洲视频中文字幕
|
午夜影晥
|
国产a视频
|
精品一区二区免费视频
|
一二三区av
|