//犯的錯(cuò):在51里RW(L命令、H數(shù)據(jù))是直接焊成接地的
//∴ 少了lcd_enable(); 這一函數(shù){lcdrs = 0; lcdrw = 0; lcden = 0; delay(5); lcden = 1;}
//少了這一函數(shù)設(shè)置就無法顯示了
#define PIC
#ifdef ww
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" hello! jasper"; //寫字符串時(shí)用“”而不是{ }了
uchar code table1[]=" xm.dabiao ";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
#endif
#ifdef PIC
#include <pic.h>
__CONFIG(0X3B31);
#define uchar unsigned char
#define uint unsigned int
//奇怪了,移動(dòng)下面2行會(huì)提示,逗號(hào)錯(cuò)誤
const uchar table[]=" hello! jasper"; //寫字符串時(shí)用“”而不是{ }了
const uchar table1[]=" xm.dabiao "; //PIC的數(shù)組寫法與51的是不同的
#define lcden RA3
#define lcdrs RA5
#define lcdrw RA4
#define P0 PORTD
#endif
uchar num;
void delay(uint z) //延時(shí)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //寫指令函數(shù)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //寫數(shù)據(jù) 函數(shù)
{
lcdrs=1;
P0=date;
// delay(5);
lcdrs=1;
#ifdef PIC
lcdrw=0; //寫成1就什么也顯示不了,在51里它是直接接地的
#endif
lcden=0;
delay(5);
lcden=1;
}
void lcd_enable(void) //LCD顯示設(shè)置
{
lcdrs = 0; //該字節(jié)數(shù)據(jù)L為命令,H高為數(shù)據(jù)
#ifdef PIC
lcdrw = 0; //此次操作為寫,而不是讀
#endif
lcden = 0; //拉低使能信號(hào)
delay(5); //保持使能信號(hào)為低一段時(shí)間
lcden = 1; //拉高使能信號(hào),建立LCD操作所需要的上升沿
}
void init()
{
#ifdef ww
dula=0; //初始化,關(guān)斷數(shù)碼管
wela=0;
lcden=0;
write_com(0x38); //顯示模式設(shè)定,0X38即闡述了此液晶為16X2顯示,是5X7點(diǎn)陣
write_com(0x0e); //開顯示不顯光標(biāo),光標(biāo)不閃爍
write_com(0x06); //當(dāng)前為加一模式且整屏不左移
write_com(0x01); //之后還要刷新一次
// write_com(0x80);
write_com(0x80+0x10); //表示這是從第一行開始寫,因?yàn)橐烈苿?dòng)所以要加0x10
#endif
#ifdef PIC
TRISA=0x00;PORTA=0XF0;
TRISD=0x00;PORTD=0XFF;
ADCON1=0X07; //設(shè)置A口為普通IO口
RA1=1;
lcd_enable(); //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù).少了這一行就顯示不了
write_com(0x38); //顯示模式設(shè)定,0X38即闡述了此液晶為16X2顯示,是5X7點(diǎn)陣
lcd_enable(); //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù).少了這一行就顯示不了
write_com(0x0e); //開顯示不顯光標(biāo),光標(biāo)不閃爍
lcd_enable(); //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù).少了這一行就顯示不了
write_com(0x06); //當(dāng)前為加一模式且整屏不左移
lcd_enable(); //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù).少了這一行就顯示不了
write_com(0x01); //之后還要刷新一次
lcd_enable(); //該字節(jié)數(shù)據(jù)為命令,而不是數(shù)據(jù).少了這一行就顯示不了
// write_com(0x80);
write_com(0x80+0x10); //表示這是從第一行開始寫,因?yàn)橐烈苿?dòng)所以要加0x10
#endif
}
void doio(void)
{
for(num=0;num<16;num++)
{
write_data(table[num]);
delay(20);
}
//----------------------------再寫第二行
write_com(0x80+0x51);
for(num=0;num<16;num++)
{
write_data(table1[num]);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18); //由code控制位 表算得18,整屏左移
delay(160);
}
while(1);
}
void main()
{
init();
doio();
}