|
我單片機(jī)學(xué)得不是很好,因?yàn)槲沂亲詫W(xué)的,師傅還沒有教到,而且程序是復(fù)制別人的,程序我還不是全部都理解,但是編譯沒有出現(xiàn)錯(cuò)誤,求指導(dǎo)
IMG20201122111622.jpg (1.4 MB, 下載次數(shù): 36)
下載附件
2020-11-22 11:17 上傳
單片機(jī)源程序如下:
#include<reg52.h>
#define Lcd1602_DB P2
sbit Lcd1602_RS = P3^0;
sbit Lcd1602_RW = P3^1;
sbit Lcd1602_E = P3^2;
void InitLcd1602();
void Lcdwritecmd(unsigned char cmd);
void LcdWaitReady();
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str);
void Lcdcursor(unsigned char x, unsigned char y);
void LcdWritedat( unsigned char str);
void main()
{
InitLcd1602();
LcdShowstr(5, 0, "L Z Y");
LcdShowstr(3, 1, "come on!!!");
while(1);
}
//初始化1602液晶
void InitLcd1602()
{
Lcdwritecmd(0x38);//16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
Lcdwritecmd(0x0C); //顯示器開,光標(biāo)關(guān)閉
Lcdwritecmd(0x06);//文字不動(dòng),地址自動(dòng)加+1
Lcdwritecmd(0x01);//清屏
}
//向LCd1602寫入一個(gè)一字節(jié)命令,cmd為待寫入命令值
void Lcdwritecmd(unsigned char cmd)
{
LcdWaitReady();
Lcd1602_RS = 0;
Lcd1602_RW = 0;
Lcd1602_DB = cmd;
Lcd1602_E = 1;
Lcd1602_E = 0;
}
//等待液晶準(zhǔn)備好
void LcdWaitReady()
{
unsigned char sta;
Lcd1602_DB = 0xFF;
Lcd1602_RS = 0;
Lcd1602_RW = 1;
do{
Lcd1602_E = 1;
sta = Lcd1602_DB;//讀取狀態(tài)字
Lcd1602_E = 0;
}while(sta & 0x80);//bit7等于1表示液晶正忙,重復(fù)檢測(cè)直到其等于0為止
}
//在液晶上顯示字符串,(x,y)為對(duì)應(yīng)屏幕上的起始坐標(biāo),str為字符指針
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str)
{
Lcdcursor(x, y);//設(shè)置起始地址
while(*str != '\0')//連續(xù)寫入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符
{
LcdWritedat(*str++);//先取str指向的數(shù)據(jù),然后str自加1
}
}
//設(shè)置顯示RAM起始地址,亦即光標(biāo)位置,(x,y)為對(duì)應(yīng)屏幕上的字符坐標(biāo)
void Lcdcursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if(y == 0)//由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址
{
addr = 0x00 + x; //第一行字符坐標(biāo)地址從0x00起始
}
else
{
addr = 0x40 + x;//第二行字符地址從0x40起始
}
Lcdwritecmd(addr | 0x80);//設(shè)置RAM地址
}
//向液晶寫入一個(gè)一字節(jié)數(shù)據(jù),dat為待寫入數(shù)據(jù)值
void LcdWritedat(unsigned char str)
{
LcdWaitReady();
Lcd1602_RS = 1;
Lcd1602_RW = 0;
Lcd1602_E = 1;
Lcd1602_DB = str;
Lcd1602_E = 0;
} |
|