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万种办法去确认它。然后再调试,否则你的所有努力都是在白费事。
[解决办法]
楼主的代码格式。。。
估计没人愿意看。