lolg 发表于 2010-8-22 18:22:19

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,菜鸟一个,望大家支持,谢谢

skystalker 发表于 2010-8-22 19:19:34

楼上的朋友,对一个字节取反跟数据高低位反转不是一码事

myqiang1990 发表于 2010-8-22 20:36:09

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拉!!
上面是的我解决方法,楼下朋友有更好的,让大家分享一下。。呵呵

mcucow 发表于 2010-8-22 22:01:58

软件当然可以解决, 不过影响速度, 最好还是硬件改过来

wangfei 发表于 2010-8-22 22:10:01

#define 是宏定义所以不能那样的,第二条软件可以解决不过影响速度.

NJ8888 发表于 2010-8-22 22:37:59

有个51具有扩展指令,位倒序,写入REG D7--D0,读出D0--D7

gxustudent 发表于 2010-8-23 16:12:41

楼上的,51有这么个指令吗?

唯诚hhw2 发表于 2012-5-27 16:01:43

myqiang1990 发表于 2010-8-22 20:36 static/image/common/back.gif
1.取反不可以
unchar temp,i;
for(i=0;i>=1;//最后temp赋给IO口可以了


谢谢你啊,我搞了半天没弄出来呢,这点子好啊

Rapido 发表于 2012-5-27 16:05:33

直接移位就行,1602还考虑什么速度。

GUANLU 发表于 2012-5-27 19:08:53

myqiang1990 的方法不错,受用了!THINKS

millwood0 发表于 2012-5-28 02:24:53

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().

millwood0 发表于 2012-5-28 02:25:32

for the fastest speed, or arbitrary wiring, you can use a 256 byte array to remap the data.

XA144F 发表于 2012-5-28 08:00:07

固然是查表法简单……
为什么不把数据线的顺序颠倒一下?
页: [1]
查看完整版本: AT89S52驱动1602液晶,8条数据线反着接的解决方法?