找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7040|回复: 1
收起左侧

stm32单片机驱动金鹏12232液晶屏(SED1520控制器)

[复制链接]
ID:73735 发表于 2015-2-18 23:48 | 显示全部楼层 |阅读模式
本帖最后由 huge 于 2015-2-18 23:50 编辑


OCM12232.c文件:
#include"stm32f10x_lib.h"
#include "OCM12232.h"
const unsigned char tab7[]={
  /*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*--  文字:  %  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,
/*--  文字:  .  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
};
void Lcd12232delay(unsigned int Time)//延时函数
{
  unsigned int i,j;
  for ( i=0;i<Time;i++)
  for (j=0;j<1000;j++);
}
void Delay(unsigned int us)//延时微秒函数
{
  unsigned int m,k;
  for ( m=0;m<us;m++)
    for (k=0;k<72;k++);;
}
void LCD_WriteLByte(u8 Byte)//写PC口的低8位,高8位不变
{
  u16 Data_PAL;
  Data_PAL = GPIO_ReadOutputData(GPIOC);
  Data_PAL = Data_PAL&0xFF00;//保留高8位数据
  Data_PAL = Data_PAL | Byte;//写入低8位数据
  GPIO_Write(GPIOC,Data_PAL );
}
void w_com1(unsigned char com1)//左半屏写指令
{
  A0_0;
  RW_0;
  E1_1;
  Delay(8);
  LCD_WriteLByte(com1);
  Delay(8);
  E1_0;
}
void w_com2(unsigned char com2)//右半屏写指令
{
  A0_0;
  RW_0;
  E2_1;
  Delay(8);
  LCD_WriteLByte(com2);
  Delay(8);
  E2_0;
}
void w_data1(unsigned char data1)//左半屏写数据
{
  A0_1;
  RW_0;
  E1_1;
  Delay(8);
  LCD_WriteLByte(data1);
  Delay(8);
  E1_0;
}
void w_data2(unsigned char data2)//右半屏写数据
{
  A0_1;
  RW_0;
  E2_1;
  Delay(8);
  LCD_WriteLByte(data2);
  Delay(8);
  E2_0;
}
void readbusystate1(void)//左半屏忙检测
{
  u8 Busy1;
  A0_0;
  while(1)
  {
    RW_1;
    E1_1;
    Delay(8);
    Busy1=GPIO_ReadInputData(GPIOC);
    Delay(8);
    E1_0;
    if((Busy1&0x80)==0x00)
    {return;}
  }
}
void readbusystate2(void)//右半屏忙检测
{
  u8 Busy2;
  A0_0;
  while(1)
  {
    RW_1;
    E2_1;
    Delay(8);
    Busy2=GPIO_ReadInputData(GPIOC);
    Delay(8);
    E2_0;
    if((Busy2&0x80)==0x00)
    {return;}
  }
}
void wr_c(unsigned char command)//写命令--用于初始化
{
  readbusystate1();  //检测左半屏是否忙碌
  w_com1(command);   //写入左半屏初始化命令
  readbusystate2();  //检测右半屏是否忙碌
  w_com2(command);   //写入右半屏初始化命令
}
void display_map(const unsigned char *p)  //显示一幅122*32的图片,P是图片首地址
{
  unsigned char page,seg;
  
  for(page=0xB8;page<0xBC;page++)   //写页地址,共4页,0xB8--0xBC
  {
      w_com1(page);   //页地址
      w_com1(0xC0);   //行地址
      w_com1(0x00);   //列地址
      for(seg=0;seg<61;seg++)  //写61列数据值
        {w_data1(*p++);}
      
      w_com2(page);   //页地址
      w_com2(0xC0);   //行地址
      w_com2(0x00);   //列地址
      for(seg=0;seg<61;seg++)  //写61列数据值
        {w_data2(*p++);}  
  }
}
void all_operate(unsigned char P)  //全部显示,P位0xff时,为全显示,P为0x00时为清屏
{
  unsigned char page,seg;
  
  for(page=0xB8;page<0xBC;page++)
  {
    w_com1(page);   //页地址
    w_com1(0xC0);   //行地址
    w_com1(0x00);   //列地址
    for(seg=0;seg<61;seg++)  //写61列数据值
      {w_data1(P);}
      
    w_com2(page);   //页地址
    w_com2(0xC0);   //行地址
    w_com2(0x00);   //列地址
    for(seg=0;seg<61;seg++)  //写61列数据值
      {w_data2(P);}
  }
}
void ClearOnePage(unsigned char Left_Right,unsigned char page)  //Left_Right取值0和!0,分别表示左右半屏,page表示要清除的页面
{
  u8 seg1=0;u8 seg2=0;
  if(0==Left_Right)
  {
    w_com1(0xB8+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00);        //列地址
    for(seg1=0;seg1<61;seg1++)
        {w_data1(0x00);}
  }
  else
  {
    w_com2(0xB8+page);   //页地址
    w_com2(0xC0);        //行地址
    w_com2(0x00);        //列地址
    for(seg2=0;seg2<61;seg2++)  //写61列数据值
        {w_data2(0x00);}
  }
}
void Displayhz(u8 page,u8 Num,const unsigned char *p)  //从左半屏首列开始在page和page+1页显示num个16*16的汉字(包括标点符号)
{
  u8 j,num;
  if(Num<4)
  {
    for(num=0;num<3;num++)
      {
        w_com1(0xB8+page);   //页地址
        w_com1(0xC0);        //行地址
        w_com1(0x00+16*num); //列地址
        for(j=0;j<16;j++)    //写16列数据值
          {w_data1(*p++);}
        
        w_com1(0xB9+page);   //页地址
        w_com1(0xC0);        //行地址
        w_com1(0x00+16*num); //列地址
        for(j=0;j<16;j++)    //写16列数据值
          {w_data1(*p++);}
      }
  }
   else if(4==Num)
  {
    for(num=0;num<3;num++)
  {
    w_com1(0xB8+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00+16*num); //列地址
    for(j=0;j<16;j++)
        {w_data1(*p++);}
   
    w_com1(0xB9+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00+16*num); //列地址
    for(j=0;j<16;j++)
        {w_data1(*p++);}
  }
    w_com1(0xB8+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00+16*3); //列地址
    for(j=0;j<13;j++)
        {w_data1(*p++);}
   
    w_com2(0xB8+page);   //页地址
    w_com2(0xC0);        //行地址
    w_com2(0x00);        //列地址
    for(j=0;j<3;j++)
    {w_data2(*p++);}
   
    w_com1(0xB9+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00+16*3); //列地址
    for(j=0;j<13;j++)
        {w_data1(*p++);}
   
    w_com2(0xB9+page);   //页地址
    w_com2(0xC0);        //行地址
    w_com2(0x00);        //列地址
    for(j=0;j<3;j++)
        {w_data2(*p++);}
  }
  
  else if(4<Num)
  {
    for(num=0;num<3;num++)
    {
      w_com1(0xB8+page);   //页地址
      w_com1(0xC0);        //行地址
      w_com1(0x00+16*num); //列地址
      for(j=0;j<16;j++)
        {w_data1(*p++);}
      
      w_com1(0xB9+page);   //页地址
      w_com1(0xC0);        //行地址
      w_com1(0x00+16*num); //列地址
      for(j=0;j<16;j++)
        {w_data1(*p++);}
    }
    //汉字跨界,左半屏上半部分的13列
    w_com1(0xB8+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00+16*3);   //列地址
    for(j=0;j<13;j++)
        {w_data1(*p++);}
   
    //汉字跨界,右半屏上半部分的3列
    w_com2(0xB8+page);   //页地址
    w_com2(0xC0);        //行地址
    w_com2(0x00);        //列地址
    for(j=0;j<3;j++)
    {w_data2(*p++);}
   
    //汉字跨界,右半屏的下半部分13列
    w_com1(0xB9+page);   //页地址
    w_com1(0xC0);        //行地址
    w_com1(0x00+16*3);   //列地址
    for(j=0;j<13;j++)
        {w_data1(*p++);}
   
    //汉字跨界,右半屏的下半部分3列
    w_com2(0xB9+page);   //页地址
    w_com2(0xC0);        //行地址
    w_com2(0x00);        //列地址
    for(j=0;j<3;j++)
        {w_data2(*p++);}
   
    for(num=4;num<Num;num++)//右半屏继续显示汉字
    {
        w_com2(0xB8+page);         //页地址
        w_com2(0xC0);              //行地址
        w_com2(0x03+16*(num-4));   //列地址
        for(j=0;j<16;j++)
          {w_data2(*p++);}
        
        w_com2(0xB9+page);       //页地址
        w_com2(0xC0);            //行地址
        w_com2(0x03+16*(num-4)); //列地址
        for(j=0;j<16;j++)
          {w_data2(*p++);}  
    }
  }
  else  return;
}
void Disp_xy_hz(u8 page,u8 column,u8 Num,const unsigned char *p)//从左到右跨界于page页column列开始显示Num个汉字
{
  u8 i,j,num,num1,num2,num3;
  num1 = (61-column)/16;  //不需要跨界的汉字的个数
  num2 = 61-column-16*num1;  //跨界汉字左半屏列数
  num3 = 16-num2;     //跨界汉字右半屏列数
   
  for(num=0;num<num1;num++)
  {
    w_com1(0xB8+page);            //页地址
    w_com1(0xC0);                 //行地址
    w_com1(0x00+column+16*num);   //列地址
    for(i=0;i<16;i++)
      {w_data1(*p++);}
   
    w_com1(0xB9+page);            //页地址
    w_com1(0xC0);                 //行地址
    w_com1(0x00+column+16*num);   //列地址
    for(i=0;i<16;i++)
      {w_data1(*p++);}
  }
  
    w_com1(0xB8+page);             //页地址
    w_com1(0xC0);                  //行地址
    w_com1(0x00+column+16*num1);   //列地址
    for(i=0;i<num2;i++)
     {w_data1(*p++);}
   
    w_com2(0xB8+page);            //页地址
    w_com2(0xC0);                 //行地址
    w_com2(0x00);                 //列地址
    for(i=0;i<num3;i++)
    {w_data2(*p++);}
   
    w_com1(0xB9+page);
    w_com1(0xC0);                  //行地址
    w_com1(0x00+column+16*num1);   //列地址
    for(i=0;i<num2;i++)
     {w_data1(*p++);}
   
    w_com2(0xB9+page);            //页地址
    w_com2(0xC0);                 //行地址
    w_com2(0x00);                 //列地址
    for(i=0;i<num3;i++)
    {w_data2(*p++);}
   
    for(j=0;j<(Num-num1-1);j++)  //不需要跨界汉字个数Num-num1-1
    {
      w_com2(0xB8+page);            //页地址
      w_com2(0xC0);                 //行地址
      w_com2(0x00+num3+16*j);       //列地址
      for(i=0;i<16;i++)
        {w_data2(*p++);}
      
      w_com2(0xB9+page);            //页地址
      w_com2(0xC0);                 //行地址
      w_com2(0x00+num3+16*j);       //列地址
      for(i=0;i<16;i++)
        {w_data2(*p++);}
    }
}
void L_DisplayHZ(u8 page,u8 column,u8 Num,const unsigned char *p)  //左半屏Page页column列开始显示Num个汉字
{
  u8 num,i,j;
  for(num=0;num<Num;num++)
  {
    w_com1(0xB8+page);         //页地址
    w_com1(0xC0);              //行地址
    w_com1(0x00+column+16*num); //列地址
    for(j=0;j<16;j++)
      {w_data1(*p++);}
   
    w_com1(0xB9+page);         //页地址
    w_com1(0xC0);              //行地址
    w_com1(0x00+column+16*num); //列地址
    for(i=0;i<16;i++)
      {w_data1(*p++);}
  }
}
void R_DisplayHZ(u8 page,u8 column,u8 Num,const unsigned char *p)  //右半屏page页column列开始显示Num个汉字
{
  u8 num,i,j;
  for(num=0;num<Num;num++)
  {
    w_com2(0xB8+page);           //页地址
    w_com2(0xC0);                //行地址
    w_com2(0x00+column+16*num); //列地址
    for(j=0;j<16;j++)
      {w_data2(*p++);}
   
    w_com2(0xB9+page);           //页地址
    w_com2(0xC0);                //行地址
    w_com2(0x00+column+16*num); //列地址
    for(i=0;i<16;i++)
      {w_data2(*p++);}
  }
}
void L_DisplayZF(u8 page,u8 column,u8 Num,const unsigned char *p)  //左半屏从page页的column列开始显示Num个字符
{
  u8 i,j,num;
  for(num=0;num<Num;num++)     //Num个字符
  {
    w_com1(0xB8+page);         //页地址
    w_com1(0xC0);              //行地址
    w_com1(0x00+column+8*num);       //列地址
    for(i=0;i<8;i++)           //字符宽度为8
      {w_data1(*p++);}
   
    w_com1(0xB9+page);         //页地址
    w_com1(0xC0);              //行地址
    w_com1(0x00+column+8*num);       //列地址
    for(j=0;j<8;j++)
      {w_data1(*p++);}         //字符宽度为8
  }
}
void R_DisplayZF(u8 page,u8 column,u8 Num,const unsigned char *p)  //左半屏从page页的column列开始显示Num个字符
{
  u8 i,j,num;
  for(num=0;num<Num;num++)     //Num个字符
  {
    w_com2(0xB8+page);         //页地址
    w_com2(0xC0);              //行地址
    w_com2(0x00+column+8*num);       //列地址
    for(i=0;i<8;i++)           //字符宽度为8
      {w_data2(*p++);}
   
    w_com2(0xB9+page);         //页地址
    w_com2(0xC0);              //行地址
    w_com2(0x00+column+8*num);       //列地址
    for(j=0;j<8;j++)
      {w_data2(*p++);}         //字符宽度为8
  }
}
void R_Disp_OneZF(u8 page,u8 column,const unsigned char *p)//右半屏page页column列开始显示一个字符
{
  u8 i,j;
  w_com2(0xB8+page);         //页地址
  w_com2(0xC0);              //行地址
  w_com2(0x00+column);       //列地址
  for(i=0;i<8;i++)           //字符宽度为8
    {w_data2(*p++);}
   
  w_com2(0xB9+page);         //页地址
  w_com2(0xC0);              //行地址
  w_com2(0x00+column);       //列地址
  for(j=0;j<8;j++)
    {w_data2(*p++);}         //字符宽度为8
}
void Disp_TestNum(u8 page,u8 column,u16 Num)//右半屏显示测试数据和正确率百分比
{
  u8 num1,num2,num3;
  float percent;
  u16 percent1;
  u8 percent2,percent3,percent4;
  num1 = Num/100;        //百位数据
  num2 = (Num%100)/10;   //十位数据
  num3 = (Num%100)%10;   //个位数据
  
  percent = ((float) Num/640)*100;  //百分数
  percent1 = (int) (percent*10);    //取百分数的高三位数值
  percent2 = percent1/100;          //个分位值
  percent3 = (percent1%100)/10;     //十分位值
  percent4 = (percent1%100)%10;     //百分位值
  
  if(num1>0)  //测试数据>=100
  {
    R_Disp_OneZF(page,column,&tab7[16*num1]);     //显示百位
    R_Disp_OneZF(page,column+8,&tab7[16*num2]);   //显示十位
    R_Disp_OneZF(page,column+16,&tab7[16*num3]);  //显示个位
  }
  else   //测试数据小于100,大于等于10
  {
    if(num2>0)
    {
      R_Disp_OneZF(page,column,&tab7[16*num2]);
      R_Disp_OneZF(page,column+8,&tab7[16*num3]);
    }
    else    //测试数据小于10,大于0
    {
      if(num3>0)
      {
        R_Disp_OneZF(page,column,&tab7[16*num3]);
      }
      else   //测试数据=0
      {
        R_Disp_OneZF(page,column,&tab7[16*num3]);
      }
    }
  }
  
  if((0<Num)&(Num<640))
  {
    R_Disp_OneZF(page+2,column,&tab7[16*percent2]);    //显示个分位
    R_Disp_OneZF(page+2,column+8,&tab7[16*percent3]);  //显示十分位
    R_Disp_OneZF(page+2,column+16,&tab7[11*16]);       //显示小数点
    R_Disp_OneZF(page+2,column+24,&tab7[16*percent4]);  //显示百分位
    R_Disp_OneZF(page+2,column+32,&tab7[10*16]);        //显示百分号%
  }
  else
    if(640==Num)
  {
    R_Disp_OneZF(page+2,column,&tab7[16]);           //显示个分位
    R_Disp_OneZF(page+2,column+8,&tab7[0]);          //显示十分位
    R_Disp_OneZF(page+2,column+16,&tab7[0]);         //显示百分位
    R_Disp_OneZF(page+2,column+24,&tab7[10*16]);     //显示百分号%
  }
  else
    if(0==Num)
    {
      R_Disp_OneZF(page+2,column,&tab7[0]);          //显示0
    }
  else
  {
    return;
  }
}
void init_lcd (void)  //初始化
{
  RES_0;
  Delay(100);
  RES_1;
  Delay(100);
  
  wr_c(0xe2);  //复位
  Delay(100);
  
  wr_c(0xae);  //显示关闭
  wr_c(0xa4);  //动态驱动
  wr_c(0xa9);  //刷新时钟设置1/32
  wr_c(0xa0);  //ADC
  
  wr_c(0xee);  //END指令
  wr_c(0x00);  //从首列显示
  wr_c(0xc0);  //从首行显示
  
  wr_c(0xaf);  //显示打开
}
OCM12232.h文件:
#ifndef _OCM12232_h_
#define _OCM12232_h_

#define RES_0            GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define RES_1            GPIO_SetBits(GPIOC, GPIO_Pin_8)  //LCD上升沿复位,复位之后保持高电平
#define E1_0             GPIO_ResetBits(GPIOC, GPIO_Pin_9)     //ENABLE1=0,LCD读写禁止
#define E1_1             GPIO_SetBits(GPIOC, GPIO_Pin_9)   //ENABLE1=1,LCD读写使能
#define E2_0             GPIO_ResetBits(GPIOC, GPIO_Pin_10)   //ENABLE2=0,LCD读写禁止
#define E2_1             GPIO_SetBits(GPIOC, GPIO_Pin_10)     //ENABLE2=1,LCD读写使能
#define RW_0             GPIO_ResetBits(GPIOC, GPIO_Pin_11) //R/W=0,LCD写允许
#define RW_1             GPIO_SetBits(GPIOC, GPIO_Pin_11)   //R/W=1,LCD读允许
#define A0_0             GPIO_ResetBits(GPIOC, GPIO_Pin_12)//Ao=0,向LCD写入指令
#define A0_1             GPIO_SetBits(GPIOC, GPIO_Pin_12)  //Ao=1,向LCD输入数据
void Lcd12232delay(unsigned int Time);  //延时函数
void Delay(unsigned int us);  //延时微秒函数
void LCD_WriteLByte(u8 Byte);  //写PC口的低8位,高8位不变
void w_com1(unsigned char com1);  //左半屏写指令
void w_com2(unsigned char com2);  //右半屏写指令
void w_data1(unsigned char data1);  //左半屏写数据
void w_data2(unsigned char data2);  //右半屏写数据
void readbusystate1(void);  //左半屏忙检测
void readbusystate2(void);  //右半屏忙检测
void wr_c(unsigned char command);  //写命令--用于初始化
void display_map(const unsigned char *p);  //显示一幅122*32的图片,P是图片首地址
void all_operate(unsigned char P);  //全部显示,P位0xff时,为全显示,P为0x00时为清屏
void ClearOnePage(unsigned char Left_Right,unsigned char page);  //Left_Right取值0和!0,分别表示左右半屏,page表示要清除的页面
void Displayhz(u8 page,u8 Num,const unsigned char *p);  //从左半屏首列开始在page和page+1页显示num个16*16的汉字(包括标点符号)
void L_DisplayHZ(u8 page,u8 column,u8 Num,const unsigned char *p);  //左半屏Page页column列开始显示Num个汉字
void R_DisplayHZ(u8 page,u8 column,u8 Num,const unsigned char *p);  //右半屏page页column列开始显示Num个汉字
void L_DisplayZF(u8 page,u8 column,u8 Num,const unsigned char *p);  //左半屏从page页的column列开始显示Num个字符
void R_DisplayZF(u8 page,u8 column,u8 Num,const unsigned char *p);  //左半屏从page页的column列开始显示Num个字符
void init_lcd (void);//初始化
void R_Disp_OneZF(u8 page,u8 column,const unsigned char *p);//右半屏page页column列开始显示一个字符
void Disp_xy_hz(u8 page,u8 column,u8 Num,const unsigned char *p);//从左到右跨界于page页column列开始显示Num个汉字
void Disp_TestNum(u8 page,u8 column,u16 Num);//右半屏显示测试数据和正确率百分比
#endif
hw_conf.c文件:
#include"stm32f10x_lib.h"
#include "hw_conf.h"
#include "OCM12232.h"
ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void)
{
  RCC_DeInit();
  RCC_HSEConfig(RCC_HSE_ON);
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_3);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
}

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
void Setup_System(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
}
hw_conf.c文件:
#ifndef   _hw_conf_H_
#define   _hw_conf_H_
extern void Setup_System(void);
#endif
main.c文件:
#include"stm32f10x_lib.h"
#include "hw_conf.h"
#include"OCM12232.h"
const unsigned char tab1[]={
/*--  文字:  欢  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,
/*--  文字:  迎  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,
/*--  文字:  使  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00,
/*--  文字:  用  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,
};
const unsigned char tab2[]={
  /*--  文字:  P  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,
/*--  文字:  S  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,
/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
};
const unsigned char tab3[]={
/*--  文字:  喷  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0xFC,0x04,0x04,0xFC,0x00,0x24,0xA4,0xFC,0xA4,0xBF,0xA4,0xFC,0xA4,0x24,0x20,0x00,
0x07,0x01,0x01,0x03,0x00,0x80,0x4F,0x20,0x18,0x07,0x08,0x10,0x2F,0xE0,0x40,0x00,
/*--  文字:  头  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x12,0x64,0x2C,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x05,0x19,0x31,0xE1,0x41,0x01,0x00,
/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
/*--  文字:  试  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,
/*--  文字:  仪  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x20,0xF0,0x0C,0x03,0x00,0x38,0xC0,0x01,0x0E,0x04,0xE0,0x1C,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0x40,0x40,0x20,0x10,0x0B,0x04,0x0B,0x10,0x20,0x60,0x20,0x00,
/*--  文字:  !  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char tab4[]={
/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
/*--  文字:  试  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,
/*--  文字:  中  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
/*--  文字:  …  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char tab5[]={
  /*--  文字:  完  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x90,0x8C,0xA4,0xA4,0xA4,0xA5,0xA6,0xA4,0xA4,0xA4,0xA4,0x94,0x8C,0x04,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x70,0x00,0x00,
/*--  文字:  好  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00,
0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  数  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x92,0x54,0x38,0xFF,0x38,0x54,0x52,0x80,0xF0,0x1F,0x12,0x10,0xF0,0x10,0x00,
0x42,0x42,0x2A,0x2E,0x13,0x1A,0x26,0x02,0x40,0x20,0x13,0x0C,0x33,0x60,0x20,0x00,
/*--  文字:  目  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,0x00,
/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char tab6[]={
/*--  文字:  正  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
/*--  文字:  确  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x84,0xE4,0x5C,0x44,0xC4,0x10,0xF8,0x97,0x92,0xF2,0x9A,0x96,0xF2,0x00,0x00,
0x01,0x00,0x3F,0x08,0x88,0x4F,0x30,0x0F,0x04,0x04,0x3F,0x44,0x84,0x7F,0x00,0x00,
/*--  文字:  率  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x0C,0x14,0xA4,0x04,0x64,0x35,0xAE,0x64,0x24,0x14,0xA4,0x14,0x04,0x04,0x00,
0x08,0x0A,0x09,0x08,0x08,0x0A,0x0B,0xFE,0x0A,0x0B,0x0C,0x08,0x09,0x0A,0x08,0x00,
/*--  文字:  为  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x10,0x10,0x12,0x14,0x1C,0x10,0xF0,0x9F,0x10,0x10,0x10,0x10,0xF8,0x10,0x00,
0x00,0x00,0x40,0x20,0x10,0x08,0x06,0x01,0x00,0x11,0x26,0x40,0x20,0x1F,0x00,0x00,
/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void main(void)
{
Setup_System();        //系统启动
  
init_lcd ();           //LCD初始化
  
all_operate(0x00);     //清屏
  
while(1)
{
all_operate(0x00);    //清屏
   
Displayhz(0,4,tab1);   //从左半屏首列开始在page和page+1页显示num个16*16的汉字(包括标点符号)--显示"欢迎使用"
   
    R_DisplayZF(0,5,5,tab2);  //右半屏从page页的column列开始显示Num个字符--显示"PS640"
   
    Disp_xy_hz(2,0,6,tab3);  //从左到右跨界于page页column列开始显示Num个汉字--显示"喷头测试仪!"
   
Lcd12232delay(1000);
   
all_operate(0x00);  //清屏
   
Disp_xy_hz(1,30,4,tab4);  //从左到右跨界于page页column列开始显示Num个汉字--显示"测试中..."
   
Lcd12232delay(1000);  //延时
   
all_operate(0x00);  //清屏
   
Disp_xy_hz(0,5,5,tab5);  //从左到右跨界于page页column列开始显示Num个汉字--显示"完好数目:"
   
Disp_xy_hz(2,5,5,tab6);  //从左到右跨界于page页column列开始显示Num个汉字--显示"正确率为:"
   
Lcd12232delay(1000);  //延时
   
Disp_TestNum(0,15,0);  //右半屏显示测试数据
   
Lcd12232delay(1000);  //延时
  }
}

回复

使用道具 举报

ID:80102 发表于 2015-5-15 19:21 | 显示全部楼层
你好   请问我用你的程序去驱动ZXM12232G2(控制器为SED1520),并修改了相应的引脚配置,为什么显示屏依旧没显示呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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