STC12C5A60s2 点亮液晶屏 不容易啊

把我百度空间的文章全部转过来!

本来想去21ic开blog的,没想到级别不够,所以来此!然后会把以后遇到的技术问题记录下来,慢慢品味!

 

这周在焊板子,调试程序,然后遇到了一些问题,所幸今天加班去把问题搞定啦,哎呀,真不容易啊!

遇到的问题有以下几点:

1.某日调板子是MAX3232通过的电流过大,还以为是3232坏了,定眼看,原来是将3232边上的一个电容给短路啦,电容上有焊锡,直接将两端给连接起来啦!3232边上有4个0.1UF的电容,据datasheet。倘若换成其他的电容,MAX3232电流极大!超级不稳定!

2.学会用SBUF串口数据与单片机通信,来调试程序,将发出去的程序发回来给串口调试助手看看!SBUF中的数据为ASCII码值!

3.主芯片用的是STC12C5A60s2,晶振为22M,液晶用的是12232—19,刚开始检查程序,液晶上就是显示不出字来,硬件PCB,程序检查了好几遍,就是不出来,然后得知,STC的片子是需要将端口改为强推挽的,然后加上 

P0M1=0X00; //STC12C5A60s2,端口改为强推挽
P0M0=0XFF;
P1M1=0X00;
P1M0=0XFF;
P2M1=0X00;
P2M0=0XFF;
P3M1=0X00;
P3M0=0XFF;
P4M1=0X00;
P4M0=0XFF;

这段程序就OK啦!液晶就会显示字符啦!

调试通过的源程序如下:               

#include<STC_NEW_8051.h>

sbit RS=P5^1;          // 命令或数据
sbit WRD=P4^4;    //写入、读出命令引脚
sbit E=P5^0;    //使能

//sbit PSB=P2^0;     //串行、并行
//sbit RES=P2^2;     //复位
void TransferData(char data1,bit DI);
void delayms(unsigned int n);
void delay(unsigned int m);
void lcd_mesg(unsigned char code *addr1);
 
//下面来定义要显示的汉字,8*4
unsigned char code IC_DAT[]={"终于搞定啦            "};
unsigned char code IC_DAT2[]={"我终于搞定啦"};
void initinal(void)           //初始化,12864有要求的要写上
{
delayms(400);
//PSB=1;   //并口工作模式
delayms(10);
//RES=0; //复位
//delay(10);
//RES=1;   //复位置高
//delayms(10);
TransferData(0x30,0); //选择基本指令集,8位
delayms(100);
//TransferData(0x30,0);
//delay(37);
//TransferData(0x08,0);
//delay(100);
TransferData(0x10,0);//游标或显示移位控制
delayms(100);
TransferData(0x0C,0); //开显示(无游标、不反白)
delayms(100);
TransferData(0x01,0); //清屏指令:清屏且AC值为00H
delayms(100);
TransferData(0x06,0); //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
delayms(100);
}
 void main(void)            //分两屏来不断显示上面定义的IC_DAT和IC_DAT2汉字
{
P0M1=0X00;     //STC12C5A60s2,端口改为强推挽
P0M0=0XFF;
P1M1=0X00;
P1M0=0XFF;
P2M1=0X00;
P2M0=0XFF;
P3M1=0X00;
P3M0=0XFF;
P4M1=0X00;
P4M0=0XFF;
while(1)
{
   initinal();//调用LCD字库初始化程序
   delay(100);
   lcd_mesg(IC_DAT);
   delayms(500);                   //延时程序必要的,长与短,自己调节
   delayms(500);
   initinal();
   delay(100);
   lcd_mesg(IC_DAT2);
   delayms(500);
   delayms(500);
}
}
 
void lcd_mesg(unsigned char code *addr1)   //显示汉字函数,8*4=32
{
unsigned char i;
TransferData(0x80,0);
delay(100);
while(*addr1 !='\0')
{
  
    TransferData(*addr1,1);
    addr1++;
      
}
}
   
void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据
{
WRD=0;
RS=DI;
delay(1);
P0=data1;
E=1;
delay(1);
E=0;
}
 
void delayms(unsigned int n)    //延时子程序
{
 unsigned int i,j;
 for(i=0;i<n;i++)
    for(j=0;j<2000;j++);
}

void delay(unsigned int m)
{
 unsigned int i,j;
 for(i=0;i<m;i++)
 for(j=0;j<10;j++);
}

你可能感兴趣的:(STC12C5A60s2 点亮液晶屏 不容易啊)