AT89S52驱动1602液晶,8条数据线反着接的解决方法?
1.用AT89S52驱动1602液晶,单片机的P0.0-0.7分别连液晶的DB7-DB0,原定义为 #define databus P0 ,改为 #define databus ~P0 这样可以吗,如果不行,是否要把程序里的每处P0 都改为~P0呢?2.如果MCU连接1602的8位数据线不连续,比如P0.1 P0.3 P0.8 P0.9 P1.5 ...分别连DB0-DB7,用什么指令能解决?
刚开始学51,菜鸟一个,望大家支持,谢谢 楼上的朋友,对一个字节取反跟数据高低位反转不是一码事 1.取反不可以
unchar temp,i;
for(i=0;i<8;i++)
{
if(date&0x80)//date就是你要写的数据
temp|=0x80;
temp>>=1;//最后temp赋给IO口可以了
date<<=1;
}
2.你可以分别定义这8个口啊,然后把要写的数据一位一位的取出来,然后按照高低位分别赋给这几个口就OK拉!!
上面是的我解决方法,楼下朋友有更好的,让大家分享一下。。呵呵 软件当然可以解决, 不过影响速度, 最好还是硬件改过来 #define 是宏定义所以不能那样的,第二条软件可以解决不过影响速度. 有个51具有扩展指令,位倒序,写入REG D7--D0,读出D0--D7 楼上的,51有这么个指令吗? myqiang1990 发表于 2010-8-22 20:36 static/image/common/back.gif
1.取反不可以
unchar temp,i;
for(i=0;i>=1;//最后temp赋给IO口可以了
谢谢你啊,我搞了半天没弄出来呢,这点子好啊 直接移位就行,1602还考虑什么速度。 myqiang1990 的方法不错,受用了!THINKS the solution is fairly classical:
solution 1:unsigned char brev0(unsigned char x) {
x = (((x & 0xaa) >> 1) | ((x & 0x55) << 1));
x = (((x & 0xcc) >> 2) | ((x & 0x33) << 2));
x = (((x & 0xf0) >> 4) | ((x & 0x0f) << 4));
return x;
}solution 2://map 4 bits
const unsigned char code b2b[]={
0x00, //0x00
0x08, //0x01
0x04, //0x02
0x0c, //0x03
0x02, //0x04
0x0a, //0x05
0x06, //0x06
0x0e, //0x07
0x01, //0x08
0x09, //0x09
0x05, //0x0a
0x0d, //0x0b
0x03, //0x0c
0x0b, //0x0d
0x07, //0x0e
0x0f //0x0f
};
unsigned char brev1(unsigned char x) {
return b2b | (b2b<<4);
}so rather than "Pn=dat;", you say "Pn=brevx;" to bit reverse the data.
if you need speed, you can inline brev1(). for the fastest speed, or arbitrary wiring, you can use a 256 byte array to remap the data.
固然是查表法简单……
为什么不把数据线的顺序颠倒一下?
页:
[1]