xxxevery 发表于 2023-6-26 16:27 你这个方法是对的,我用的Keil5,加上(unsigned long)后正常了。 |
人中狼 发表于 2023-6-26 16:35 这个data8bit函数我是验证过的,给data8bit函数赋值0x00~0x07 屏幕上三个像素点按000 001 010 011 100 101 110 111(1代表亮,0代表灭)分别能正常显示。 |
void data8bit(unsigned char dat)有问题,而且你好像没搞清楚pic[]数组和2字节颜色数据的关系,看你的描述也没描述清楚 |
Hephaestus 发表于 2023-6-26 15:39 明白了 我再试试 |
问题应该就出在 picdata = (pic[0] << 16) | (pic[1] << 8) | pic[2]; 这一行程序上,pic[0]、pic[1]是一个8位无符号数,你把它左移16和8位,本身就是一个非常规操作,不同编译器会有不同的解释操作,非常容易得到不是你想象的结果。你可以试试改成这样 picdata = ((unsigned long)pic[0] << 16) | ((unsigned long)pic[1] << 8) | pic[2]; |
mtt661 发表于 2023-6-26 12:59 如果是unsigned显然会是0。 有鉴于你没有写unsigned,高8位是符号扩展,如果char最高位是0,那么高八位全0;如果char最高位是1,那么高八位全1,表示负数。随便举个栗子,char类型0xfe表示-2,那么扩展到int类型就是0xfffe,同样表示-2。 |
另外再请教一下,8位的单片机, 如果变量 char a=0xff; int b; b=a; 这个时候b应该是两个字节,那么b的高八位全是0吗? |
yzwzfyz 发表于 2023-6-26 11:12 这样说pic[0],pic[1],pic[2],每个字节8位,控制了3*8=24个像素点的亮和灭,上面的程序只能让9~24位置的像素点正常显示,而1~8位显示时乱的,不是p[0]的值。 |
走单步慢慢调试吧。也不知道【显示不正常】长什么样子。 |