導航:首頁 > 編程語言 > 單片機驅動lcd程序

單片機驅動lcd程序

發布時間:2023-11-12 22:11:15

A. 關於單片機液晶屏LCD12864的程序

/*****************************************************************

*程序名稱:帶漢字型檔的12864液晶顯示模塊驅動

*程序功能:顯示字元 、漢字和圖片

*開發工具:Kile

* MCU型號:AT89S52-24PU

*時鍾頻率:11.0592MHZ

*程序作者:yuan

*版權說明:yuan

*****************************************************************/
#include<reg52.h>
#include "lcd.h"
#include "util.h"

sbit E=P1^5;//脈沖使能
sbit RW=P1^6;//讀寫選擇
sbit RS=P1^7;//數據命令選擇
sbit rst=P3^6;//12864復位

// 延時ms函數:

// 12864檢查狀態函數:
void Check12864State(void)
{

P0=0xff;
E=0;//讀狀態前三控制線的狀態
RS=0;
RW=1;
E=1;//拉高,讀狀態
while((P0&0x80)==0x80);//等待空閑
E=0;//寫命令後三控制線的狀態
RS=1;
RW=0;

}

// 12864寫命令函數:
void Write12864Command( unsigned char com)
{

Check12864State();//檢查狀態
P0=com;//賦值
E=0;//寫命令前三控制線的狀態
RS=0;
RW=0;
E=1;//拉高,寫命令
E=0;//寫命令後三控制線的狀態
RS=1;
RW=1;

}

//12864寫數據函數:
void Write12864Data( unsigned char dat)
{

Check12864State();//檢查狀態
P0=dat;//賦值
E=0;//寫數據前三控制線的狀態
RS=1;
RW=0;
E=1;//拉高,寫數據
E=0;//寫數據後三控制線的狀態
RS=0;
RW=1;

}

//在指定的位置顯示字元串(漢字和ASCII碼字元)函數:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行數值0-3,x-列數值0-7,pstr-字元串指針
//12864可以顯示32個漢字(四行每行8個),一個地址對應一個漢字
//可以顯示64個ASCII碼字元(四行每行16個),一個地址對應兩個字元
//為了實現自動換行功能,這個函數比較繁瑣
{

unsigned char row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址計數器自動加以,游標右移
switch(y)//根據行號選擇行地址
{

case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;

}

Write12864Command(row+x);//寫地址
while(*pstr!='\0')
{

Write12864Data(*pstr);//寫字元
pstr++;
n++;//計數
if((n+x*2)==16)//如果一行寫完 ,繼續寫第二行
{
if(y==0) Write12864Command(0x90);//寫下一行地址
else if(y==1) Write12864Command(0x88);//寫下一行地址
else if(y==2) Write12864Command(0x98);//寫下一行地址
else ;

}
else if((n+x*2)==32)//如果第二行寫完 ,繼續寫第三行
{

if(y==0) Write12864Command(0x88);//寫下一行地址
else if(y==1) Write12864Command(0x98);//寫下一行地址
else ;
}

else if((n+x*2)==48)//如果第三行寫完 ,繼續寫第四行
{
if(y==0) Write12864Command(0x98);//寫下一行地址
else ;
}
else ;
}

}

//圖片模式清屏函數:
void Clear12864Screen()
{

unsigned char i,j;
Write12864Command(0x34);//功能設定:8位控制方式,使用擴充指令
Write12864Command(0x36);//使用擴充指令,繪圖顯示控制
for(i=0;i<32;i++)

//ST7920可控制256*32點陣(32行256列),而12864液晶實際的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址從第128列劃分一半出來的,所以分為上下兩半屏,

//也就是說第0行和第32行同屬一行,行地址相同;第1行和第33行同屬一行,以此類推

{

Write12864Command(0x80|i);//寫行地址(垂直地址)
Write12864Command(0x80);//寫列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏

}

}

//在任意位置顯示任意大小的圖片函數:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(數值0-63),x-起始列(16位寬,數值0-7),

//px-圖片寬度,py-圖片高度,pp-指針指向圖片數組

//因為上下屏的地址不連續,要在任意位置顯示完整的圖像,處理起來比較繁瑣

{

unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{

k=32-y;//算出上半屏的行數
for(i=0;i<k;i++,y++)//上半屏行數
{
Write12864Command(0x80|y);//寫行地址(垂直地址)
Write12864Command(0x80|x);//寫列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//寫圖片數據

}

y=0;//下半屏起始行,接上半屏繼續寫數據
for(;i<py;i++,y++)//下半屏剩下的行數
{

Write12864Command(0x80|y);//寫行地址(垂直地址)
Write12864Command(0x80|(8+x));//寫列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//寫圖片數據

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行數
{
Write12864Command(0x80|(y-32));//寫行地址(垂直地址)
Write12864Command(0x80|(8+x));//寫列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//寫圖片數據

}

}

}

void Clear12864Text()
{
Write12864Command(0x34);//清屏
DelayMs(5);
Write12864Command(0x30);//清屏
DelayMs(5);
Write12864Command(0x01);//清屏
DelayMs(5);
}

//12864初始化函數:
void Initialize12864()
{

rst=0;//復位12864
DelayMs(30);
rst=1;
DelayMs(20);
Write12864Command(0x30);//功能設定:8位控制方式,使用基本指令
Write12864Command(0x08);//顯示關
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址計數器加一、游標右移
Write12864Command(0x0c);//顯示開

}

帶字型檔的驅動

B. 單片機如何驅動LCD顯示字元

首先你要確定你的LCD是什麼型號,是否有字型檔 等等, 而後對應找這個型號的datasheet 查看怎麼驅動他。一般都會有例子,多逛逛單片機論壇吧 有用的。別老來網路問些不知道怎麼回答的問題
下面我給一個單片機驅動1602液晶的部分代碼,希望有用。
/*******************************************************************************
1602LCD
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define unit unsigned int
#define char unsigned char

sbit rs = P2^1;
sbit rw = P2^2;
sbit ep = P2^0;
char code ask[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xb0};
/* 0 1 2 3 4 5 6 7 8 9 - */
char code dis1[] = {"welcome!"};
char code dis2[] = {"pzowen love you!"};

//***********************************************//
//***********************************************//
///////////////////////////////////////////////////
///////////////////////////////////////////////////
delay(char ms)
{ // 延時子程序
char i;
while(ms--)
{
for(i = 0; i<250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

lcd_wcmd(char cmd)
{ // 寫入指令數據到LCD
delay(1);
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;

}

lcd_pos(char pos)
{ //pos=0x40; //設定顯示位置
lcd_wcmd(pos|0x80);
//lcd_wcmd(pos);

}

lcd_wdat(char dat)
{ //寫入字元顯示數據到LCD
delay(1);
rs = 1;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;

}

lcd_init()
{
delay(1); //LCD初始化設定
lcd_wcmd(0x38); //顯示模式設置:單行,8字元,5x7點陣
delay(1);
delay(1);
lcd_wcmd(0x0c); //開顯示,關游標,不閃爍
delay(1);
delay(1);
lcd_wcmd(0x06); //設置輸入模式:游標增量移動,顯示不移位
delay(1);
delay(1);
//lcd_wcmd(0x01); //清除LCD顯示的內容
//delay(1);

}

void main()
{
char i;
char k;
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(0x04); // 設置顯示位置為第一行的第5個字元
i = 0;
while(dis1[i]!='\0')
{ // 顯示字元"welcome!"
lcd_wdat(dis1[i]);
//lcd_wdat(ask[xianshi[i]]);
delay(30);
i++;
}
//lcd_wdat(xianshi[1]);
//delay(30);

delay(20);
lcd_init();
delay(10);
lcd_pos(0x40); // 設置顯示位置為第二行第二個字元
delay(10);
i = 0;
while(dis2[i]!='\0')
{
lcd_wdat(dis2[i]); // 顯示字元" "
//lcd_wdat(ask[xianshi[i]]);
delay(30);
i++;
}

C. 問一個單片機LCD的驅動程序的問題

先解釋第一來個問題:0x80是LCD1602第一行的源首地址,0x40是第二行的首地址。你問為什麼要算?其實是在計算地址碼,計算方法就是讓 首地址+偏移量。參數x是偏移量,y是控制第一行還是第二行。比如x=0,y=0時,該字元會顯示在液晶屏幕第一行的第一個字元處,x=15,y=1時,該字元會顯示在第二行最後一個字元處。
第二個問題:你看一下ASIC ii 對照表就清楚了,0x20之前表示的是特殊符號,電腦上常用的。0x20之後(0x20是空格,液晶也能顯示)的所有字元都是液晶能夠顯示的。由於每一個字元串尾部編譯器會自動給添加一個空字元,來表示字元串結尾(空字元的asic ii 碼是0x00,屬於0x20之前的),所以當檢測到asic ii 碼小於0x20字元的時候自動跳出循環。那個條件其實可以改為
while(DData[ListLength]!=0x00),或者while(DData[ListLength]!='\0')。'\0'也表示空字元。

閱讀全文

與單片機驅動lcd程序相關的資料

熱點內容
java幫助文件在哪裡 瀏覽:965
win10切換輸入語言 瀏覽:696
haier電視網路用不了怎麼辦 瀏覽:361
蘋果6手機id怎麼更改 瀏覽:179
米家掃地機器人下載什麼app 瀏覽:82
如何在編程貓代碼島20種樹 瀏覽:915
手機基礎信息存儲在哪個文件 瀏覽:726
如何查找手機備份文件 瀏覽:792
內存清理工具formac 瀏覽:323
iphone過濾騷擾電話 瀏覽:981
wap網路如何使用微信 瀏覽:699
手機迅雷應用盒子在哪個文件夾 瀏覽:351
windows8網路連接 瀏覽:442
怎麼快速增加qq群人數 瀏覽:919
錘子視頻播放器文件不存在 瀏覽:707
蘋果手機怎麼清理app緩存 瀏覽:682
花園戰爭2豪華升級包 瀏覽:517
電腦無法向u盤傳輸文件 瀏覽:823
bpn配置文件 瀏覽:932
501完美越獄工具 瀏覽:119

友情鏈接