上一講我們探索了12864的文字模式,這一講我們來看看繪圖模式。上一講中我們給出了繪圖模式的點陣圖(見下圖),是由512組每組16個點構成的點陣。螢幕分為上下兩半,其中每一半佔256組;上半部分x軸方向(0-7),y軸方向(0-31);下半部分x軸方向(8-15),y軸方向(0-31)。如果乙個點為高電平,則被點亮。12864只能以組為單位控制,因此我們只要給乙個16位的二進位制,就可以驅動一組的16個點。下面我們就通過兩個實驗來演示12864是如何顯示一幅圖形的。
實驗一點亮點陣的四角的四個組,先上程式。
main.c
#include "reg51.h"
#include "12864.h"
void main()
}
12864.c
#include "12864.h"
#include "stdio.h"
sbit lcdrs_cs=p3^5;
sbit lcdwr_sid=p3^6;
sbit lcde_clk=p3^7;
/* 資料 0xfa
命令 位址 0xf8
*/void delay(u16 x)
void lcd_send8bit(u8 dat) //向lcd傳送乙個位元組
}void lcd_entrytext() //lcd進入文字模式
void lcd_entrydraw(u8 sw) //lcd進入繪圖模式
else
}void lcd_setaddtext(u8 add) //設定lcd文字模式顯示位址
void lcd_setadddraw(u8 x, u8 y) //設定lcd繪圖模式顯示位址
void lcd_writedat(u8 dat) //向lcd寫入顯示資料
void lcd_writecmd(u8 cmd) //向lcd傳送一條命令
void show_chinese(u8 add, u8 mh, u8 ml) //在lcd上顯示乙個中文
void show_string(u8 add, u8 *str) //lcd顯示字串
}void show_number(u8 add, u16 n) //lcd顯示乙個數字
void show_float(u8 add, float n) //lcd顯示乙個浮點數
void lcd_init()
//-----------------------------------------//
//-------------------繪圖模式--------------//
//-----------------------------------------//
void show_group(u8 x, u8 y,u16 dat) //顯示lcd繪圖模式的一組點
void clean_draw() }
}
12864.h
#include "reg51.h"
#include "stdio.h"
#define u8 unsigned char
#define u16 unsigned int
void delay(u16 x);
void lcd_entrytext();
void lcd_entrydraw(u8 sw);
void lcd_setaddtext(u8 add);
void lcd_setadddraw(u8 x, u8 y);
void lcd_writedat(u8 dat);
void lcd_writecmd(u8 cmd);
void lcd_send8bit(u8 dat);
void show_chinese(u8 add, u8 mh, u8 ml);
void show_string(u8 add, u8 *str);
void show_number(u8 add, u16 n);
void show_float(u8 add, float n);
void lcd_init();
void show_group(u8 x, u8 y,u16 dat); //顯示lcd繪圖模式的一組點
void clean_draw();
#endif
程式分析:整個程式的目標是要能控制乙個組的16個點陣,那麼首先我們要進入繪圖模式,然後設定顯示位址(x,y), 再就是寫16位資料。先看進入繪圖模式,由12864資料手冊知道,繪圖模式進入後有繪圖顯示on與繪圖顯示off兩種操作,這個on開啟與off關閉又是怎麼操作的?資料手冊規定如下。
因此我們首先要關閉繪圖顯示,也就是寫指令lcd_writecmd(0x34),我們把這兩個關閉與開啟指令都放到了lcd_entrydraw(u8 sw)函式,其中sw為1時開啟,為0時關閉。接下來要設定位址,我們新建lcd_setadddraw(x,y)函式,分別寫入xy位址,注意最高位始終為1(如下圖)所以要並上0x80。
接下來便是寫入16位資料,分兩次,先寫高8位,因此先要將資料右移8位,再寫低8位,只需整個資料寫入即可,因為writedat函式會自動擷取低8位。最好再開啟繪圖顯示,完成。整個過程我們放在show_group(u8 x, u8 y,u16 dat) 函式。
void show_group(u8 x, u8 y,u16 dat) //顯示lcd繪圖模式的一組點
最後還要注意新建乙個清屏函式clean_draw(),在每次顯示之前清屏,其實就是令所有點為0,這樣可以保持整個螢幕不出現亂碼。
實驗二顯示一幅
前面我們分析了lcd的點陣分布,分上下兩塊,而每一塊正好有128x32個點,對應一幅128x32的畫素圖。因此如果我們有一幅128x64個畫素點圖,那麼完全可以用12864來表達。因此首先要將這樣一幅圖匯入到畫圖軟體,生成字尾名為.bmp的128x64黑白、單色檔案,再用pctolcd2002軟體生成乙個二進位制檔案,再將二進位制數值複製到工程檔案picture.c中,並做成乙個陣列儲存到rom中。如下:
#include "picture.h"
code unsigned char pic1=;
接下來我們要將陣列中的每兩個資料(也就是16位)去驅動乙個組,這樣陣列的1024個資料便可覆蓋lcd的512組。新建乙個顯示函式到12864.c中,另外我們修改show_group函式成show_groupx函式,這樣做的好處不用頻繁地進行關閉和開啟繪圖顯示。另外乙個要注意的地方是show-picture函式中指標的使用。如何將陣列中相鄰的兩個資料組合成乙個16位資料呢?我們可以使用中間變數t,t=*p++; t<<=8;t|=*p++;,這樣完全行得通。但是使用指標的話,則避免了重複性的操作,減輕了系統負擔。
void show_groupx(u8 x, u8 y,u16 dat) //顯示lcd繪圖模式的一組點
void show_picture(u8 *p)// 顯示一幅128*64的 }
for(y=0;y<32;y++)
}lcd_entrydraw(1);
}
最後我們只需要在main函式中顯示即可。
#include "12864.h"
#include "picture.h"
void main()
}
picture.h
#ifndef _picture_
#define _picture_
code unsigned char pic1;
#endif
微控制器第三講 數碼管的顯示
數碼管分類 共陰極數碼管,共陽極數碼管 數碼管的顯示方式 靜態和動態 共陰級數碼管 1亮0不亮 共陽極數碼管 0亮1不亮 數碼管的基礎知識就不多講了,下面是我寫的幾個數碼管的程式,通過和微控制器連線可以實現其相應的功能。2018.7.22 七段顯示實驗 功能讓數碼管從0到99不停的顯示 includ...
C語言小白教程第三講 常量
說明 寫這個專欄主要是為了鞏固c語言基礎知識。本模組是與全國計算機等級考試 二級c語言接軌。具有重基礎 概念 系統 全面的特點。適合沒有語言基礎的小白同學參考。若有大佬不小心點進此專欄,請移步,不然您會見笑的 哈哈哈哈哈 1 常量是固定值,在程式執行期間不能改變。這些固定的值,又叫做字面量。2 常量...
51微控制器三線序列驅動12864液晶
以前寫12864的液晶程式都是用的並行的方式,這種方式焊接起來很麻煩,而且占用的io口比較多。今天嘗試使用序列方式來驅動該模組。本程式是基於stc89c52的12864序列模式的程式,硬體電路連線只需要5根線,vcc gnd rs rw e 只需要三個個io 口就可以顯示,大大節省了資源。12864...