首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

KS0108 19264驱动有关问题

2012-11-03 
KS0108 19264驱动问题?STC89C52的机器,参考了网上的代码,改了半天没效果,哪个老大支持下下!19264的屏,KS01

KS0108 19264驱动问题?
STC89C52的机器,参考了网上的代码,改了半天没效果,哪个老大支持下下!19264的屏,KS0108芯片!

#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>

/********************引脚定义********************/

sbit RS =P3^0; //数据指令
sbit RW =P3^1; //读写
sbit E =P3^2; //使能
sbit CSL =P3^3; //左片选
sbit CSM =P3^4; //中片选
sbit CSR =P3^5; //右片选
sbit RST =P3^6;

unsigned char Page; //页 地址
unsigned char Col; //列 地址

unsigned char code BMP1[];
unsigned char code BMP2[];

void Delay(unsigned int MS);
void wtcom(void);

/***************************/
/*检查Busy */
/***************************/
void BusyL(void)
{
  CSL= 1;
  CSM= 0;
  CSR= 0;
  wtcom();
}

void BusyM(void)
{
  CSL= 0;
  CSM= 1;
  CSR= 0;
  wtcom();
}

void BusyR(void)
{
  CSL= 0;
  CSM= 0;
  CSR= 1;
  wtcom();
}

void wtcom(void)
{
  RS = 0; //指令
  RW = 1;
  P1 = 0xFF; //输出0xff以便读取正确
  E = 1;
  _nop_();_nop_();_nop_();
  while(P1 & 0x80); //Status Read Bit7 = BUSY
  E = 0;
  _nop_(); _nop_();_nop_();
}

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
  unsigned char x,y;
  switch (Col&0xc0) /* col.and.0xC0 */
  { /*条件分支执行 */
  case 0: {BusyL();break;}/*左区 */
  case 0x40: {BusyM();break;}/*中区 */
  case 0x80: {BusyR();break;}/*右区 */
  }
  x = Col&0x3F|0x40; /* col.and.0x3f.or.Set Y Address*/
  y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */
  wtcom(); /* waitting for enable */
  RS = 0; //指令
  RW = 0; //写
  P1 = y; //设置页面地址
  E = 1;
  _nop_();
  E = 0;
  _nop_(); _nop_();_nop_();_nop_();
  wtcom(); /* waitting for enable */
  RS = 0;
  RW = 0;
  P1 = x; //设置列地址
  E = 1;
  _nop_();_nop_();_nop_();_nop_();
  E = 0;
  _nop_(); _nop_();_nop_();_nop_();
}

/***************************/
/*写指令 */
/***************************/
void WriteCommandL( unsigned char CommandByte )
{
  BusyL();
  P1 = CommandByte;
  RS = 0; //指令
  RW = 0;
  E = 1;
  _nop_();_nop_();_nop_();_nop_();
  E = 0;
  _nop_();_nop_();_nop_();_nop_();
}

void WriteCommandM( unsigned char CommandByte )
{
  BusyM();
  P1 = CommandByte;
  RS = 0; //指令
  RW = 0;
  E = 1;
  _nop_();_nop_();_nop_();_nop_();
  E = 0;
  _nop_();_nop_();_nop_();_nop_();
}

void WriteCommandR( unsigned char CommandByte )
{
  BusyR();
  P1 = CommandByte;


  RS = 0; //指令
  RW = 0;
  E = 1;
  _nop_();_nop_();_nop_();_nop_();
  E = 0;
  _nop_();_nop_();_nop_();_nop_();
}

/***************************/
/*读数据 */
/***************************/
unsigned char ReadData( void )
{
  unsigned char DataByte;
  Locatexy(); /*坐标定位,返回时保留分区状态不变 */
  RS = 1; /*数据输出*/
  RW = 1; /*读入 */
  P1 = 0xFF; //输出0xff以便读取正确
  E = 1; /*读入到LCM*/
  _nop_();_nop_();_nop_();_nop_();
  DataByte = P1; /*数据读出到数据口P1 */
  E = 0;
  _nop_();_nop_();_nop_();_nop_();
  return DataByte;
}

/***************************/
/*写数据 */
/***************************/
void WriteData( unsigned char DataByte )
{
  Locatexy(); /*坐标定位,返回时保留分区状态不变 */
  RS = 1; /*数据输出*/
  RW = 0; /*写输出 */
  P1 = DataByte; /*数据输出到数据口 */
  E = 1; /*写入到LCM*/
  _nop_();_nop_();_nop_();_nop_();
  E = 0;
  _nop_();_nop_();_nop_();_nop_();
}

void LcmClear( void )
{
  Page = 0;
  Col = 0;
  for(Page=0;Page<8;Page++)
  for(Col=0;Col<192;Col++)
  WriteData(0);
}

void LcmInit( void )
{
  WriteCommandL(0x3f); //开显示
  WriteCommandM(0x3f);
  WriteCommandR(0x3f);
   
  WriteCommandL(0xc0); //设置起始地址=0
  WriteCommandM(0xc0);
  WriteCommandR(0xc0);

  WriteCommandL(0x3f); //开显示
  WriteCommandM(0x3f);
  WriteCommandR(0x3f);

  LcmClear();
  Col = 0;
  Page= 0;
  Locatexy();
}

void LcmPutDots( unsigned char DotByte )
{
  Page = 0;
  Col = 0;
  for(Page=0;Page<8;Page++)
  {
  for(Col=0;Col<192;Col++)
  {
  WriteData( DotByte );
  DotByte = ~DotByte;
  }
  }
}

void LcmPutBMP( unsigned char *puts )
{
  unsigned int X=0;
  Page = 0;
  Col = 0;
  for(Page=0;Page<8;Page++)
  {
  for(Col=0;Col<192;Col++)
  {
  WriteData( puts[X] );
  X++;
  }
  }
}

void LcmReverseBMP( void )
{
  unsigned char temp;
  Page = 0;
  Col = 0;
  for(Page=0;Page<8;Page++)
  {
  for(Col=0;Col<192;Col++)
  {
  temp = ReadData(); //空读一次
  temp = ReadData();
  temp = ~temp;
  WriteData(temp);
  }
  }
}

void Delay(unsigned int MS)
{
  unsigned char us,usn;
  while(MS!=0)
  {
  usn = 2; //for 12M
  while(usn!=0)
  {
  us=0xf6;
  while (us!=0){us--;};


  usn--;
  }
  MS--;
  }
}

void Main( void )
{
  Delay(200); //等待复位
  LcmInit();
  LcmClear();
  while(1)
  {
  LcmPutBMP(BMP1);
  Delay(1500);
  LcmReverseBMP();
  Delay(1500);
  LcmPutBMP(BMP2);
  Delay(1500);
  LcmReverseBMP();
  Delay(1500);
  }
}


[解决办法]
给初学单片机提问者的一点建议
本文仅针对初学单片机,调试硬件,并遇到问题的朋友。
本人使用单片机大概有10年左右了,大概也就是个初级半的水平。
各种大大小小的总线,及乱七八糟芯片都使用过一些。
目前为止,还没有哪个硬件或总线调试不通,最多是时间长短的问题。
硬件调试通过,不一定是硬件的所有功能都实现,而是能对硬件进行基本的操作。

建议提问时,尽量言简意赅,不要有错别字。
尽量仔细看芯片的手册,尤其是时序和寄存器设定。如果时序看不懂的话,建议花点时间仔细研究一下单片机的读写时序,研究明白了以后,你会受益匪浅,以后看其他时序也有帮助。时序是一定要会看的,否则调试硬件的时候你会遇到很多麻烦。另学会示波器的基本使用对调试硬件也有很大帮助

在调试硬件的时候尽量把程序做到最小化,比如调试某个硬件,你的代码里只有和这个硬件相关的信息,最多包含几个LED,复杂情况可以增加串口打印数据,这些就足够了。

在论坛上贴代码的时候,请一定要让代码简化到你能做到的最小化,否则没有人会花大量时间去看你写的代码,即使你的代码很漂亮很规范,但是篇幅过长的话,也没有人爱看,至少我不会去看。
尤其是
/* 某某函数*/
/*参数作用*/
/*返回值*/
等,类似这些注释请删除,最多只写个函数功能就好了。
而且调试简单硬件的时候,我认为根本用不到建立过多的函数。
调试复杂硬件的时候,可能会有很多函数,但是初期也用不到过多的函数。

还有一个最主要的问题,请先确认你调试的“硬件”和“硬件电路”肯定是好用的,你可以选用100种,1000种,或1万种办法去确认它。然后再调试,否则你的所有努力都是在白费事。

[解决办法]
楼主的代码格式。。。
估计没人愿意看。

热点排行