作者fmdjyl (小D(滴))
看板Electronics
标题Re: [问题] 8051使用C语言LCD显示问题
时间Wed Feb 14 23:21:08 2007
来自书本范例~ 书名:单晶片MCS-51与C语言入门实习
此程式有做过实验~可以正常动作!
//************** LCD1.C **********************************
//动作:由LCD显示两行文字,令其闪烁或移位
// P35=RS , P36=R/W ,P37=EN ,P1=DATA_BUS
//**********************************************************
#include <AT89X51.h>
char code Table1[] = "12345678901234567890"; //第一行列表字元
char code Table2[] = "ABCDEFGHIJKLMNOPQRST"; //第二行列表字元
sbit RS=0xb5; //P35=RS=0指令暂存器,RS=1资料暂存器
sbit RW=0xb6; //P36=RW=1读取,RW=0写入
sbit EN=0xb7; //P37=EN=0禁能LCD,EN=1致能LCD
sfr DATA_BUS=0x90; //DATA bus=P1
void Reset_LCD(void);
void Delay(unsigned int dly);
void LCD_Cmd(unsigned char comm);
void Send_Data(char Data);
void main(void)
{
int i;
P1=0;
Reset_LCD(); //重置及清除LCD
LCD_Cmd(0x80); //游标由第一行开始显示
for(i=0 ; i< 20 ; i++)
Send_Data(Table1[i]); //读取列表20字送到LCD显示
LCD_Cmd(0xC0); //游标由第二行开始显示
for(i=0 ; i< 20 ; i++)
Send_Data(Table2[i]); //读取列表20字送到LCD显示
loop:
LCD_Cmd(0x08); Delay(60000); //D=0关闭显示器
LCD_Cmd(0x0c); Delay(60000); //D=1开启显示器
//LCD_Cmd(0x1c); Delay(60000); //SC=1及RL=1显示幕右移? //LCD_Cmd(0x18); Delay(60000); //SC=1及RL=0显示幕左移
goto loop;
}
void Reset_LCD(void) //LCD的启始程式
{
LCD_Cmd(0x38); //DL=1:8bit传输,N=1:显示2行,F=0:5*7字型
LCD_Cmd(0x0c); //D=1:显示幕ON,C=0:不显示游标,B=0:游标不闪烁
LCD_Cmd(0x06); //I/D=1:显示完游标右移,S=0:游标移位禁能
LCD_Cmd(0x01); //清除显示幕
LCD_Cmd(0x02); //游标回原位
}
void Send_Data(char Data) //传送资料到LCD
{
DATA_BUS=Data; //资料送到BUS
RS=1;RW=0;EN=1; //资料到LCD内
Delay(60);
EN=0; //禁能LCD
}
void LCD_Cmd(unsigned char comm) //传送命令到LCD
{
DATA_BUS=comm; //命令送到BUS
RS=0;RW=0;EN=1; //命令到LCD内
Delay(60);
EN=0; //禁能LCD
}
void Delay(unsigned int dly) //延时函数
{
while(dly > 0)
dly --;
}
--------------------------------------------------------------------
※ 引述《submarines ()》之铭言:
: 最近才刚开始学51…
: 写到LCD时照着范例打只能显示一行而已
: 我需要显示两行
: 但程式怎麽改就是无法呼叫第二行
: 以下附的是显示一行的程式…
: 希望在这里的高手能帮我解决一下…thanks
: #include "AT89X51.H"
: #define RS P2_0
: #define RW P2_1
: #define Enable P2_2
: char one=0;
: char zero=0;
: void DELAY(int zzz)
: {
: int d;
: for(d=zzz;d>0;d--);
: }
: void CheckBusy(void)
: {
: char i=0x80;
: while(i&0x80)
: {
: RS=0;
: RW=1;
: Enable=1;
: i=P3;
: Enable=0;
: DELAY(250);
: }
: }
: void WriteData(char i)
: {
: RS=1;
: RW=0;
: Enable=1;
: P3=i;
: Enable=0;
: CheckBusy();
: }
: void WriteString(count,MSG)
: char count;
: char MSG[];
: {
: char i;
: for(i=0;i<count;i++)
: WriteData(MSG[i]);
: }
: void WriteIns(char instruction)
: {
: RS=0;
: RW=0;
: Enable=1;
: P3=instruction;
: Enable=0;
: CheckBusy();
: }
: void InitialLCD(void)
: {
: WriteIns(0x38);
: WriteIns(0x08);
: WriteIns(0x01);
: WriteIns(0x0e);
: WriteIns(0x06);
: }
: void main()
: {
: char MSG0[]="FIRLAB";
: InitialLCD();
: WriteString(6,MSG0);
: while(1);
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.117.4