OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 4175|回复: 4

STM32F103RBT6驱动东芝T6963C主控240128液晶的问题,高手看下代码错在哪里,指点一下谢谢。

[复制链接]

  离线 

2

主题

2

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2013-11-18
在线时间
0 小时
发表于 2013-11-26 17:00:34 | 显示全部楼层 |阅读模式
大神们好,小弟刚刚玩STM32不久,原来玩51的时候手头有块主控芯片为东芝T6963C的240128液晶显示,现在想使用STM32F103RBT6驱动一下该液晶,由于网上没有能用的驱动,就自己到CSDN下载了周立功LCP2131该液晶的程序进行修改了下,移植到STM32上,但是反复调试液晶就是没有显示,在此求大神看下该代码哪里有问题,编译通过的,但是驱动不了液晶。谢谢了。

#include "led.h"
#include "delay.h"
#include "sys.h"
//-----------------------------------------
//端口定义区
//-----------------------------------------
#define LCDIO GPIOC
#define LCDClk RCC_APB2Periph_GPIOC
#define Data GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
#define LCDWR GPIO_Pin_8
#define LCDRD GPIO_Pin_9      
#define LCDCD GPIO_Pin_12
//由于实际使用中FS和CE直接拉低,RST拉高,所以在此没有进行定义
//
//-----------------------------------------
//自定义区
//-----------------------------------------
//T6963C命令定义
#define  LCD_CUR_POS 0x21 /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
#define  LCD_CGR_POS 0x22 /* CGRAM偏置地址设置(可以增加自已的符号) */
#define  LCD_ADR_POS 0x24 /* 地址指针位置(设置读写操作指针) */

#define  LCD_TXT_STP 0x40 /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
#define  LCD_TXT_WID 0x41 /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
#define  LCD_GRH_STP 0x42 /* 图形区首址(从此地址开始向屏幕左上角显示点) */
#define  LCD_GRH_WID 0x43 /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */

#define  LCD_MOD_OR 0x80 /* 显示方式:逻辑或 */
#define  LCD_MOD_XOR 0x81 /* 显示方式:逻辑异或 */
#define  LCD_MOD_AND 0x83 /* 显示方式:逻辑与 */
#define  LCD_MOD_TCH 0x84 /* 显示方式:文本特征 */

#define  LCD_DIS_SW 0x90 /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
/* D1=1/0,光标显示启用/禁用 */
/* D2=1/0,文本显示启用/禁用(打开后再使用) */
/* D3=1/0,图形显示启用/禁用(打开后再使用) */
#define  LCD_CUR_SHP 0xA0 /* 光标形状选择:0xA0-0xA7表示光标占的行数 */

#define  LCD_AUT_WR 0xB0 /* 自动写设置 */
#define  LCD_AUT_RD 0xB1 /* 自动读设置 */
#define  LCD_AUT_OVR 0xB2 /* 自动读/写结束 */

#define  LCD_INC_WR 0xC0 /* 数据一次写,地址加1 */
#define  LCD_INC_RD 0xC1 /* 数据一次读,地址加1 */
#define  LCD_DEC_WR 0xC2 /* 数据一次写,地址减1 */
#define  LCD_DEC_RD 0xC3 /* 数据一次读,地址减1 */
#define  LCD_NOC_WR 0xC4 /* 数据一次写,地址不变 */
#define  LCD_NOC_RD 0xC5 /* 数据一次读,地址不变 */

#define  LCD_SCN_RD 0xE0 /* 屏读 */

#define  LCD_SCN_CP 0xE8 /* 屏拷贝 */

#define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */

#define  LCD_WID_LINE 0x20 //每一行显示字符数(32字符/行)

//u8 gCurRow,gCurCol; // 当前行列存储行高16 点列宽8点

const u8 CCTAB[15][32]=
{0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x02,
0x02,0x02,0x04,0x04,0x08,0x10,0x20,0x40,
0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x80,
0x80,0x40,0x40,0x20,0x10,0x18,0x0E,0x04},/*"大",0*/
/* (16 X 16 , 宋体 )*/

{0x21,0x11,0x11,0x02,0x97,0x52,0x52,0x12,
0x2F,0x22,0xE2,0x22,0x23,0x20,0x20,0x20,
0x00,0x00,0xFE,0x00,0xF8,0x88,0x48,0x08,
0xFE,0x88,0x48,0x08,0xFE,0x08,0x28,0x10},/*"海",1*/
/* (16 X 16 , 宋体 )*/

{0x02,0x01,0x00,0x7F,0x00,0x00,0x00,0x00,
0x00,0x01,0x06,0x18,0x28,0xE7,0x40,0x00,
0x00,0x00,0x88,0xFC,0x08,0x10,0x20,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0xFE,0x00},/*"之",2*/
/* (16 X 16 , 宋体 )*/

{0x01,0x02,0x0F,0x08,0x09,0x08,0x08,0xFF,
0x08,0x0A,0x09,0x08,0x10,0x10,0x20,0x40,
0x00,0x00,0xF0,0x10,0x10,0x90,0x10,0xFE,
0x10,0x10,0x90,0x90,0x10,0x10,0x50,0x20},/*"舟",3*/
/* (16 X 16 , 宋体 )*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x10,0x20,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",4*/
/* (16 X 16 , 宋体 )*/

{0x01,0x01,0x01,0xFF,0x03,0x03,0x05,0x05,
0x09,0x11,0x2F,0xC1,0x01,0x01,0x01,0x00,
0x00,0x00,0x00,0xFE,0x80,0x40,0x40,0x20,
0x10,0x18,0xEE,0x04,0x00,0x00,0x00,0x00},/*"本",5*/
/* (16 X 16 , 宋体 )*/

{0x04,0x04,0xFF,0x04,0x40,0x31,0x91,0x61,
0x49,0x09,0x11,0xE1,0x21,0x21,0x20,0x20,
0x20,0x20,0xFE,0x60,0x00,0xF8,0x08,0x08,
0x08,0x38,0x10,0x00,0x04,0x04,0xFC,0x00},/*"范",6*/
/* (16 X 16 , 宋体 )*/

{0x10,0x1B,0x11,0x21,0x21,0x62,0xA2,0x24,
0x2A,0x32,0x21,0x21,0x22,0x22,0x24,0x28,
0x02,0xE2,0x02,0x12,0xD2,0x52,0x52,0x52,
0x92,0x92,0x12,0x02,0x02,0x02,0x0A,0x04},/*"例",7*/
/* (16 X 16 , 宋体 )*/

{0x10,0x19,0x11,0x21,0x37,0x61,0xA1,0x21,
0x21,0x2F,0x21,0x23,0x22,0x24,0x28,0x20,
0x00,0x10,0x10,0x10,0xFC,0x10,0x10,0x10,
0x10,0xFE,0x20,0x10,0x18,0x0C,0x08,0x00},/*"供",8*/
/* (16 X 16 , 宋体 )*/

{0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x02,
0x02,0x02,0x04,0x04,0x08,0x10,0x20,0x40,
0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x80,
0x80,0x40,0x40,0x20,0x10,0x18,0x0E,0x04},/*"大",9*/
/* (16 X 16 , 宋体 )*/

{0x02,0x01,0x3F,0x40,0x5F,0x01,0x02,0x0F,
0x72,0x04,0x19,0x66,0x18,0x60,0x05,0x02,
0x00,0x00,0xFE,0x04,0xE8,0x00,0x00,0x20,
0xB0,0xC0,0xC0,0xB0,0x8E,0x84,0x00,0x00},/*"家",10*/
/* (16 X 16 , 宋体 )*/

{0x04,0x0C,0x11,0x3F,0x02,0xFF,0x04,0x09,
0x32,0xCC,0x31,0x06,0x18,0x03,0x7C,0x00,
0x00,0x20,0xF0,0x10,0x00,0xFC,0x40,0x20,
0x18,0x6E,0x84,0x18,0x60,0x80,0x00,0x00},/*"参",11*/
/* (16 X 16 , 宋体 )*/

{0x02,0x02,0x3F,0x02,0x02,0x7F,0x01,0x02,
0x07,0x1A,0xE7,0x02,0x00,0x00,0x00,0x00,
0x00,0x10,0xD8,0x20,0x40,0xFE,0x00,0x00,
0xFC,0x00,0xF8,0x08,0x08,0x08,0x50,0x20},/*"考",12*/
/* (16 X 16 , 宋体 )*/

};
//-----------------------------------------
//程序区
//-----------------------------------------
/**********************************************************
GPIO相关功能定义
**********************************************************/
GPIO_InitTypeDef  GPIOStru;  //定义用于定义所以引脚为输出的变量。

void IOInitOut(void)           //把所有端口初始化为推挽输出模式的函数。
{
    GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin =LCDWR|LCDRD|LCDCD;
GPIOStru.GPIO_Pin =Data;

    RCC_APB2PeriphClockCmd(LCDClk,ENABLE);
    GPIO_Init(LCDIO,&GPIOStru);
}

void IOInitIn(void)           //把数据引脚初始化为浮空输入的函数。
{
    GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定义数据引脚为浮空输入的变量初始化。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin =Data;

    RCC_APB2PeriphClockCmd(LCDClk,ENABLE);   //把所有端口初始化为输出模式的函数。   
    GPIO_Init(LCDIO,&GPIOStru);
}

/****************************************************
**函数名称:uint32 readstate(void)
**函数功能:t6963c读状态字子程序
**输入参数:无
**输出参数:lcd_state
*****************************************************/
u32 readstate(void)
{
u32 lcd_state;
IOInitIn(); //设置与LCD相连的D0----D7为输入
GPIO_SetBits(LCDIO,LCDCD); //开命令通道
GPIO_SetBits(LCDIO,LCDWR); //禁写
GPIO_ResetBits(LCDIO,LCDRD); //可读
lcd_state=Data;
//while(lcd_state==GPIO_ReadInputData(LCDIO) & 0x0080);
//GPIO_ReadInputData(LCDIO)&0x0080;
//__nop();
//delay_ms(300);
GPIO_SetBits(LCDIO,LCDRD);//读完状态即禁读
IOInitOut();
return(lcd_state);
}
/****************************************************
**函数名称:st01(void) 
**函数功能:t6963c指令(数据)读写状态判断子程序
**输入参数:无
**输出参数:无
*****************************************************/
void st01(void) 
while((readstate()&0x00030000)!=0x00030000) 
;    
/****************************************************
**函数名称:st02(void) 
**函数功能:t6963c数据自动读状态判断子程序
**输入参数:无
**输出参数:无
*****************************************************/
void st02(void) 
  while((readstate()&0x00040000)!=0x00040000) 
/****************************************************
**函数名称:st03(void) 
**函数功能:t6963c数据自动写状态判断子程序
**输入参数:无
**输出参数:无
*****************************************************/
void st03(void) 
while((readstate()&0x00080000)!=0x00080000)
/****************************************************
**函数名称:LCD_read_data(void)
**函数功能:t6963c读数据子程序
**输入参数:无
**输出参数:
*****************************************************/
void  LCD_read_data(void)
{
//对于显示,一般只写不读,故此函数暂时定为空函数
}
/****************************************************
**函数名称:LCD_Write_Command(uint8 dat)
**函数功能:t6963c写命令子程序
**输入参数:dat
**输出参数:无
*****************************************************/
void  LCD_Write_Command(u8 dat)
{
u32 data;
data=dat;
data=data<<16; //将8位数据转换为32位数据再传送
st01(); //判断是否空闲
GPIO_ResetBits(LCDIO,Data); //输出前先置低
LCDIO->ODR=((LCDIO->ODR & 0xff00)|data);
GPIO_SetBits(LCDIO,LCDCD); //指令通道
GPIO_SetBits(LCDIO,LCDRD); //禁读
GPIO_ResetBits(LCDIO,LCDWR); //开写
//LCDIO->ODR=(LCDIO->ODR&0XFF00FFFF)|data;
    //__nop();
//delay_ms(300);
    GPIO_ResetBits(LCDIO,LCDWR); //禁写
}
/****************************************************
**函数名称:LCD_Write_Data(uint8 dat)
**函数功能:t6963c写数据子程序
**输入参数:dat
**输出参数:无
*****************************************************/
void  LCD_Write_Data(u8 dat)
{
u32 data;
data=dat;
data=data<<16; //将8位数据转换为32位数据再传送
st01(); //判断是否空闲
GPIO_ResetBits(LCDIO,Data); //输出之前要先置低
LCDIO->ODR=((LCDIO->ODR & 0xff00)|data);
GPIO_ResetBits(LCDIO,LCDCD); //数据通道
GPIO_SetBits(LCDIO,LCDRD); //禁读
GPIO_ResetBits(LCDIO,LCDWR); //开写
//LCDIO->ODR=(LCDIO->ODR&0XFF00FFFF)|data;
    //__nop();
//delay_ms(300);
GPIO_SetBits(LCDIO,LCDWR); //禁写
}
/****************************************************
**函数名称:LCD_AutoWrite_Data(uint8 dat)
**函数功能:t6963c自动写数据子程序
**输入参数:dat
**输出参数:无
*****************************************************/
void  LCD_AutoWrite_Data(u8 dat)
{
u32 data;
data=dat;
data=data<<16; //将8位数据转换为32位数据再传送
st03(); //判断是否空闲
GPIO_ResetBits(LCDIO,Data); //IO1输出之前要先置低
LCDIO->ODR=((LCDIO->ODR & 0xff00)|data);
GPIO_ResetBits(LCDIO,LCDCD); //数据通道
GPIO_SetBits(LCDIO,LCDRD); //禁读
GPIO_ResetBits(LCDIO,LCDWR); //开写
//LCDIO->ODR=((LCDIO->ODR & 0xff00)|data);
    //__nop();
//delay_ms(300);
GPIO_SetBits(LCDIO,LCDWR); //禁写
}
/****************************************************
**函数名称:LCD_Write_Command1(uint8 command,uint8 dat1)
**函数功能:t6963c带一个参数写入子程序
**输入参数:command,dat1
**输出参数:无
*****************************************************/
void LCD_Write_Command1(u8 command,u8 dat1)
{
LCD_Write_Data(dat1);
LCD_Write_Command(command);
}
/****************************************************
**函数名称:LCD_Write_Command2(uint8 command,uint8 dat1,uint8 dat2)
**函数功能:t6963c带二个参数写入子程序
**输入参数:command,dat1,dat2
**输出参数:无
*****************************************************/
void LCD_Write_Command2(u8 command,u8 dat1,u8 dat2)
{
LCD_Write_Data(dat1);
LCD_Write_Data(dat2);
LCD_Write_Command(command);
}
/****************************************************
**函数名称:LCD_Initialize()
**函数功能:t6963c初始化子程序
**输入参数:无
**输出参数:无
*****************************************************/
void LCD_Initialize()
{
    IOInitOut();
LCD_Write_Command2(LCD_TXT_STP,0x00,0x00); //文本显示区域首地址0x0000
LCD_Write_Command2(LCD_TXT_WID,LCD_WID_LINE,0x00); //文本显示区域宽度32字节 
LCD_Write_Command2(LCD_GRH_STP,0x00,0x08); //图形显示区域首地址0x0800
LCD_Write_Command2(LCD_GRH_WID,LCD_WID_LINE,0x00); //图形显示区域宽度32字节 
LCD_Write_Command(LCD_MOD_OR); // 显示方式逻辑或,内部字符发生器有效
//LCD_Write_Command(LCD_MOD_TCH); // 显示方式文本特征方式,内部字符发生器有效
LCD_Write_Command(LCD_DIS_SW|0x0C); //文字开,图形开,光标显示开,光标闪烁开
LCD_Write_Command(LCD_CUR_SHP|0x07); // 光标形状选择0xA0-0xA7表示光标占的行数
}
/****************************************************
**函数名称:LCD_clear(void) 
**函数功能:t6963c清屏子程序(清所有8K存储空间)
**输入参数:无
**输出参数:无
*****************************************************/
void LCD_clear(void) 
{  
u32 i;
LCD_Write_Command2(LCD_ADR_POS,0x00,0x00); // 置地址指针为从零开始
LCD_Write_Command(LCD_AUT_WR); // 自动写
//for(i=0;i<256*256/8;i++) // 清屏
for(i=0;i<8192;i++) // 清屏
{
LCD_AutoWrite_Data(0x00); //
        }
LCD_Write_Command(LCD_AUT_OVR); // 自动写结束  
LCD_Write_Command2(LCD_ADR_POS,0x00,0x00);  // 重置地址指针
//gCurRow = 0; // 置地址指针存储变量
//gCurCol = 0;
/****************************************************
**函数名称:LCD_fillall(void) 
**函数功能:t6963c全显子程序
**输入参数:无
**输出参数:无
*****************************************************/
void LCD_fillall(void) 
{  
u32 i;
LCD_Write_Command2(LCD_ADR_POS,0x00,0x00); // 置地址指针为从零开始
LCD_Write_Command(LCD_AUT_WR); // 自动写
//for(i=0;i<256*256/8;i++) // 清屏
for(i=0;i<8192;i++) // 清屏
{
LCD_AutoWrite_Data(0xff); //
        }
LCD_Write_Command(LCD_AUT_OVR); // 自动写结束  
LCD_Write_Command2(LCD_ADR_POS,0x00,0x00);  // 重置地址指针
//gCurRow = 0; // 置地址指针存储变量
//gCurCol = 0;
/******************************************************************************** 
函数名: 
函数功能:   光标位置设置 
********************************************************************************/ 

void LCD_CursorPosSet(u8 cursor_X,u8 cursor_Y)
    LCD_Write_Command2(LCD_CUR_POS,cursor_X,cursor_Y);          //X的取值范围0-31;Y的取值范围0-31; 
/****************************************************
**函数名称:LCD_write_asc(uint8 x_asc,uint8 y_asc,uint8 code_asc) 
**函数功能:t6963c西文字符写入函数(x_asc:0~31; y_asc:0~31(256/8,256/8); code_asc:0~127)
**输入参数:x_asc,y_asc,code_asc
**输出参数:无
*****************************************************/
void LCD_write_asc(u8 x_asc,u8 y_asc,u8 code_asc) 
  u32 address; 
  address=y_asc*LCD_WID_LINE+x_asc; //上面已经设置一行32个字符
  LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
  LCD_Write_Command1(LCD_NOC_WR,code_asc);  //装入字符代码,写入数据,地址不变 
  if((x_asc)>=(LCD_WID_LINE-1)) //设置光标位置
  {
  LCD_CursorPosSet(0x00,(y_asc+1));
  }
  else
  {
  LCD_CursorPosSet((x_asc+1),y_asc);
  }
/****************************************************
**函数名称:LCD_dbwr_asc(uint8 x_asc,uint8 y_asc,uint8 code_asc[],uint8 num_asc)
**函数功能:t6963c利用内部库输入多个ASC码值函数
**输入参数:(x_asc:0~31; y_asc:0~31(256/8,256/8);code_asc[];num_asc(不超过数组下标值)
**输出参数:无
*****************************************************/
void LCD_dbwr_asc(u8 x_asc,u8 y_asc,u8 code_asc[],u8 num_asc)
{
u32 address; 
u8 i;
  address=y_asc*LCD_WID_LINE+x_asc; //上面已经设置一行32个字符
  LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
  for(i=0;i<num_asc;i++)
  {
  LCD_Write_Command1(LCD_INC_WR,code_asc);  //装入字符代码,写入数据,地址不变 
  }
}
/****************************************************
**函数名称:LCD_cgram()
**函数功能:t6963c文本方式输入汉字时字库函数
**输入参数:无
**输出参数:无
*****************************************************/
void LCD_cgram()
{
u8 i,j;
LCD_Write_Command2(LCD_ADR_POS,0x00,0x2C);
LCD_Write_Command2(LCD_CGR_POS,0x05,0x00); //设置偏移地址值 
LCD_Write_Command(LCD_AUT_WR); // 自动写
for(i=0;i<15;i++)
{
for(j=0;j<32;j++)
{
LCD_AutoWrite_Data(CCTAB[j]);
}
}
LCD_Write_Command(LCD_AUT_OVR); // 自动写结束  
}
/****************************************************
**函数名称:LCD_write_hz(uint8 x_hz,uint8 y_hz,uint8 code_hz) 
**函数功能:t6963c文本方式输入汉字,利用CGRAM函数构建字库
**输入参数:x_hz(0~31),y_hz(0~31),code_hz(CGRAM用户库中字符编号)
**输出参数:无
*****************************************************/
void LCD_write_hz(u8 x_hz,u8 y_hz,u8 code_hz) 
{
  u32 address; 
  address=y_hz*LCD_WID_LINE+x_hz; //上面已经设置一行32个字符
  LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
  LCD_Write_Command1(LCD_INC_WR,code_hz); /* 写入左上半部汉字代码 */
  LCD_Write_Command1(LCD_NOC_WR,(code_hz+2)); /* 写入右上半部汉字代码 */
  address=(y_hz+1)*LCD_WID_LINE+x_hz; //地址再往下移一行
  LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
  LCD_Write_Command1(LCD_INC_WR,(code_hz+1)); /* 写入左下半部汉字代码 */
  LCD_Write_Command1(LCD_NOC_WR,(code_hz+3)); /* 写入右下半部汉字代码 */
}
/****************************************************
**函数名称:LCD_dbwr_hz(uint8 x_hz,uint8 y_hz,uint8 code_hz,uint8 num_hz)
**函数功能:t6963c文本方式输入多个汉字子函数
**输入参数:x_hz(0~31),y_hz(0~31),code_hz(数组下标首地址),num_hz(不超过数组下标)
**输出参数:无
*****************************************************/
void LCD_dbwr_hz(u8 x_hz,u8 y_hz,u8 code_hz,u8 num_hz)
{
u32 address;
u8 i;
for(i=0;i<num_hz;i++)
{
address=y_hz*LCD_WID_LINE+x_hz+i*2; //上面已经设置一行32个字符
LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
  LCD_Write_Command1(LCD_INC_WR,(code_hz+i*4)); /* 写入左上半部汉字代码 */
  LCD_Write_Command1(LCD_INC_WR,(code_hz+2+i*4)); /* 写入右上半部汉字代码 */
  address=address+LCD_WID_LINE;
  LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
  LCD_Write_Command1(LCD_INC_WR,(code_hz+1+i*4)); /* 写入左下半部汉字代码 */
  LCD_Write_Command1(LCD_INC_WR,(code_hz+3+i*4)); /* 写入右下半部汉字代码 */
}
}
/****************************************************
**函数名称:LCD_write_hzg(uint8 x_hzg,uint8 y_hzg,uint8 code_hzg)
**函数功能:t6963c图形方式输入汉字
**输入参数:x_hzg(0~31),y_hzg(0~255),code_hzg(数组下标首地址)
**输出参数:无
*****************************************************/
void LCD_write_hzg(u8 x_hzg,u8 y_hzg,u8 code_hzg)
{
u32 address;
u8 i;
address=y_hzg*LCD_WID_LINE+x_hzg+0x0800; //上面已经设置一行32个字符
for(i=0;i<16;i++)
{
LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
LCD_Write_Command1(LCD_INC_WR,CCTAB[code_hzg]);
LCD_Write_Command1(LCD_INC_WR,CCTAB[code_hzg][i+16]);
address=address+LCD_WID_LINE; //地址再往下移32位(即下移图形方式的一行)
}  
}
/****************************************************
**函数名称:LCD_dbwr_hzg(uint8 x_hzg,uint8 y_hzg,uint8 code_hzg,uint8 num_hzg)
**函数功能:t6963c图形方式连续输入多个汉字子函数
**输入参数:x_hzg(0~31),y_hzg(0~256),code_hzg(字符表下标),num_hzg(字符个数,不超过数组下标)
**输出参数:无
*****************************************************/
void LCD_dbwr_hzg(u8 x_hzg,u8 y_hzg,u8 code_hzg,u8 num_hzg)
{
u32 address;
u8 i,j;
for(j=0;j<num_hzg;j++)
{
address=y_hzg*LCD_WID_LINE+x_hzg+j*2+0x0800; //上面已经设置一行32个字符
for(i=0;i<16;i++)
{
LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  //设置显示存储器地址 
LCD_Write_Command1(LCD_INC_WR,CCTAB[code_hzg+j]);
LCD_Write_Command1(LCD_INC_WR,CCTAB[code_hzg+j][i+16]);
address=address+LCD_WID_LINE; //地址再往下移32位(即下移图形方式的一行)
}  
}
}
/****************************************************
**函数名称:LCD_draw_dot(uint8 x_dot,uint8 y_dot)
**函数功能:t6963c图形方式绘点函数
**输入参数:x_dot(0~255),y_dot(0~255),s_dot(0擦除点,1画点)
**输出参数:无
*****************************************************/
void LCD_draw_dot(u8 x_dot,u8 y_dot,u8 s_dot)
{
u32 address;
u8 i;
address=y_dot*LCD_WID_LINE+x_dot/8+0x0800;
LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8)); 
i=(~(x_dot%8))&0x07;
if(s_dot==1)
{
LCD_Write_Command(LCD_BIT_OP|0x08|i); //画点
}
else
{
LCD_Write_Command(LCD_BIT_OP|i); //清点
}
}
/****************************************************
**函数名称:LCD_draw_circle(uint8 Ox,uint8 Oy,uint8 Rx)
**函数功能:t6963c图形方式画图函数
**输入参数:Ox(圆心坐标X),Oy(圆心坐标Y),Rx(圆半径),s(0擦除点,1画点)
**输出参数:无
*****************************************************/
void LCD_draw_circle(u8 Ox,u8 Oy,u8 Rx,u8 s)
{
    u32 xx,rr;
    u32 xt,yt;
    u32 rs,row,col;
    yt = Rx;
    rr = (u32)Rx*Rx+5; // 补偿5,修正正方形
    rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
    for (xt=0;xt<=rs;xt++)
    {
        xx = xt*xt;
        while ((yt*yt)>(rr-xx))
        {
            yt--;
        }
        row = Ox+xt; // 第一象限
        col = Oy-yt;
        LCD_draw_dot(row,col,s);
        row = Ox-xt; // 第二象限
        LCD_draw_dot(row,col,s);
        col = Oy+yt; // 第三象限
        LCD_draw_dot(row,col,s);
        row = Ox+xt; // 第四象限
        LCD_draw_dot(row,col,s);
        /***************45度镜象画另一半***************/
        row = Ox+yt; // 第一象限
        col = Oy-xt;
        LCD_draw_dot(row,col,s);
        row = Ox-yt; // 第二象限
        LCD_draw_dot(row,col,s);
        col = Oy+xt; // 第三象限
        LCD_draw_dot(row,col,s);
        row = Ox+yt; // 第四象限
        LCD_draw_dot(row,col,s);
    }
}
/****************************************************
**函数名称:LCD_draw_rectangle(uint8 xstar,uint8 xend,uint8 ystar,uint8 yend,uint8 s)
**函数功能:t6963c画矩形函数
**输入参数:xstar,xend,ystar,yend,s(1画点0清点)
**输出参数:无
*****************************************************/
void LCD_draw_rectangle(u8 xstar,u8 xend,u8 ystar,u8 yend,u8 s) 
  u8 i; 
  for(i=xstar;i<=xend;i++)  //两水平线 
  { 
  LCD_draw_dot(i,ystar,s);
  LCD_draw_dot(i,yend,s);
  } 
  for(i=ystar;i<=yend;i++)  //两垂直线 
  { 
  LCD_draw_dot(xstar,i,s);
  LCD_draw_dot(xend,i,s);
  } 
/****************************************************
**函数名称:LCD_disp_pic(uint8 x_pic,uint8 y_pic,uint8 row,uint8 col,uint8 *dat)
**函数功能:t6963c输出图片函数
**输入参数:x_pic,y_pic,row,col,*dat
**输出参数:无
*****************************************************/
void LCD_disp_pic(u8 x_pic,u8 y_pic,u8 row,u8 col,u8 *dat)
{
u32 address;
u32 i,j;
for(i=0;i<row;i++)
{
address=(y_pic+i)*LCD_WID_LINE+x_pic+0x0800;
LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address>>8));  
for(j=0;j<col;j++)
{
LCD_Write_Command1(LCD_INC_WR,*dat);
dat++;
}
}
}

/****************************************************
**函数名称:main()
**函数功能:主函数
**输入参数:dly 延时参数,值越大,延时越久
**输出参数:无
*****************************************************/
int main (void)
{// add user source code 
//
//uint8 i;
  SystemInit(); //系统时钟初始化为72M  SYSCLK_FREQ_72MHz
delay_init(72);     //延时函数初始化  
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
  LED_Init();     //LED端口初始化
LED0=0,LED1=0;
LCD_Initialize(); //初始化LCD
LCD_clear(); //清屏LCD
//LCD_fillall(); //
LCD_cgram(); //建字库
LCD_write_hz(0X0E,0X04,0X80);

LCD_write_hzg(0X15,0X20,0X03);
LCD_write_asc(0x0A,0x18,0x3A);
LCD_dbwr_hzg(0x01,0x50,0x00,15); //图形方式连续输入汉字
LCD_dbwr_hz(0x01,0x0D,0x80,15); //CGRAM文本方式连续输入字符
}

回复

使用道具 举报

  离线 

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3263
金钱
3263
注册时间
2012-1-16
在线时间
36 小时
发表于 2013-11-26 19:22:32 | 显示全部楼层
没用过帮顶
回复 支持 反对

使用道具 举报

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-6-24
在线时间
0 小时
发表于 2015-12-22 13:18:24 | 显示全部楼层
数据位为啥是输入啊  是不是输入输出搞错了
回复 支持 反对

使用道具 举报

  离线 

3

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
金钱
285
注册时间
2016-7-16
在线时间
73 小时
发表于 2017-6-29 09:43:10 | 显示全部楼层
楼主,数据位用FSMC的方式写过吗?
回复 支持 反对

使用道具 举报

  离线 

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-6-26
在线时间
12 小时
发表于 2018-7-12 23:42:28 | 显示全部楼层
顶下老哥
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-21 12:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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