找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2090|回復(fù): 0
收起左側(cè)

LCD1602學(xué)習(xí)—Proteus仿真(顯示操作)

[復(fù)制鏈接]
ID:937858 發(fā)表于 2021-7-24 18:17 | 顯示全部樓層 |閱讀模式
學(xué)習(xí)關(guān)鍵:先看懂液晶操作時(shí)序圖(寫操作:寫命令、寫數(shù)據(jù))
讀狀態(tài)
輸入
RS=L,R/W=H,E=H
輸出
D0—D7=狀態(tài)字
寫指令
輸入
RS=L,R/W=L,D0—D7=指令碼,E=高脈沖
輸出
讀數(shù)據(jù)
輸入
RS=H,R/W=H,E=H
輸出
D0—D7=數(shù)據(jù)
寫數(shù)據(jù)
輸入
RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖
輸出


由時(shí)序圖可知,寫操作時(shí)(包括寫指令、寫數(shù)據(jù)),RS=0;RW=0;再進(jìn)行I/O口寫操作,然后使能端口完成一次高脈沖(——高——低),這是液晶就會(huì)執(zhí)行寫操作的內(nèi)容;
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表10-14所示:
序號
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清顯示
0
0
0
0
0
0
0
0
0
1
2
光標(biāo)返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開/關(guān)控制
0
0
0
0
0
0
1
D
C
B
5
光標(biāo)或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發(fā)生存貯器地址
0
0
0
1
字符發(fā)生存貯器地址
8
置數(shù)據(jù)存貯器地址
0
0
1
顯示數(shù)據(jù)存貯器地址
9
讀忙標(biāo)志或地址
0
1
BF
計(jì)數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM)
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容


思路:

1、控制液晶顯示輸出,需要對其進(jìn)行寫數(shù)據(jù)(寫數(shù)據(jù)前,同樣需要先告訴液晶你下一步要在哪里寫,因此寫數(shù)據(jù)前,要寫命令先設(shè)定數(shù)據(jù)指針)
程序設(shè)計(jì)方式:
write_com();//寫命令函數(shù),
write_date();//寫數(shù)據(jù)函數(shù)

2、由于要先進(jìn)行初始化,(初始化實(shí)際就是對液晶寫指令,告訴其工作方式等)因此初始化函數(shù)里面自然就需要調(diào)用寫命令函數(shù)write_com();
程序結(jié)構(gòu)如下:
int init()
{
  EN = 0;
  write_com(0X38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  write_com(0X0C);//設(shè)置開顯示,不顯示光標(biāo)
  write_com(0X06);//寫一個(gè)字符時(shí),整屏右移
  write_com(0X01);//顯示清零
  return 0;
} 
主函數(shù)部分程序結(jié)構(gòu):
int main()
{
  init();//調(diào)用初始化函數(shù)
  write_com(0x80);//調(diào)用寫指令函數(shù),設(shè)置寫數(shù)據(jù)開始指針(第一行)
  for(x=0;x<6;x++)//數(shù)據(jù)寫入循環(huán)程序
  {
    write_date(table[x]);
    delay(150);
  }
  write_com(0x80+0x40); ;//調(diào)用寫指令函數(shù),設(shè)置寫數(shù)據(jù)開始指針(第二行)
  for(x=0;x<17;x++)//數(shù)據(jù)寫入循環(huán)程序
  {
    write_date(table1[x]);
    delay(150);
  }
  while(1);
return 0;
}

完整程序如下:
1 #include<reg52.h> 2     int init();    //聲明初始化函數(shù) 3     int write_com(unsigned char);//聲明寫命令函數(shù) 4     int write_date(unsigned char);//聲明寫數(shù)據(jù)函數(shù) 5     int delay(unsigned char);//聲明延遲函數(shù) 6     unsigned char x; 7     sbit RS = P1^0; 8     sbit RW = P1^1; 9     sbit EN = P1^2;10     unsigned char code table[]="HELLO!";11     unsigned char code table1[]="MY name is Terry!";12 13 int main(void)//主函數(shù)14 {    15     init();16     write_com(0x80);    17     for(x=0;x<6;x++)18     {19          write_date(table[x]);20         delay(150);21     }22     write_com(0x80+0x40);    23     for(x=0;x<17;x++)24     {25          write_date(table1[x]);26         delay(150);27     }28     while(1);            29     return 0;30 }31 32 int init()//初始化函數(shù)體33 {34     EN = 0;35     write_com(0X38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口36     write_com(0X0C);//設(shè)置開顯示,不顯示光標(biāo)37     write_com(0X06);//寫一個(gè)字符時(shí),整屏右移38     write_com(0X01);//顯示清零39     return 0;40 }41 42 int write_com(unsigned char com)//寫命令的函數(shù)體43 {44     RS = 0;45     RW = 0;46     P0 = com;47     delay(5);48     EN = 1;49     delay(5);50     EN = 0;51     return 0;        52 }53 54 int write_date(unsigned char date)//寫數(shù)據(jù)的函數(shù)體55 {56     RS = 1;57     RW = 0;58     P0 = date;59     delay(5);60     EN = 1;61     delay(5);62     EN = 0;63     return 0;        64 }65 66 int delay(unsigned char xms)67 {68     unsigned char x,y;69     for(x=xms;x>0;x--)70         for(y=110;y>0;y--);71     return 0;72 }
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表