本帖最后由 feiyinglala 于 2013-11-18 13:40 编辑
前些天网购的一个1602液晶显示模块(购买链接是淘宝的店家)。但是不知道到底有没有坏掉。因为现在把它加上5V电源,然后调节对比度的Vo口通过一个10k电阻接到5v电源,没有任何显示。
现在程序没法从液晶模块里读出状态,我把程序写成了每判断一次忙后,如果检测到不忙的状态以后PD7口的输出电平翻转。但是现在PD7口没有任何反转的现象。
使用PD7口驱动一个LED来显示电平反转。PB口接1602的数据口,PA1-2-3接1602的RS-RW-EN三个操作口。
看到百度知道如是说:http://zhidao.baidu.com/link?url=oIj38wDfbHbDA5lVX2c10KM_h5dmbLljGrfnWL-jEEq8UUG1UKEqnSYnP2k75XPIPPQy3BboGVVkvF92uosr_a
把1602完全拔下来,5V正常供电,我用10k的电位器,把电位器拧了个遍,还是没有任何显示。
//ICC-AVR application builder : 2013/11/13 21:45:08
// Target : M16
// Crystal: 7.3728Mhz
#include <iom16v.h>
#include <macros.h> //??何用
#define uint unsigned int
#define uchar unsigned char
#define lcdrs0 PORTA &= ~(1 << 1)//命令
#define lcdrs1 PORTA |= (1 << 1)//数据
#define lcdrw0 PORTA &= (1 << 2)//读
#define lcdrw1 PORTA |= (1 << 2)//写
#define lcden0 PORTA &= ~(1 << 3)//使不能
#define lcden1 PORTA |= (1 << 3)//使能
uchar table[]="I CAN DO IT!^o^";//
uint num;
void busy(void);
void write_date(uchar);
void write_com(uchar);
void init_1602(void);
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x0E; //
PORTB = 0x00;
DDRB = 0xff; //程序原本预计初始化为输出
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xa7; //本该是0x27
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//有问题
void busy()
{
uchar mang;
//lcden0;
lcdrs0;
lcdrw1; //
//PORTB = 0xff; //http://www.amobbs.com/thread-4414649-1-1.html 参考其7楼说法
DDRB=0x00;
delay(10);
lcden1;
delay(10);
mang = 0x80;
delay(10);
while(mang & 0x80)
{
mang = PINB;//忙时为1,禁止读写操作
mang = PINB;//忙时为1,禁止读写操作
mang = PINB;//忙时为1,禁止读写操作
mang = PINB;//忙时为1,禁止读写操作
delay(10);
}
DDRB=0xFF;
delay(10);
lcdrw0;
delay(10);
PORTD ^= 0x80;
delay(300);
}
void write_date(uchar dat)//写数据函数
{
busy();
lcden0;
lcdrs1;
lcdrw0;
PORTB=dat;
delay(10);
lcden1;
delay(10);
lcden0;
}
void write_com(uchar com)//写命令函数
{
busy();
lcden0;
lcdrs0;
lcdrw0;
PORTB = com;
delay(10);
lcden1;
delay(20);
lcden0;
delay(100);
}
void init_1602()//1602液晶初始化函数
{
write_com(0x38);//设置1602显示模式为5*7点阵
write_com(0x01);//清屏
write_com(0x0f);//开显示
write_com(0x06);//设置当读或写一个字符后,地址指针加一,且光标加一
write_com(0x80);//设置写数据起始地址
delay(300);
}
void main()
{
port_init();
delay(1000);
init_1602();
for(num=0;num<16;num++)
write_date(table[num]);
while(1);
}
|