我單片機學得不是很好,因為我是自學的,師傅還沒有教到,而且程序是復制別人的,程序我還不是全部都理解,但是編譯沒有出現錯誤,求指導
IMG20201122111622.jpg (1.4 MB, 下載次數: 36)
下載附件
2020-11-22 11:17 上傳
單片機源程序如下:
#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點陣,8位數據口
Lcdwritecmd(0x0C); //顯示器開,光標關閉
Lcdwritecmd(0x06);//文字不動,地址自動加+1
Lcdwritecmd(0x01);//清屏
}
//向LCd1602寫入一個一字節命令,cmd為待寫入命令值
void Lcdwritecmd(unsigned char cmd)
{
LcdWaitReady();
Lcd1602_RS = 0;
Lcd1602_RW = 0;
Lcd1602_DB = cmd;
Lcd1602_E = 1;
Lcd1602_E = 0;
}
//等待液晶準備好
void LcdWaitReady()
{
unsigned char sta;
Lcd1602_DB = 0xFF;
Lcd1602_RS = 0;
Lcd1602_RW = 1;
do{
Lcd1602_E = 1;
sta = Lcd1602_DB;//讀取狀態字
Lcd1602_E = 0;
}while(sta & 0x80);//bit7等于1表示液晶正忙,重復檢測直到其等于0為止
}
//在液晶上顯示字符串,(x,y)為對應屏幕上的起始坐標,str為字符指針
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str)
{
Lcdcursor(x, y);//設置起始地址
while(*str != '\0')//連續寫入字符串數據,直到檢測到結束符
{
LcdWritedat(*str++);//先取str指向的數據,然后str自加1
}
}
//設置顯示RAM起始地址,亦即光標位置,(x,y)為對應屏幕上的字符坐標
void Lcdcursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if(y == 0)//由輸入的屏幕坐標計算顯示RAM的地址
{
addr = 0x00 + x; //第一行字符坐標地址從0x00起始
}
else
{
addr = 0x40 + x;//第二行字符地址從0x40起始
}
Lcdwritecmd(addr | 0x80);//設置RAM地址
}
//向液晶寫入一個一字節數據,dat為待寫入數據值
void LcdWritedat(unsigned char str)
{
LcdWaitReady();
Lcd1602_RS = 1;
Lcd1602_RW = 0;
Lcd1602_E = 1;
Lcd1602_DB = str;
Lcd1602_E = 0;
} |