導航:首頁 > 操作系統 > 51單片機lcd程序

51單片機lcd程序

發布時間:2022-11-26 10:44:33

A. 51單片機LCD顯示程序,請求C語言高手解答

不知你用的LCD屬於那種型號,似乎不像1602。

如果得到的數值小於1000,就正常顯示個十白位的數字,比如345就顯示34.5;如果大於1000,3個賦值都是0x39,即ASCII字元『9』,這樣的結果就是會在LCD上顯示99.9,表示超過1000的量程范圍。

猜測REQ是對LCD寫控制信號,busy是LCD返回的「忙」信號,for循環16次就是把lcdtem字元數組中的16個字元寫到LCD上顯示。

B. C51單片機怎麼讓lcd1602顯示兩行

LCD1602,都是顯示兩行的。
不需要什麼特殊的操作,就能顯示兩行。

樓主提出這樣的問題,也不給出電路和語言的要求,很難回答的。

看看我的網路空間吧,有這樣的程序和電路。

C. 求教一個51單片機程序。。(LCD電子時鍾)

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
#define yh 0x80
#define er 0x80+0x40//液晶屏的與 C51 之間的引腳連接定義
sbit rs=P2^5;
sbit en=P2^7;
sbit rw=P2^6;//如果硬體上 rw 接地,就不用寫這句和後面的 rw=0
//DS1302 時鍾晶元與 C51 之間的引腳連接定義
sbit IO=P3^6;
sbit SCLK=P3^5;
sbit RST=P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;//校時按鍵與 C51 的引腳連接定義
sbit key1=P3^2;//設置鍵
sbit key2=P3^3;//加鍵
sbit key3=P3^4;//減鍵
uchar code tab1[]={"20//////////"};//年顯示的固定字元
uchar code tab2[]={"LOVE ::::::"};//時間顯示的固定字元

//延時函數,後面經常調用
void delay(uint xms)//延時函數,有參函數
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/********液晶寫入指令函數與寫入數據函數,以後可調用**************/
write_1602com(uchar com) //****液晶寫入指令函數****
{
rs=0; //數據/指令選擇置為指令
rw=0; //讀寫選擇 置為寫
P0=com; //送入數據
delay(1);
en=1; //拉高使能端,為製造有效的下降沿做准備
delay(1);
en=0;
//en 由高變低,產生下降沿,液晶執行命令
}

write_1602dat(uchar dat) //***液晶寫入數據函數****
{
rs=1; //數據/指令選擇置為數據
rw=0; //讀寫選擇置為寫
P0=dat; //送入數據
delay(1);
en=1; //en 置高電平,為製造下降沿做准備
delay(1);
en=0; //en 由高變低,產生下降沿,液晶執行命令

}

lcd_init() //***液晶初始化函數****//
{
write_1602com(0x38); //設置液晶工作模式,意思:16*2 行顯示,5*7 點陣,8 位數據
write_1602com(0x0c); //開顯示不顯示游標
write_1602com(0x06); //整屏不移動,游標自動右移
write_1602com(0x01); //清顯示
write_1602com(yh+1); //日歷顯示固定符號從第一行第 1 個位置之後開始顯示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]); //向液晶屏寫日歷顯示的固定符號部分
}
write_1602com(er+1);//時間顯示固定符號寫入位置,從第 2 個位置後開始顯示
for(a=0;a<12;a++)
{
write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
}
}
/***************DS1302 有關子函數********************/
void write_byte(uchar dat)//寫一個位元組
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;//相當於匯編中的 RRC
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte() //讀一個位元組
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------//
void write_1302(uchar add,uchar dat) //向 1302 晶元寫函數,指定寫入地址,數據
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //從 1302 讀數據函數,指定讀取數據來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD 碼轉十進制函數,輸入 BCD,返回十進制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------//
void ds1302_init()//1302 晶元初始化子函數(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x8e,0x80);//打開防寫
}
//時分秒顯示子函數
void write_sfm(uchar add,uchar dat)//向 LCD 寫時分秒,有顯示位置加、現示數據,兩個參數
{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(er+add);//er 是頭文件規定的值 0x80+0x40
write_1602dat(0x30+sw);//數字+30 得到該數字的 LCD1602 顯示碼
write_1602dat(0x30+gw);//數字+30 得到該數字的 LCD1602 顯示碼
}
//年月日顯示子函數
void write_nyr(uchar add,uchar dat)//向 LCD 寫年月日,有顯示位置加數、顯示數據,兩個參數
{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(yh+add);//設定顯示位置為第一個位置+add
write_1602dat(0x30+sw);//數字+30 得到該數字的 LCD1602 顯示碼
write_1602dat(0x30+gw);//數字+30 得到該數字的 LCD1602 顯示碼
}
void write_week(uchar week)//寫星期函數
{
write_1602com(yh+0x0c);//星期字元的顯示位置
switch(week)
{
case 1:write_1602dat('M');//星期數為一時,顯示
write_1602dat('o');
write_1602dat('n');break;
case 2:write_1602dat('T');//星期數據為二時顯示
write_1602dat('u');
write_1602dat('e');break;
case 3:write_1602dat('W');//星期數據為三時顯示
write_1602dat('e');
write_1602dat('d');break;
case 4:write_1602dat('T');//星期數據為四是顯示
write_1602dat('h');
write_1602dat('u');break;
case 5:write_1602dat('F');//星期數據為五時顯示
write_1602dat('r');
write_1602dat('i');break;
case 6:write_1602dat('S');//星期數據為六時顯示
write_1602dat('t');
write_1602dat('a');break;
case 7:write_1602dat('S');//星期數據為日時顯示
write_1602dat('u');
write_1602dat('n');break;
}
}
//****************鍵盤掃描有關函數**********************
void keyscan()
{
if(key1==0)//key1 為功能鍵(設置鍵)
{
delay(9);//延時,用於消抖動
if(key1==0)//延時後再次確認按鍵按下
{
delay(20);
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8 個功能循環
switch(key1n)
{
case 1:TR0=0;//關閉定時器
write_1602com(er+0x0E);//設置按鍵按動一次,秒位置顯示游標
write_1602com(0x0f);//設置游標為閃爍
temp=(miao)/10*16+(miao)%10;//秒數據寫入 DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
case 2:write_1602com(er+11);//按 2 次 fen 位置顯示游標
break;
case 3:write_1602com(er+8);//按動 3 次,shi
break;
case 4:write_1602com(yh+0x0e);//按動 4 次,week
break;
case 5:write_1602com(yh+0x0a);//按動 5 次,ri
break;
case 6:write_1602com(yh+0x07);//按動 6 次,yue
break;
case 7:write_1602com(yh+0x04);//按動 7 次,nian
break;
case 8:write_1602com(0x0c);//按動到第 8 次,設置游標不閃爍
TR0=1;//打開定時器
TR0=1;
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao 數據寫入 DS1302
write_1302(0x8e,0x80);break;
}
}
}
//------------------------------加鍵 key2----------------------------//
if(key1n!=0)//當 key1 按下以下。再按以下鍵才有效(按鍵次數不等於零)
{
if(key2==0)//上調鍵
{
delay(10);
if(key2==0)
{
delay(20);
while(!key2);
switch(key1n)
{
case 1:miao++;//設置鍵按動 1 次,調秒
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x0A,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C) ;
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
//------------------減鍵 key3,各句功能參照'加鍵'注釋---------------
if(key3==0)
{
delay(10);
//調延時,消抖動
if(key3==0)
{
delay(20);
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(10,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十進制轉換成 DS1302 要求的 DCB 碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x86,temp);//向 DS1302 內寫日期寄存器 86H 寫入調整後的日期數據 BCD 碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+10);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10; //十進制轉換成 DS1302 要求的 DCB 碼
write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x88,temp); //向 DS1302 內寫月份寄存器 88H 寫入調整後的月份數據 BCD 碼
write_1302(0x8e,0x80); //打開防寫
write_1602com(yh+7); //因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10; //十進制轉換成 DS1302 要求的 DCB 碼
write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x8c,temp); //向 DS1302 內寫年份寄存器 8cH 寫入調整後的年份數據 BCD 碼
write_1302(0x8e,0x80); //打開防寫
write_1602com(yh+4); //因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
}
}
}
}
}
void init()
//定時器、計數器設置函數
{
TMOD=0x11;
//指定定時/計數器的工作方式為 3
TH0=0;
//定時器 T0 的高四位=0
TL0=0;
//定時器 T0 的低四位=0
EA=1;
//系統允許有開放的中斷
ET0=1;
//允許 T0 中斷
TR0=1;
//開啟中斷,啟動定時器
}
//*******************主函數**************************
void main()
{
lcd_init(); //調用液晶屏初始化子函數
ds1302_init(); //調用 DS1302 時鍾的初始化子函數
init(); //調用定時計數器的設置子函數
delay(80);
while(1)
//無限循環下面的語句:
{
keyscan();
//調用鍵盤掃描子函數
}
}
void timer0() interrupt 1 //取得並顯示日歷和時間
{ //讀取秒時分周日月年七個數據(DS1302 的讀寄存器與寫寄存器不一樣)
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//顯示秒、時、分數據:
write_sfm(13,miao); //秒,從第二行第 8 個字後開始顯示(調用時分秒顯示子函數)
write_sfm(10,fen); //分,從第二行第 5 個字元後開始顯示
write_sfm(7,shi); //小時,從第二行第 2 個字元後開始顯示
//顯示日、月、年數據:
write_nyr(9,ri); //日期,從第二行第 9 個字元後開始顯示
write_nyr(6,yue); //月份,從第二行第 6 個字元後開始顯示
write_nyr(3,nian); //年,從第二行第 3 個字元後開始顯示
write_week(week);
}

D. 51單片機lcd顯示c語言程序

不知你用的LCD屬於那種型號,似乎不像1602。

如果得到的數值小於1000,就正常顯示個十白位的數字,比如345就顯示34.5;如果大於1000,3個賦值都是0x39,即ASCII字元『9』,這樣的結果就是會在LCD上顯示99.9,表示超過1000的量程范圍。

猜測REQ是對LCD寫控制信號,busy是LCD返回的「忙」信號,for循環16次就是把lcdtem字元數組中的16個字元寫到LCD上顯示。
以上回答你滿意么?

E. 51單片機lcd燈的一段c編譯的代碼求注釋

ORG 0100H LTOR: MOV A,#01H LOOP: RR A ;從左到右亮,每次亮一盞 MOV P1,A ACALL DELAY JNB ACC.0,LOOP LOOP1: RL A MOV P1,A ;從右到左亮,每次亮一盞 ACALL DELAY JNB ACC.7,LOOP1 LOOP2: RR A ORL A,#80H MOV P1,A ;從左到右依次點亮每一盞燈 ACALL DELAY JNB ACC.0,LOOP2 LOOP3: RL A ANL A,#0FEH MOV P1,A ;從右到左依次熄滅每一盞燈 ACALL DELAY JB ACC.7,LOOP3 SJMP LTOR DELAY: MOV R6,#01H ;延時子程序 L2: MOV R7,#01H L1: NOP DJNZ R7,L1 DJNZ R6,L2 RET END

F. 求51單片機LCD12864串列顯示程序,只用SID口和SCLK口,能顯示輸出四行中文的,最好寫上main函數,謝謝

//LCD12864字型檔系列(控制器ST7920A),單片機:89S52,晶振:12M,
//串口連接 與 並口連接 ( 串口時 屏蔽 並行模塊)
//並行連接方式,P2.0-RS,P2.1-RW,P2.2-E
#include<reg52.h>
#include <intrins.h>
sbit RS=P3^2; //串口時為CS
sbit RW=P3^1; //串口為SID
sbit E=P3^0; //串口為時鍾SCLK
sbit stop=P2^2;
sbit PSB=P3^4;
sbit REST=P3^3;
//以下是用<at89x51.h>頭文件的定義
/*
#define RS P2_0
#define RW P2_1 //定義引腳
#define E P2_2
#define PSB P2_3
#define REST P2_4
#define Data P1
#include<at89x51.h>
*/
#define BF 0x80 //用於檢測LCM狀態字中的Busy標識
typedef unsigned int Uint;
typedef unsigned char Uchar;
//字元串例子
//"F1--English",也可以往裡面寫入漢字碼,一個漢字由兩個碼組成
const Uchar F1English[]={0x46,0x31,0x2d,0x2d,0x45,0x6e,0x67,0x6c,0x69,0x73,0x68,0x00};
const Uchar lengthF1=6; //字元串長度
//漢字,直接可以寫入字形
unsigned char code uctech[] = {"有限公司"};
const Uchar lengthCF3=8;
Uchar code TAB1[]={
/*-- 調入了一幅圖像:D:\公司的文件\程序圖片\未命名11.bmp --*/
/*-- 寬度x高度=128x64 --*/
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x05,0xAE,0x90,0x00,0x00,0x00,0x00,0x00,
0x95,0x55,0x48,0x80,0x00,0x00,0x00,0x00,
0x2B,0x55,0x00,0x00,0x00,0x00,0x00,0x00,
0xA8,0x00,0x22,0x15,0x20,0x00,0x00,0x00,
0x97,0xFB,0x00,0x00,0x00,0x00,0x00,0x00,
0x45,0x55,0x08,0xA0,0x00,0x00,0x00,0x0A,
0x6F,0xF4,0x00,0x00,0x00,0x00,0x00,0x00,
0xB2,0x80,0x40,0x00,0x04,0x40,0x00,0x00,
0xBA,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x4D,0x55,0x15,0x15,0x20,0x00,0x00,0x95,
0xD5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE8,0x40,0x40,0x00,0x00,0x00,0x4A,
0xAA,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0x2A,0x00,0x40,0x00,0x00,0x15,
0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFD,0xD0,0xAA,0x01,0x00,0x00,0x25,
0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xB6,0x00,0x10,0x00,0x01,0x4A,
0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFD,0xE8,0x40,0x00,0x00,0x11,
0x00,0x24,0x84,0x00,0x00,0x00,0x00,0x00,
0xAB,0xFF,0xFF,0x55,0x00,0x00,0x00,0x24,
0x02,0x49,0x5E,0xA0,0x00,0x00,0x00,0x00,
0x84,0xBF,0xFF,0xF4,0x88,0x00,0x00,0x00,
0x10,0x05,0xFF,0xF4,0x00,0x00,0x00,0x00,
0x29,0x0B,0xFF,0xFA,0x20,0x00,0x00,0x00,
0x02,0xBF,0xFF,0xFC,0x00,0x00,0x00,0x00,
0x44,0xA0,0x57,0xFD,0x80,0x00,0x00,0x00,
0x08,0x5F,0xFF,0xFF,0x80,0x00,0x00,0x00,
0x91,0x0A,0xAA,0xF6,0x50,0x00,0x00,0x00,
0x41,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,
0x44,0xA0,0x01,0x1B,0x84,0x00,0x00,0x00,
0x26,0xFF,0xFF,0xFF,0x90,0x00,0x00,0x00,
0x11,0x0A,0xAA,0x6D,0x68,0x00,0x00,0x00,
0x0B,0xFB,0xFF,0xEF,0xE0,0x00,0x00,0x00,
0xC4,0xA0,0x01,0x02,0x80,0x00,0x00,0x00,
0x43,0xF1,0xFE,0x63,0xF0,0x00,0x00,0x00,
0x15,0x55,0x54,0x55,0x6A,0x00,0x00,0x00,
0x9F,0xE3,0xFC,0x87,0x38,0x00,0x00,0x00,
0xCA,0xAB,0x91,0x00,0x90,0x00,0x00,0x00,
0x07,0xC1,0xFA,0x2A,0x80,0x00,0x00,0x00,
0x25,0xFF,0xFE,0x95,0x2A,0x00,0x00,0x00,
0x2F,0x13,0xFE,0xFC,0x10,0x00,0x00,0x00,
0x95,0xFF,0xFF,0xC0,0x50,0x00,0x00,0x00,
0x0F,0x41,0xFF,0xF3,0x80,0x00,0x00,0x00,
0x4F,0xFF,0xFF,0xF9,0x2A,0x00,0x00,0x00,
0x9F,0x08,0xFF,0xD4,0x00,0x00,0x00,0x00,
0xB3,0xFF,0xFF,0xFE,0x54,0x80,0x00,0x00,
0x1E,0xA0,0x7F,0xA0,0x00,0x00,0x00,0x00,
0x5F,0xFE,0x7F,0xFE,0xAA,0x00,0x00,0x00,
0x5F,0x57,0xFE,0x00,0x00,0x00,0x00,0x00,
0xAF,0xFD,0x7F,0xFF,0x94,0x80,0x00,0x00,
0x1F,0xFE,0xE8,0x00,0x00,0x00,0x00,0x00,
0x7F,0xFA,0x7F,0x5F,0xCA,0x00,0x00,0x00,
0x3F,0x55,0x00,0x00,0x00,0x00,0x00,0x00,
0xAF,0xF1,0x7F,0xDE,0xF5,0x40,0x00,0x00,
0x1A,0xA0,0x80,0x00,0x00,0x00,0x00,0x00,
0xDF,0xF2,0x3F,0xFC,0xC2,0x00,0x00,0x00,
0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
0x2F,0xFA,0xBF,0xFF,0xF4,0xA0,0x00,0x00,
0x05,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
0x97,0xFE,0x3F,0xFF,0xE3,0x00,0x00,0x00,
0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x68,0xFF,0xDF,0xD5,0x78,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0x5F,0xFF,0x48,0x02,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xD0,0xAA,0xF4,0xA0,0xAA,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0A,0x45,0x09,0x05,0x11,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xA1,0x28,0xA0,0x00,0x44,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x42,0x04,0x52,0x12,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xA5,0x09,0x51,0x00,0x48,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x50,0x04,0x4A,0x12,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xAA,0x05,0x50,0x21,0x48,0x20,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x90,0x02,0x84,0x12,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xD4,0x05,0x48,0x10,0x48,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x81,0x20,0x00,0x02,0x02,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xA4,0x84,0x92,0x48,0x94,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x48,0x10,0x00,0x00,0x21,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
//這個是在串口時指令和數據之間的延時
/*
void delay10US(Uchar x)
{
Uchar k;
for(k=0;k<x;k++);
}
*/
const Uchar delay=250; //延時時間常數
static void Wait1ms(void)//延遲1 ms
{
Uchar cnt=0;
while (cnt<delay) cnt++;
}
//延遲n ms
void WaitNms(int n)
{
Uchar i;
for(i=1;i<=n;i++)
Wait1ms();
}
void stopint(void)//中斷程序
{
if(stop==0)
while(1);
}
//**************************************************************************//
//以下是並口時才開的
//讀忙標志,
void RDBF(void)
{
Uchar temp;
RS=0; // RS=0
RW=1; // RW=1
while(1)
{
P1=0xFF; //數據線為輸入
E=1;
temp=P1;
E=0; // E=0
if ((temp&0x80)==0) break;
}
}
//寫數據到指令寄存器
void WRCommand(Uchar comm)
{
RDBF();
RW=0;
P1=comm;
E=1;
E=0;
}
//寫數據到數據寄存器
void WRData(Uchar TEMP)
{
RDBF();
RS=1;
RW=0;
P1=TEMP;
E=1;
E=0;
stopint();
}
/////////////////////////////////////////////////////////////////////////////////
//以下是串口時開的讀寫時序
/*void SendByteLCD(Uchar WLCDData)
{
Uchar i;
for(i=0;i<8;i++)
{
if((WLCDData<<i)&0x80)RW=1;
else RW=0;
E=0;
E=1 ;
}
}
SPIWR(Uchar Wdata,Uchar WRS)
{
SendByteLCD(0xf8+(WRS<<1));
SendByteLCD(Wdata&0xf0);
SendByteLCD((Wdata<<4)&0xf0);
}
void WRCommand(Uchar CMD)
{
RS=0;
RS=1;
SPIWR(CMD,0);
delay10US(90);//89S52來模擬串列通信,所以,加上89S52的延時,
}
void WRData(Uchar Data)
{
RS=0;
RS=1;
SPIWR(Data,1);
}
*/
/*******************************************************************/
//初始化LCD-8位介面
void LCDInit(void)
{ // PSB=0; //串口
PSB=1;//並口時選這個,上一行取消
REST=1;
REST=0;
REST=1;
WRCommand(0x30); //基本指令集,8位並行
WRCommand(0x06); //啟始點設定:游標右移
WRCommand(0x01); //清除顯示DDRAM
WRCommand(0x0C); //顯示狀態開關:整體顯示開,游標顯示關,游標顯示反白關
WRCommand(0x02); //地址歸零
}
//顯示數組字元串(顯示半寬字型16*8點陣)
void ShowQQChar(Uchar addr,Uchar *english,Uchar count)
{
Uchar i;
WRCommand(addr); //設定DDRAM地址
for(i=0;i<count;)
{
WRData(english[i*2]);
WRData(english[i*2+1]);
i++;
}
}
//顯示連續字串(半寬字元)
void ShowNUMChar(Uchar addr,Uchar i,Uchar count)
{
Uchar j;
for(j=0;j<count;)
{
WRCommand(addr); //設定DDRAM地址
WRData(i+j);
j++;
WRData(i+j);
addr++;
j++;
}
}
//自定義字元寫入CGRAM
void WRCGRAM(Uchar data1,Uchar data2,Uchar addr)
{
Uchar i;
for(i=0;i<16;)
{
WRCommand(addr+i); //設定CGRAM地址
WRData(data1);
WRData(data1);
i++;
WRCommand(addr+i); //設定CGRAM地址
WRData(data2);
WRData(data2);
i++;
}
}
//顯示自定義的字元,並把這個字元填滿全屏16*16
void ShowCGChar(Uchar addr,Uchar i)
{
Uchar j;
for(j=0;j<0x20;)
{
WRCommand(addr+j); //設定DDRAM地址
WRData(0x00);
WRData(i);
j++;
}
}
void CLEARGDRAM(void)
{
Uchar j;
Uchar i;
WRCommand(0x34);
WRCommand(0x36);
for(j=0;j<32;j++)
{
WRCommand(0x80+j);
WRCommand(0x80);//X坐標
for(i=0;i<32;i++)//
{
WRData(0x00);
}
}

}
//寫入GDRAM 繪圖,Y是Y繪圖坐標,2個位元組一行,CLONG是圖形長度,以位元組
//為單位;HIGHT是圖形高度,TAB是圖形數據表.12864M的圖形顯示是相當於256*32點陣.
//由兩屏128*32上下兩屏組成,同一行的下屏的頭地址緊接上屏的未地址。
//繪圖在串口輸入時,會比在並口下的輸入要慢一些
void WRGDRAM(Uchar Y1,Uchar clong,Uchar hight,Uchar *TAB1)
{
Uint k;
Uchar j;
Uchar i;
WRCommand(0x34);
WRCommand(0x36);
for(j=0;j<hight;j++)//32
{ //先上半屏
WRCommand(Y1+j); //Y總坐標,即第幾行
WRCommand(0x80);//X坐標,即橫數第幾個位元組開始寫起
for(i=0;i<clong;i++)//
{
WRData(TAB1[clong*j+i]);
}
//後下半屏

for(k=0;k<clong;k++)//
{
WRData(TAB1[clong*(j+hight)+k]);
}

}
}
void menu(void)
{
LCDInit();
ShowNUMChar(0x80,0x01,0x0f);//顯示半寬特殊符號
ShowNUMChar(0x90,0x30,0x0f);//顯示半寬0~?數字標點
ShowNUMChar(0x88,0x41,0x0f);//顯示半寬A~P大寫
ShowNUMChar(0x98,0x61,0x0f);//顯示半寬a~p小寫
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
WRCGRAM(0xff,0x00,0x40);//寫入橫
WRCGRAM(0x00,0xff,0x50);//寫入橫2
WRCGRAM(0xaa,0xaa,0x60);//寫入豎
WRCGRAM(0x55,0x55,0x70);//寫入豎2
ShowCGChar(0x80,0x00);//顯示橫並填滿
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
ShowCGChar(0x80,02);//顯示橫2並填滿
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
ShowCGChar(0x80,04);//顯示豎並填滿
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
ShowCGChar(0x80,06);//顯示豎2並填滿
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
WRCGRAM(0x00,0x00,0x40);//清CGRAM1
WRCGRAM(0x00,0x00,0x50);//清CGRAM2
WRCGRAM(0xaa,0x55,0x40);//寫入點
WRCGRAM(0x55,0xaa,0x50);//寫入點2
ShowCGChar(0x80,00);//顯示點並填滿
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
ShowCGChar(0x80,02);//顯示點2並填滿
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
ShowQQChar(0x80,uctech,lengthCF3);//顯示'有限公司',以下共四行
ShowQQChar(0x90,uctech,lengthCF3);
ShowQQChar(0x88,uctech,lengthCF3);
ShowQQChar(0x98,uctech,lengthCF3);
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
WRCommand(0x01); //清除顯示DDRAM
}
void menu2(void)
{ CLEARGDRAM();
WRGDRAM(0x80,16,32,TAB1);
WaitNms(250); //等待時間
WaitNms(250); //等待時間
stopint();
}
//主函數
void main(void)
{
menu();//初始化及半寬字元和點橫豎漢字掃描
menu2();//繪圖顯示
for(;;)
{;}
}

G. 51單片機系列溫度採集LCD162顯示溫度系統C程序

這是我自己用過的DS18B20的程序,有什麼問題可以網路HI我,我這個是把溫度顯示到電腦上了,如果你要顯示到LCD上的話可以在裡面加一些子程序。
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit ds=P1^0;
bit flag;
uchar count_t0;
float f_temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=122;y>0;y--);
}
void init() // 串口初始化
{
TMOD=0x21;
SCON=0x50;
TH0=0x4c;
TL0=0x00;
TH1=0xf3;
TL1=0xf3;
EA=1;
ET0=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
if(++count_t0>=20)
{
count_t0=0;
flag=1;
}
}
void dsreset()
{
uint i;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
bit read_bit()
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;
while(i>0)
i--;
return dat;
}
uchar read_byte()
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=read_bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void write_byte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;
while(i>0)
i--;
}
else
{
ds=0;
i=8;
while(i>0)
i--;
ds=1;
i++;i++;
}
}
}
void begin_change()
{
dsreset();
delay(1);
write_byte(0xcc);
write_byte(0x44);
}
float get_temp()
{
uchar a,b;
uint temp;
float f_temp;
dsreset();
delay(1);
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return f_temp;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
flag=0;
begin_change();
TI=1;
printf("The tempeature is %f\n",get_temp());
while(!TI);
TI=0;
}
}
}

H. 用51單片機控制TH12864-15LCD顯示文字程序

/***12864並行介面參考程序,控制器st7920*/
#include <reg51.h>
#include <intrins.h>
sbit RS = P3^0;
sbit RW = P3^3;
sbit E = P3^4;
sbit PSB = P3^1; //串並口選擇
sbit RES = P3^5;
#define FIRST_ADDR 0 //定義字元/漢字顯示起始位置
//延時子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++);
for(j=0;j<10;j++);
}
//測忙
void chk_busy()
{ RS=0;
RW=1;
E=1;
while((P1&0x80)==0x80);
E=0;
}
//讀數據
unsigned char lcdrd()
{ unsigned char i;
P3=0xFB;
_nop_();
E=1;
delay(5);
i=P1;
_nop_();
E=0;
return i;
}
//寫數據
void lcdwd(unsigned char dispdata)
{ chk_busy();
_nop_();
RS=1;
RW=0;
E=1;
P1=dispdata;
delay(5);
_nop_();
E=0;
_nop_();
P1=0xff;
}
//寫指令代碼
void lcdwc(unsigned char cmdcode)
{ chk_busy();
_nop_();
RS=0;
RW=0;
E=1;
P1=cmdcode;
delay(5);
_nop_();
E=0;
_nop_();
P1=0xff;
}
//初始化
void lcdreset()
{ delay(2000);
lcdwc(0x30); //選擇基本指令集
lcdwc(0x30); //選擇8bit數據流
delay(5);
lcdwc(0x0c); //開顯示(無游標、不反白)
delay(5);
lcdwc(0x01); //清除顯示,並且設定地址指針為00H
delay(5);
lcdwc(0x06); //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位
}
void hzkdis(unsigned char code *s)
{ while(*s>0)
{ lcdwd(*s);
s++;
delay(500);
}
}
void hzklib()
{ lcdwc(0x80+FIRST_ADDR);
hzkdis("少小離家老大回,");
lcdwc(0x90+FIRST_ADDR);
hzkdis("鄉音無改鬢毛衰。");
lcdwc(0x88+FIRST_ADDR);
hzkdis("兒童相見不相識,");
lcdwc(0x98+FIRST_ADDR);
hzkdis("笑問客從何處來。");
}
//整屏顯示
//當ii=0時顯示上面128×32
//當ii=8時顯示下面128×32
void lcdfill(unsigned char disdata)
{ unsigned char x,y,ii;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y+0x80); //行地址
lcdwc(x+0x80+ii); //列地址
lcdwc(0x30);
lcdwd(disdata);
lcdwd(disdata);
}
}
//當ii=0時顯示上面128×32
//當ii=8時顯示下面128×32
void lcdfill_upright(unsigned char disdata)
{ unsigned char x,y,ii;
unsigned char i,f,k;
for(ii=0;ii<9;ii+=8)
for(y=0;y<4;y++)
{ f=disdata;
for(i=0;i<8;i++)
{ if((f&1)==1)
k=0xff;
else
k=0;
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y*8+i+0x80);
lcdwc(x+0x80+ii);
lcdwc(0x30);
lcdwd(k);
lcdwd(k);
}
f>>=1;
}
}
}
main()
{ unsigned char i;
i=0x55;
RES=0;
_nop_();
RES=1;
while(1)
{ PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
lcdwc(0x01);
delay(1000);
lcdfill(0xff);
delay(6000);
lcdfill(i); //顯示豎條
delay(6000);
lcdfill_upright(i); //顯示橫條
delay(6000);
lcdfill(0);
lcdwc(0x01);
delay(1000);
hzklib();
delay(4000);
i=~i;
}
}

I. 最簡單c51單片機液晶顯示程序

光看代碼你是不能了解它的使用歷程的,最好看看使用手冊,下面的代碼是用1602液晶
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";
uchar code table1[]="www.TXMCU.COM";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit la=P2^6;
sbit wela=P2^7;
uchar num;

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
la=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
}
void main()
{
init();
for(num=0;num<11;num++)
{
write_data(table[num]);
delay(20);
}
// write_com(1);
write_com(0x80+0x53);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}
while(1);
}

J. 51單片機 LCD程序輸入後需N次點擊啟動鍵才會顯示輸入的數據

哥們兒,你沒有達到目標啊
你沒有寫按鍵程序

你的location函數可以不用,准確地說不用這么復雜,用一循環就好了

還有你顯示的那句話完全可以用數組啊,這樣你的程序就不用這么繁瑣了!

閱讀全文

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

熱點內容
vs修改編譯時編碼 瀏覽:462
韓國音樂老師電影 瀏覽:523
校園喪屍爆發小說 瀏覽:100
動漫分娩片段 瀏覽:159
東方財富app怎麼查看股票發行價 瀏覽:549
鏟車空調壓縮機支架 瀏覽:348
寶書網手機版txt官網 瀏覽:888
java環境配置win8 瀏覽:892
聯通app28號怎麼簽到不了 瀏覽:149
韓國電影女的要結婚了喜歡了另一個男的 瀏覽:45
全職高手肉版小說 瀏覽:123
轉換磁碟格式打不開命令調試符 瀏覽:60
eclipsejavamysql 瀏覽:723
iphoneappid怎麼取消 瀏覽:465
小仙兒有聲小說 瀏覽:182
罪孽2電影泰國版 瀏覽:757
美國電影蛇妖 瀏覽:684
滿青十大酷型電影 瀏覽:434
dayz進不了伺服器怎麼辦 瀏覽:386
安卓usbdac怎麼使用 瀏覽:939