同樣我們創(chuàng)建好“l(fā)cd.c”和“l(fā)cd.h”,然后添加進(jìn)工程文件中?!發(fā)cd.c”的代碼集合了所有宋老師為我們寫(xiě)好的各種常用函數(shù)。
1.lcd.c的代碼
#include <reg52.h> #include <lcd.h> /* 等待液晶準(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為止 } /* 向LCD1602液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 */ void LcdWriteCmd(unsigned char cmd) { LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0; } /* 向LCD1602液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值 */ void LcdWriteDat(unsigned char dat) { LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; LCD1602_E = 0; } /* 設(shè)置顯示RAM起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo) */ void LcdSetCursor(unsigned char x, unsigned char y) { unsigned char addr; if (y == 0) //由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址 addr = 0x00 + x; //第一行字符地址從0x00起始 else addr = 0x40 + x; //第二行字符地址從0x40起始 LcdWriteCmd(addr | 0x80);//設(shè)置RAM地址 } /* 在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針 */ void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) { LcdSetCursor(x, y); //設(shè)置起始地址 while (*str != '\0') //連續(xù)寫(xiě)入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符 { LcdWriteDat(*str++);//先取str指向的數(shù)據(jù),然后str自加1 } } /* 在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針,len-需顯示的字符長(zhǎng)度 */ void LcdShowStr_len(unsigned char x, unsigned char y, unsigned char *str, unsigned char len) { LcdSetCursor(x, y); //設(shè)置起始地址 while (len--) //連續(xù)寫(xiě)入len個(gè)字符數(shù)據(jù) { LcdWriteDat(*str++);//先取str指向的數(shù)據(jù),然后str自加1 } } /* 區(qū)域清除,清除從(x,y)坐標(biāo)起始的len個(gè)字符位 */ void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len) { LcdSetCursor(x, y); //設(shè)置起始地址 while (len--) //連續(xù)寫(xiě)入空格 { LcdWriteDat(' '); } } /* 整屏清除 */ void LcdFullClear() { LcdWriteCmd(0x01); } /* 初始化1602液晶 */ void InitLcd1602() { LcdWriteCmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 LcdWriteCmd(0x0C); //顯示器開(kāi),光標(biāo)關(guān)閉 LcdWriteCmd(0x06); //文字不動(dòng),地址自動(dòng)+1 LcdWriteCmd(0x01); //清屏 }
2.lcd.h的代碼
#ifndef __LCD_H__ #define __LCD_H__ #define LCD1602_DB P0 sbit LCD1602_RS = P1^0; sbit LCD1602_RW = P1^1; sbit LCD1602_E = P1^5; void LcdWaitReady();//等待液晶準(zhǔn)備好 void LcdWriteCmd(unsigned char cmd);//向LCD1602液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 void LcdWriteDat(unsigned char dat);//向LCD1602液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值 void LcdSetCursor(unsigned char x, unsigned char y);//設(shè)置顯示RAM起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo) void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);//在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針 void LcdShowStr_len(unsigned char x, unsigned char y, unsigned char *str, unsigned char len);//在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針,len-需顯示的字符長(zhǎng)度 void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len);//區(qū)域清除,清除從(x,y)坐標(biāo)起始的len個(gè)字符位 void LcdFullClear();//整屏清除 void InitLcd1602(); //初始化1602液晶 #endif
3.main.c的代碼
#include <reg52.h> #include <function.h>//詳見(jiàn)第六章第8講 #include <lcd.h> void main() { unsigned char str[] = "Kingst Studio"; InitLcd1602();//初始化液晶屏 LcdShowStr(2, 0, str);//在第一行第3格開(kāi)始顯示數(shù)組里的字符串 LcdShowStr(0, 1, "Welcome to KST51");//在第二行第1格顯示"Welcome to KST51"這段字符串 while (1); }
再次提醒要添加進(jìn)工程文件,不添加的話編譯不會(huì)報(bào)錯(cuò),但是下載進(jìn)去無(wú)法執(zhí)行相應(yīng)的代碼,也就不能正常顯示內(nèi)容。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫(xiě)的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫(xiě)出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫(xiě)不出代碼?手把手帶你寫(xiě)100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門(mén)課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程