数码之家

 找回密码
 立即注册
搜索
查看: 3803|回复: 13

[C51] 求助T6963C240128屏幕显示问题

[复制链接]
发表于 2021-4-14 00:50:46 | 显示全部楼层 |阅读模式
用拆机的240*128屏幕做个万年历,能点亮,程序也可以运行起来,功能上没什么问题,但显示不正常,希望坛子里的大佬给看看,怎么解决这个问题

这个是仿真的程序显示,抄的别的论坛的程序

单片机用的STC89C516,屏幕是T6963C的240128,




试过别的程序也一样有这个问题

大字体应该是32*64的但是宽度不够,数了下应该只有24,明显的缺少一部分竖,高度没有问题,还有就是右边四分之一的屏幕复制显示了左边的,不知道问题在哪
求大家指教,按说都运行了,显示了,应该没有问题的呀,自己蒙头搞了几个月还是没头绪,这个屏幕找不到资料,但T6963都是通用的吧?还有屏幕电路板上的小跳线是不是有关系??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2021-4-14 11:53:33 | 显示全部楼层
程序的问题,液晶驱动部分好好查查
回复 支持 反对

使用道具 举报

发表于 2021-4-14 15:39:54 来自手机浏览器 | 显示全部楼层
有完整的驱动代码吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-14 17:57:03 | 显示全部楼层
dulme 发表于 2021-4-14 11:53
程序的问题,液晶驱动部分好好查查

试过不同的两个程序,都有这样的现象
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-14 18:00:42 | 显示全部楼层
以下是程序的显示部分
/******************************************************
程    序:240×128液晶驱动
内    容:实现各种函数功能
液    晶:MSP240128(T6963C)
软    件:keil uVision4
作    者:Hzxin
整理日期:2011年7月20日
=====================================================
  本程序参考仿真社区(http://proteus.5d6d.com)一个网友
       写的LCD240*128显示程序,在此表示感谢!
******************************************************/

#ifndef MSP240128_H
#define MSP240128_H

#define unchar unsigned char
#define unint unsigned int

#define LCD_Data P2

// LCD240*128 I/O 信号管脚
sbit WR0 = P0^7; // 写信号,低有效
sbit RD0 = P0^6; // 读选择 ,低电平有效
sbit CE  = P0^5; // 片选信号,低电平有效,可直接接地
sbit CD  = P0^4; // 指令\数据 选择  高选择指令,低选择数据

//读取LCD状态字
uchar readstate(void)
{
        uchar lcd_state;
        LCD_Data=0xff; // 读取总线端口物理电平
        CD=1;
         _nop_();
        RD0=0;
         _nop_();
        lcd_state=LCD_Data;
        _nop_();
        _nop_();
        RD0=1;
       
        return lcd_state;
}

//判断指令(数据)读写忙否状态
void st01(void)
{
        while((readstate()&0x03)!=3)
    ;   
}



//判断数据自动写状态
void st3(void)
{
        while((readstate()&0x08)!=8)
    ;
}


/******************写一个命令***********/
void WriteCmd(unchar cmd)
{
        st01();                         //状态判断
        LCD_Data=cmd;
        WR0=0;
        _nop_();
        _nop_();
        WR0=1;
}
/****************写一个数据*************/
void WriteDate(unchar date)
{
        st01();                         //状态判断
        CD=0;
        _nop_();
        LCD_Data=date;
        WR0=0;
        _nop_();
        _nop_();
        WR0=1;
}
//数据自动写入函数
void writeauto(uchar onedata)
{
        st3();    //状态判断
        CD=0;      //C/D=0,数据通道
        _nop_();
        LCD_Data=onedata;
        WR0=0;
        _nop_();
        _nop_();
        WR0=1;
}

/**************写单参数******************/
void WriteTcp(unchar onep1,unchar comd1)
{
        WriteDate(onep1);
        WriteCmd(comd1);

}

/**************写双参数******************/
void WriteTcp2(unchar date1,unchar date2,unchar comd2)
{
        WriteDate(date1);
        WriteDate(date2);
        WriteCmd(comd2);
}
/***********************************************************
液晶初始化,清屏
***********************************************************/
void LcdInit()
{
        WriteTcp2(0,0,0x40);
        WriteTcp2(30,0,0x41);
        WriteTcp2(0,0,0x42);
        WriteTcp2(30,0,0x43);
        WriteCmd(0x80);
        WriteCmd(0x9a);
}

//清除屏幕(清所有8K存储空间)
void LcdClear(void)
{
        uint cl_count;
        WriteTcp2(0x00,0x00,0x24);  //设置显示存储器首地址
        WriteCmd(0xb0);  //设置自动写状态
        for(cl_count=8192;cl_count>0;cl_count--) writeauto(0x00);
        WriteCmd(0xb2);  //关闭自动写状态  
}

void Show816(uchar x_num,uchar y_num,uchar code_num)
{//8*16数字;x_hz:0~19;  y_hz:0~29          Show816(19,28,);
  uchar i_num;
  uint address,addr_num;
  address=x_num*30+y_num;  //计算显示存储器地址
  addr_num=code_num*16;  //计算汉字字模地址(cctab的下标)
  for(i_num=0;i_num<16;i_num++)  //计数值32
   {
           WriteTcp2(address&0xff,address/256,0x24);  //设置显示存储器地址
           WriteTcp(num816[addr_num++],0xc0);  //写入字模  
           address+=30;  //修改显示存储器地址,显示下一列
   }
}




void Show3264(unchar x_num,unchar y_num,unchar code_num)
{//32*64秒点;x_hz:0~19;  y_hz:0~7         
  unchar i_num;
  unint address,addr_num;
  address=x_num*30+y_num;  //计算显示存储器地址
  addr_num=code_num*256;  //计算汉字字模地址(cctab的下标)
  for(i_num=0;i_num<64;i_num++)  //计数值32
   {
           WriteTcp2(address&0xff,address/256,0x24);  //设置显示存储器地址
           WriteTcp(num3264[addr_num++],0xc0);  //写入字模
           WriteTcp(num3264[addr_num++],0xc0);  //写入字模
              WriteTcp(num3264[addr_num++],0xc0);  //写入字模
           WriteTcp(num3264[addr_num++],0xc0);  //写入字
           address+=30;  //修改显示存储器地址,显示下一列
   }
}

/*******************LCD显示字符****************/
void LcdPutStr(unchar x,unchar y,char *cha)
{
  unint address,i=0;
  unchar length,c1,c2,j,k;
  for(length=0;cha[length]!=0;length++);
   do
    {
      c1=cha;      
      c2=cha[i+1];
      address=x*30+y;
      if(c1<=128)      
       {
        for(k=0;k<16;k++)     
        {
                     WriteTcp2(address&0xff,address/256,0x24); //写入地址
          WriteCmd(0xb0); //启动自动写        
          WriteDate(ASCII[(c1-0x20)*16+k]);
          WriteCmd(0xb2);         
          address=address+30;
         }
        if(y>28)           
          {x=x+16;y=0;}
        else              
          {y++;}
           i++;
      }
     else              
      {
        for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)  
         {
           if(c1==GB_16[j].InitCode[0]&&c2==GB_16[j].InitCode[1])  //查找汉字
           break;            
         }
        if(j<sizeof(GB_16)/sizeof(GB_16[0]))   
         {
          for(k=0;k<16;k++)   
           {
            WriteTcp2(address&0xff,address/256,0x24);
            WriteCmd(0xb0);    //启动自动写   
            WriteDate(GB_16[j].CharCode[k*2]);
                        WriteDate(GB_16[j].CharCode[k*2+1]);
            WriteCmd(0xb2);            
            address=address+30;
                   }            
         }
        else            
         {
          for(k=0;k<16;k++)   
           {
            WriteTcp2(address&0xff,address/256,0x24); //写入地址
            WriteCmd(0xb0);          //地址设置
            WriteDate(0xff);
                    WriteDate(0xff);
            WriteCmd(0xb2);            
            address=address+30;            
           }
         }
        if(y>27)      
         {x+=16;y=0;}
        else         
         {y+=2;}
         i+=2;
      }
    }
   while(i<length);
}


#endif



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-4-14 19:33:04 来自手机浏览器 | 显示全部楼层
pooooyhb 发表于 2021-4-14 18:00
以下是程序的显示部分
/******************************************************
程    序:240×128液晶 ...

居然是TI的单片机,手头有一个我不会用这个单片机…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-14 21:19:57 | 显示全部楼层
触景情伤 发表于 2021-4-14 19:33
居然是TI的单片机,手头有一个我不会用这个单片机…

不是呀,原程序用的STC89C58.我用的STC89c516,
回复 支持 反对

使用道具 举报

发表于 2021-4-14 21:55:01 | 显示全部楼层
不是程序问题,是硬件问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-15 13:05:18 来自手机浏览器 | 显示全部楼层
找到原因了,没有fs定义,直接接地显示正常了
回复 支持 反对

使用道具 举报

发表于 2021-9-16 22:50:10 | 显示全部楼层
感谢楼主的分享,最近修几块工业LCD屏幕,主板被给客户用掉了。买个主板太贵,用你这个文件来驱动屏幕看看是否能显示。
回复 支持 反对

使用道具 举报

发表于 2021-9-16 22:52:19 | 显示全部楼层
问下楼主,不接时钟模块,240128液晶上能显示字符吗?我只是想用它测试屏幕有无问题而已。
回复 支持 反对

使用道具 举报

发表于 2021-9-20 20:14:56 | 显示全部楼层
有两个这屏,没搞亮,不知道是不是坏的
回复 支持 反对

使用道具 举报

发表于 2021-9-20 21:42:04 来自手机浏览器 | 显示全部楼层
余173917 发表于 2021-9-20 20:14
有两个这屏,没搞亮,不知道是不是坏的

试一下,我也有块过两天想折腾一下不亮的话就扔了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-28 04:43:13 | 显示全部楼层
wuliyang8 发表于 2021-9-16 22:52
问下楼主,不接时钟模块,240128液晶上能显示字符吗?我只是想用它测试屏幕有无问题而已。 ...

应该可以显示,具体忘了,可以试一试
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 00:19 , Processed in 0.655201 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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