導航:首頁 > 操作系統 > 單片機LCD亮字母A程序

單片機LCD亮字母A程序

發布時間:2022-05-14 16:11:59

單片機LCD編程

/*************************************************
名 稱:LCD12864_ST7920並行測試程序
試驗功能:測試基於ST7920控制晶元的LCD12864的顯示
並行方式連接;晶振11.0592M
編 寫:JiangX.net
*************************************************/

#include <reg52.h>
#include <ziku.h>
#include <intrins.h>
#include <string.h>

#define uchar unsigned char
#define uint unsigned int //宏定義
#define ulong unsigned long

#define Channal_A 1 //通道A
#define Channal_B 2 //通道B
#define Channal_AB 3 //通道A&B
//**************************一下為函數聲明修**************************************
static void DA_conver(uint Dignum);
extern void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model);
//**************************修改硬體時要修改的部分********************************
sbit DIN = P0^0; //數據輸入端
sbit SCLK = P0^1; //時鍾信號
sbit CS = P0^2; //片選輸入端,低電平有效

/*MAX187介面定義*/
sbit MAX187_CS= P2^6;
sbit MAX187_DO= P2^5;
sbit MAX187_SK= P2^7;

/*****13864LCD介面定義*****/

sbit LCD_RS = P3^7; //1:輸入數據 ;0:輸入命令
sbit LCD_RW = P2^7; //1:讀數據 0:寫數據
sbit LCD_EN = P2^6; //LCM使能端
sbit LCD_PSB = P2^3; //串並口選擇 1:並口模式; 0:串口模式;
#define LCD_DATA P1 //LCD匯流排埠

/*****LCD功能初始化指令*****/
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值為00H
#define AC_INIT 0x02 //將AC設置為00H。且游標移到原點位置
#define CURSE_ADD 0x06 //設定游標移到方向及圖像整體移動方向(默認游標右移,圖像整體不動)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //顯示開,顯示游標,且游標位置反白
#define DISPLAY_OFF 0x08 //顯示關
#define CURSE_DIR 0x14 //游標向右移動:AC=AC+1
#define SET_CG_AC 0x40 //設置AC,范圍為:00H~3FH
#define SET_DD_AC 0x80

/*****漢字地址表*****/
uchar code addr_tab[]={ //便於根據漢字坐標求出地址
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行漢字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行漢字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行漢字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行漢字位置
};

//------------全局變數定義-------------

uchar first[]="MAX187 ";
uchar show187[]="12345";
//uchar code shw187[]="123456";
uchar error[]="ERROR!";
ulong vv;

/*****n(ms)延時子程序*****/
void delayms(uint t) //約延時n(ms)
{
uint i;
while(t--)
{
for(i=0;i<125;i++);
}
}

/*****等待LCD忙*****/
void WaitBusy(void) //延時一小段時間,等待LCD空閑
{
uchar i=5;
while(i--);
}

/*****寫指令代碼*****/
void Lcd_WriteCmd(uchar cmdcode)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
WaitBusy();
LCD_DATA = cmdcode;
LCD_EN = 0;
}

/*****寫數據*****/
void Lcd_WriteData(uchar dispdata)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
WaitBusy();
LCD_DATA = dispdata;
LCD_EN = 0;
}

/*****初始化LCD*****/
void Lcd_Init()
{
LCD_PSB = 1;
delayms(50);
Lcd_WriteCmd(0x30); //選擇基本指令集
delayms(1);
Lcd_WriteCmd(0x30); //選擇8bit數據流
delayms(1);
Lcd_WriteCmd(0x0c); //開顯示(無游標、不反白)
delayms(1);
Lcd_WriteCmd(0x01); //清除顯示,並且設定地址指針為00H
delayms(20);
}

/*****顯示漢字*****/
void hanzi_Disp(uchar x,uchar y,uchar *s)
{ //x、y為漢字坐標
Lcd_WriteCmd(addr_tab[8*x+y]); //寫地址
while(*s>0)
{
Lcd_WriteData(*s); //寫數據
s++;
}
}

/*****顯示圖片(顯示Gdram內容)*****/

/*繪圖顯示的步驟
1 關閉繪圖顯示功能
2 先將垂直的坐標(Y)寫入繪圖RAM地址
3 再將水平的位元組坐標(X)寫入繪圖RAM地址
4 將D15-D8寫入RAM中
5 將D7-D0寫入到RAM中
6 打開繪圖顯示功能*/

//圖片取模方式:橫向取模,位元組正序
void pic_Disp(uchar *pic) //顯示Gdram內容(顯示圖片)
{
uchar x,y,i;
for(i=0;i<9;i=i+8)
for(y=0;y<32;y++)
{
for(x=0;x<8;x++)
{
Lcd_WriteCmd(0x36); //擴充指令,開繪圖顯示
Lcd_WriteCmd(0x80+y); //行地址
Lcd_WriteCmd(0x80+x+i); //列地址
Lcd_WriteData(*pic++); //寫數據 D15-D8
Lcd_WriteData(*pic++); //寫數據 D7-D0
Lcd_WriteCmd(0x30);
}
}
}

/*max187延時程序*/
void delay_MS(uint ms)//普通延時MS級
{ uint i,j;
for(i=0;i<ms;i++)
{for(j=0;j<1141;j++); }
}
void delay_uS(uint us)//普通延時US級
{ uint i,j;
for(i=0;i<us;i++)
{ for(j=0;j<10;j++); }
}
//MAX187讀程序;
unsigned int MAX187read(void)
{
uchar H,L,i;
uint count; //16位變數

MAX187_CS=0; //低電平有效,開始轉換
delay_uS(2); //延時8.5μ等待轉換結束
MAX187_SK=1;
MAX187_SK=0;
H=0; //高位變數清零
for(i=0;i<4;i++) //高4位
{
MAX187_SK=1;
if(MAX187_DO) H++; //位標量,如為1則H加1,如為0則跳過
MAX187_SK=0;
if(i!=3)
H<<=1;
}
L=0;
for(i=0;i<8;i++) //低8位
{
MAX187_SK=1;
if(MAX187_DO) L++; //位標量,如為1則L加1,如為0則跳過
MAX187_SK=0;
if(i!=7)
L<<=1;
}
delay_uS(1);
MAX187_CS=1;
count=0;
count=L;
return count;
}

void MAX187_data()
{
vv=MAX187read();
vv=vv*2*4096/4093;
show187[0]=vv/1000+'0';
show187[1]='.';
show187[2]=vv/100%10+'0';
show187[3]=vv/10%10+'0';
show187[4]=vv%10+'0';
show187[5]='\0';

}
/*****主函數*****/
void main(void)
{
uchar volt,number;
number=2;
volt=0x30+number;
Lcd_Init();
while(1)
{
Lcd_Init();

hanzi_Disp(0,1,"山東天工機電");
hanzi_Disp(1,2,"智能充電機");
hanzi_Disp(2,0,"www.sdtgjd.com");
hanzi_Disp(3,3,"");
delayms(1000);

Lcd_Init();
hanzi_Disp(1,2,"充電電流:");
//delayms(500);

//Lcd_Init();
MAX187_data();
hanzi_Disp(2,3,show187);
delayms(1500);
Write_A_B(0x0fff,0x0000,Channal_A,0); //測量A通道
//Write_A_B(0x0000,0x0600,Channal_B,1); //測量B通道
// Write_A_B(0x0504,0x0a47,Channal_AB,1); //測量AB通道,測量時需屏蔽上面兩句
//while(1);
}
}
//=================================================================
// 函數名稱 :void DA_conver(uint Dignum)
// 函數功能 :進行DA轉換
// 入口參數 :Dignum:根據說明設置轉化數據.頭四位為特殊位用於選擇轉化方式,
// 以及用於通道選擇.請自行設置.後12位為需要轉換的值
// 出口參數 :無
//=================================================================
void DA_conver(uint Dignum)
{
uint Dig=0;
uchar i=0;
SCLK=1;
CS=0; //片選有效
for(i=0;i<16;i++) //寫入16為Bit的控制位和數據
{
Dig=Dignum&0x8000;
if(Dig)
{
DIN=1;
}
else
{
DIN=0;
}
SCLK=0;
_nop_();
Dignum<<=1;
SCLK=1;
_nop_();
}
SCLK=1;
CS=1; //片選無效
}
//=================================================================
// 函數名稱 :void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)
// 函數功能 :模式、通道選擇並進行DA轉換
// 入口參數 :Data_A:A通道轉換的電壓值
// Data_B:B通道轉換的電壓值
// Channal:通道選擇,其值為Channal_A,Channal_B,或Channal_AB
// Model:速度控制位 0:slow mode 1:fast mode
// 出口參數 :無
// 說明: Data_A,Data_B的范圍為:0-0x0fff
// 本程序如果只需要一個通道時,另外一個通道的值可任意,但是不能預設
//=================================================================
void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)
{
uint Temp;
if(Model)
{
Temp=0x4000;
}
else
{
Temp=0x0000;
}
switch(Channal)
{
case Channal_A: //A通道
DA_conver(Temp|0x8000|(0x0fff&Data_A));
break;
case Channal_B: //B通道
DA_conver(Temp|0x0000|(0x0fff&Data_B));
break;
case Channal_AB:
DA_conver(Temp|0x1000|(0x0fff&Data_B)); //A&B通道
DA_conver(Temp|0x8000|(0x0fff&Data_A));
break;
default:
break;
}
}

㈡ 單片機如何驅動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++;
}

㈢ 怎樣實現電腦鍵盤與單片機的通信不使用串口助手,比如按下鍵盤上的字母a,可以立刻在lcd液晶上顯示a。

如果是USB介面的鍵盤,那麼你要懂USB協議,而且單片機的速度要足夠快,有時候還需要鍵盤內部usb晶元,單片機做主機,USB鍵盤做從機。
USB協議是很復雜的,不是一天兩天就能搞得通的,程序也很復雜,如果你是初學者,那麼不建議你一開始就調試USB,你可以嘗試下圓口的PS2鍵盤,PS2是串列通信,只需要按照通信格式發送相應的數據就可以了,具體的可以查一下PS2方面的資料。

㈣ 怎麼用單片機讓LCD顯示呢

用單片機讓LCD顯示,一要保證電路正確,二是程序必須與電路相符,程序中的LCD的控制腳必須與實物相符。否則,液晶屏只亮並不顯示字元。你主程序中的液晶屏初始化語句應放在第一行。你現在是放在最後了,假如前面語句顯示了,可初始化後就全沒了。

㈤ 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上顯示。

㈥ 求51單片機LCD顯示程序

兄弟,自己去網上找範例,範例特多,自己動手學習的好。
1、51控制LCD,一般都是字元型的LCD,只需要注意data線就行。
2、ADC程序,首先看你的ADC IC是什麼,看它的datasheet,注意精確度,都有計算公式;
3、前面你會了,按鍵顯示就更不用說了。

㈦ 單片機Lcd指令問題

1.指令0x38的作用是設定使用8位匯流排、2行顯示、使用5X7字元。要多次重復執行的目的是為了LCD的可靠初始化。

2.在單片機中char和int的定義和在計算機上是一樣的,char是8位的,int是16位的。char可以成為8位整型或者字元型數據,因為我們平時使用的ASCII碼就是char型的,並且包含了可以顯示的字元(比如數字、字母和符號),比如0x41就是代表可以顯示的字母A。所以char型可以稱為字元型。

3.既然已經知道char是8位的,而IO埠也是8位的,所以使用char在對埠賦值時,就是把char型字元中每一個位的狀態(0或者1)復制到埠的對應位上了。

㈧ 51單片機如何在1602液晶屏上顯示一個字母

/*-----------------------------------------------
名稱:LCD1602
內容:通過標准程序靜態顯示字元
引腳定義如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<intrins.h>

sbit RS = P2^4; //定義埠
sbit RW = P2^5;
sbit EN = P2^6;

#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字元變數,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字元變數,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函數
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
寫入命令函數
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //忙則等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
寫入數據函數
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
清屏函數
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}

/*------------------------------------------------
寫入字元函數
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函數
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*顯示模式設置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*顯示關閉*/
LCD_Write_Com(0x01); /*顯示清屏*/
LCD_Write_Com(0x06); /*顯示游標移動設置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*顯示開及游標設置*/
}

/*------------------------------------------------
主函數
------------------------------------------------*/
void main(void)
{
LCD_Init();
LCD_Clear();//清屏
while (1)
{
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
while(1);
}
}

㈨ 51單片機液晶1602的C程序誰有,給個簡單的顯示一個字元A的

#include "reg52.h"

sbit LED=P1^0;//LED鎖存器
sbit SEG=P1^1;//數碼管段選鎖存器
sbit DIG=P1^2;//數碼管位選鎖存器
unsigned char t;

sbit LCDRS=P2^7;//數據指令控制
sbit LCDRW=P2^6;//讀寫控制
sbit LCDEN=P2^5;//液晶屏使能控制

//**********延時函數,延時n*1ms*********
void delay(unsigned char n)
{
int i,j;
for (i=0; i<n; i++)
for (j=0; j<100; j++)
;
}

//*************寫命令***************
void Write_Cmd(unsigned char C)
{
LCDEN=1;//使能端,由高電平跳變成低電平時,液晶屏模塊執行命令
LCDRS=0;//指令寄存器選擇
P0=C;
delay(5);
LCDEN=0;
}

//**************寫數據**************
void Write_Data(unsigned char D)
{
LCDEN=1;//使能端,由高電平跳變成低電平時,液晶屏模塊執行命令
LCDRS=1;//選擇數據寄存器
P0=D;
delay(5);
LCDEN=0;
}

//**********LCD初始化*****************
void LCD_Init()
{
LCDRS=0;//指令寄存器選擇
Write_Cmd(0x01);//清屏
Write_Cmd(0x38);//功能設置8位雙行顯示5*7點陣
Write_Cmd(0x0F);//開關顯示設置
Write_Cmd(0x06);//輸入方式設置,游標從左向右移動,內容不移動
}

void main()
{
unsigned char Code1[]="I LOVE MCU!";
unsigned char m;

//LED,數碼管鎖存器片選設置
LED=0;
DUAN=0;
WEI=0;

LCDRW=0;//寫選擇

LCD_Init();

Write_Cmd(0x80+0x01);//寫入顯示緩沖區起始地址為1行2列

for(m=0;m<11;m++)
{
Write_Data(Code1[m]);
delay(3);
}

while (1)
;
}//end of main

㈩ 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上顯示。
以上回答你滿意么?

閱讀全文

與單片機LCD亮字母A程序相關的資料

熱點內容
口才訓練手冊編譯口才精品書系 瀏覽:995
linuxfunc 瀏覽:266
高德地圖解壓後的文件 瀏覽:638
php加水印類 瀏覽:227
編譯原理定義表格和編寫查找函數 瀏覽:349
指數函數和對數函數的高精度快速演算法 瀏覽:208
c預編譯干什麼 瀏覽:24
hp網路共享文件夾 瀏覽:365
程序員如何不被廢 瀏覽:806
二進制流轉pdf 瀏覽:916
php判斷爬蟲 瀏覽:571
960除24除4簡便演算法 瀏覽:787
關於解壓英語翻譯 瀏覽:566
python控制鍵盤右鍵 瀏覽:921
php沒有libmysqldll 瀏覽:829
時政新聞app哪個好 瀏覽:906
手機已加密怎麼辦 瀏覽:201
安卓手機截屏怎麼傳到蘋果 瀏覽:529
京管家app哪裡下載 瀏覽:33
文件夾橫向排列的豎向排列 瀏覽:454