初始學習單片機,LCD1602的滾動只能實現2行同時移動,就改了哈,寫了個滾動的程序。在測試的時候發現了一個問題,在學習板上能正常運行的代碼放到Proteus上問題出錯,不能正常顯示,最后在網上搜索原因時發現可能是Proteus仿真時對端口有要求,最后將商品修改到PORTB和PORTD就正常了。
這是顯示效果https://v.youku.com/v_show/id_XNDI5MDEwOTg4NA==.html?spm=a2h3j.8428770.3416059.1
LCD1602.c
//---------------------------------------------------------------
//LCD1602液晶控制與顯示程序
//---------------------------------------------------------------
#include #include #include #include "LCD1602.h" //--------------------------------------------------------------- //LCD忙等待 //--------------------------------------------------------------- void LCD_BUSY_WAIT() { INT8U status; TRIS_LCD_DAT=0xFF; //將端口設為輸入 RS=0;RW=1; //讀寄存器狀態 do { E=1;NOP();status=PORT_LCD_DAT;E=0; //讀取忙信號 }while(status & 0x80); //如果為0x80就是忙,繼續進入循環 } //---------------------------------------------------------------- //寫LCD命令 //---------------------------------------------------------------- void Write_LCD_Command(INT8U cmd) { TRIS_LCD_DAT=0x00; //LCD數據端口設為輸出 PORT_LCD_DAT=cmd; //發送命令 PORT_LCD_CTL=TRIS_LCD_CTL=0x00; //控制端口設為輸出,初值為0x00 RS=0;RW=0;E=1;NOP();E=0; //寫命令 LCD_BUSY_WAIT(); //LCD忙等待 } //---------------------------------------------------------------- //寫LCD數據寄存器 //---------------------------------------------------------------- void Write_LCD_Data(INT8U dat) { TRIS_LCD_DAT=0x00; //LCD數據端口設為輸出 PORT_LCD_DAT=dat; //發送數據 RS=1;RW=0;E=1;NOP();E=0; //寫數據 LCD_BUSY_WAIT(); //LCD忙等待 } //---------------------------------------------------------------- //LCD初始化 //---------------------------------------------------------------- void LCD_Initialize() { Write_LCD_Command(0x38);__delay_ms(2); //置功能,8位,雙行,5*7 Write_LCD_Command(0x01);__delay_ms(2); //清屏 Write_LCD_Command(0x06);__delay_ms(2); //字符進入模式:屏幕不動,字符后移 Write_LCD_Command(0x0c);__delay_ms(2); //顯示開,關光標 } //---------------------------------------------------------------- //在r行(0-1) C列(0-15)顯示字符串 //---------------------------------------------------------------- void LCD_ShowString(INT8U r,INT8U c,char *str) { INT8U i=0; //設置字符地址,第一行首地址為0x80,第二行首地址為0xc0 if(r==0) Write_LCD_Command(0x80 | c);else if(r==1) Write_LCD_Command(0xc0 | c); //從字符串的第一個字符車起,如果大于16個字符或者碰到'
主站蜘蛛池模板:
五家渠市|
淳安县|
沙雅县|
马龙县|
垫江县|
桓台县|
区。|
上栗县|
台南市|
定陶县|
富蕴县|
瑞昌市|
象州县|
四会市|
永靖县|
通化县|
湘乡市|
墨竹工卡县|
盘锦市|
宜阳县|
建水县|
乳源|
新沂市|
沐川县|
酒泉市|
阿克|
瑞金市|
磐安县|
彭州市|
方城县|
梁平县|
新野县|
金华市|
浙江省|
洪湖市|
隆回县|
团风县|
宜兴市|
焉耆|
凌云县|
泸州市|