|
程序在開發(fā)板上嘗試過,沒有任何問題,但是到了仿真里面就是只能顯示一兩秒,求教!附上完整代碼和仿真。
代碼:
#include "reg52.h"
#define LCD_DB P1 //宏定義P1口
sbit RW = P3^5;
sbit RS = P3^6;
sbit E = P3^4; //位定義LCD1602的RW、RS和E端口
void delay(unsigned int i);
void LCD_WriteCom(unsigned char com);
void LCD_WriteData(unsigned char dat);
void LCD_Init(void);
void LCD_WriteString(unsigned int x,unsigned int y,unsigned char *p);
void delay(unsigned int i) //延時(shí)程序
{
while(i--);
}
void LCD_WriteCom(unsigned char com) //寫入命令
{
LCD_DB = com; //待傳送代碼放入P0口
delay(100); //延時(shí),等待數(shù)據(jù)穩(wěn)定
RS = 0; //選擇發(fā)送命令
RW = 0; //選擇寫入
E = 1; //寫入時(shí)序
delay(100); //下降沿保持時(shí)間
E = 0;
}
void LCD_WriteData(unsigned char dat) //寫入數(shù)據(jù)
{
LCD_DB = dat; //待傳送代碼放入P0口
delay(100); //延時(shí),等待數(shù)據(jù)穩(wěn)定
RS = 1; //選擇輸入數(shù)據(jù)
RW = 0; //選擇寫入
E = 1; //寫入時(shí)序
delay(100); //下降沿保持時(shí)間
E = 0;
}
void LCD_Init(void) //LCD初始化子程序
{
LCD_WriteCom(0x38); //功能設(shè)定,設(shè)置雙行顯示,8位數(shù)據(jù)總線DB0~DB7,5X7點(diǎn)陣/字符
LCD_WriteCom(0x0c); //顯示開關(guān)設(shè)定,開顯示,不顯示光標(biāo)
LCD_WriteCom(0x06); //進(jìn)入模式設(shè)定,寫一個(gè)數(shù)據(jù)后光標(biāo)向右移動(dòng),顯示屏不移動(dòng)
LCD_WriteCom(0x01); //清屏,清空DDRAM的內(nèi)容
}
/*顯示字符串函數(shù),x為行數(shù):1~2,y為列數(shù):1~16,*p是要顯示的字符串指針*/
void LCD_WriteString(unsigned int x,unsigned int y,unsigned char *p)
{
x--;
y--;
while(*p != '0') //如果沒顯示到字符串結(jié)尾時(shí),就進(jìn)入循環(huán)
{
if(x==0) //在第一行顯示
{
y|=0x80;
LCD_WriteCom(y); //將需要顯示的列數(shù)位置與0x80相與,得到在該行下的具體位置
LCD_WriteData(*p); //顯示p中的字符
y++; //顯示完一個(gè)字符后,列數(shù)+1
p++; //指針地址+1,顯示下一個(gè)字符
}
if(x==1) //在第二行顯示
{
y|=0xc0;
LCD_WriteCom(y); //將需要顯示的列數(shù)位置與0xc0相與,得到在該行下的具體位置
LCD_WriteData(*p); //顯示p中的字符
y++; //顯示完一個(gè)字符后,列數(shù)+1
p++; //指針地址+1,顯示下一個(gè)字符
}
}
}
void main(void)
{
LCD_Init();
while(1)
{
LCD_WriteString(1,1,"LCD1602"); //在第一行第五列開始顯示字符串
}
}
|
-
-
1602例程.rar
2022-6-8 18:49 上傳
點(diǎn)擊文件名下載附件
48.85 KB, 下載次數(shù): 35
1602仿真
|