找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1963|回复: 9
打印 上一主题 下一主题
收起左侧

uc1698u芯片驱动160*160屏 请教各位帮忙看下为啥第一位数据是错的?

[复制链接]
跳转到指定楼层
楼主
驱动个160*160的黑白屏,用的uc1698u芯片,采用16位彩色数据格式,必须两个8位才能驱动三个像素点,想让屏显示一个160*160的图片,网上找了很久没有找到相关程序,只能自己啃手册

程序如下:
  1. static unsigned char code pic[]={
  2. 0xaa,0xaa,0xaa};//三个8位做个试验
  3. void data8bit(unsigned char dat) //三位有效
  4. {
  5.         if(dat==0x00){        transfer_data(0x00);        transfer_data(0x00);}
  6.         if(dat==0x01){        transfer_data(0x00);        transfer_data(0x1f);}
  7.         if(dat==0x02){        transfer_data(0x07);        transfer_data(0xe0);}        
  8.         if(dat==0x03){        transfer_data(0x07);        transfer_data(0xff);}        
  9.         if(dat==0x04){        transfer_data(0xf8);        transfer_data(0x00);}        
  10.         if(dat==0x05){        transfer_data(0xf8);        transfer_data(0x1f);}
  11.         if(dat==0x06){        transfer_data(0xff);        transfer_data(0xe0);}
  12.         if(dat==0x07){        transfer_data(0xff);        transfer_data(0xff);}        
  13. }
复制代码
  1. void bmp()         
  2. {
  3.         unsigned long picdata=0;

  4.         char temdata;
  5.         set_lcd_address(0,0);
  6.         picdata=(pic[0]<<16)|(pic[1]<<8)|pic[2];//三个八位数据组组合成24位
  7.         temdata=picdata>>21;        //
  8.         data8bit(temdata&0x07);
  9.         temdata=picdata>>18;
  10.         data8bit(temdata&0x07);        
  11.         temdata=picdata>>15;
  12.         data8bit(temdata&0x07);               
  13.         temdata=picdata>>12;
  14.         data8bit(temdata&0x07);               
  15.         temdata=picdata>>9;
  16.         data8bit(temdata&0x07);
  17.         temdata=picdata>>6;
  18.         data8bit(temdata&0x07);        
  19.         temdata=picdata>>3;
  20.         data8bit(temdata&0x07);
  21.         temdata=picdata;
  22.         data8bit(temdata&0x07);        
  23. }
复制代码



为啥第一位数据pci[0]显示不正常,而第二位pic[1]和第三位pic[2]显示是正常的没有问题的。
我试过,直接给data8bit()函数直接赋值显示是没有问题的。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2023-6-26 11:12 | 只看该作者
走单步慢慢调试吧。也不知道【显示不正常】长什么样子。
回复

使用道具 举报

板凳
ID:1010435 发表于 2023-6-26 12:53 | 只看该作者
yzwzfyz 发表于 2023-6-26 11:12
走单步慢慢调试吧。也不知道【显示不正常】长什么样子。

这样说pic[0],pic[1],pic[2],每个字节8位,控制了3*8=24个像素点的亮和灭,上面的程序只能让9~24位置的像素点正常显示,而1~8位显示时乱的,不是p[0]的值。
回复

使用道具 举报

地板
ID:1010435 发表于 2023-6-26 12:59 | 只看该作者
另外再请教一下,8位的单片机,
如果变量
char a=0xff;
int b;
b=a;
这个时候b应该是两个字节,那么b的高八位全是0吗?
回复

使用道具 举报

5#
ID:883242 发表于 2023-6-26 15:39 | 只看该作者
mtt661 发表于 2023-6-26 12:59
另外再请教一下,8位的单片机,
如果变量
char a=0xff;

如果是unsigned显然会是0。

有鉴于你没有写unsigned,高8位是符号扩展,如果char最高位是0,那么高八位全0;如果char最高位是1,那么高八位全1,表示负数。随便举个栗子,char类型0xfe表示-2,那么扩展到int类型就是0xfffe,同样表示-2。
回复

使用道具 举报

6#
ID:59202 发表于 2023-6-26 16:27 | 只看该作者
问题应该就出在 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];
回复

使用道具 举报

7#
ID:1010435 发表于 2023-6-26 16:30 | 只看该作者
Hephaestus 发表于 2023-6-26 15:39
如果是unsigned显然会是0。

有鉴于你没有写unsigned,高8位是符号扩展,如果char最高位是0,那么高八 ...

明白了 我再试试
回复

使用道具 举报

8#
ID:384109 发表于 2023-6-26 16:35 | 只看该作者
void data8bit(unsigned char dat)有问题,而且你好像没搞清楚pic[]数组和2字节颜色数据的关系,看你的描述也没描述清楚
回复

使用道具 举报

9#
ID:1010435 发表于 2023-6-26 16:55 | 只看该作者
人中狼 发表于 2023-6-26 16:35
void data8bit(unsigned char dat)有问题,而且你好像没搞清楚pic[]数组和2字节颜色数据的关系,看你的描述 ...

这个data8bit函数我是验证过的,给data8bit函数赋值0x00~0x07 屏幕上三个像素点按000 001 010 011 100 101 110 111(1代表亮,0代表灭)分别能正常显示。
回复

使用道具 举报

10#
ID:1010435 发表于 2023-6-26 20:19 | 只看该作者
xxxevery 发表于 2023-6-26 16:27
问题应该就出在 picdata = (pic[0]

你这个方法是对的,我用的Keil5,加上(unsigned long)后正常了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表