一个lcd的程序搞云雀叫了一整天txt了真的不知道哪里有错,求好心的大神指导我一下哪里错了,他就是显示不出字符来

查看: 2719|回复: 2
STM32F103RBT6驱动东芝T6963C主控240128液晶的问题,高手看下代码错在哪里,指点一下谢谢。
主题帖子精华
新手上路, 积分 30, 距离下一级还需 20 积分
在线时间0 小时
大神们好,小弟刚刚玩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 /* 屏拷贝 */
LCD_BIT_OP
0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
#define &LCD_WID_LINE 0x20 //每一行显示字符数(32字符/行)
//u8 gCurRow,gCurC
// 当前行列存储行高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 &GPIOS &//定义用于定义所以引脚为输出的变量。
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 =D
& & 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 =D
& & RCC_APB2PeriphClockCmd(LCDClk,ENABLE); & //把所有端口初始化为输出模式的函数。 &&
& & GPIO_Init(LCDIO,&GPIOStru);
/****************************************************
**函数名称:uint32 readstate(void)
**函数功能:t6963c读状态字子程序
**输入参数:无
**输出参数:lcd_state
*****************************************************/
u32 readstate(void)
IOInitIn(); //设置与LCD相连的D0----D7为输入
GPIO_SetBits(LCDIO,LCDCD); //开命令通道
GPIO_SetBits(LCDIO,LCDWR); //禁写
GPIO_ResetBits(LCDIO,LCDRD); //可读
lcd_state=D
//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()&0x)!=0x)&
/****************************************************
**函数名称:st02(void)&
**函数功能:t6963c数据自动读状态判断子程序
**输入参数:无
**输出参数:无
*****************************************************/
void st02(void)&
& while((readstate()&0x)!=0x)&
/****************************************************
**函数名称:st03(void)&
**函数功能:t6963c数据自动写状态判断子程序
**输入参数:无
**输出参数:无
*****************************************************/
void st03(void)&
while((readstate()&0x)!=0x)
/****************************************************
**函数名称:LCD_read_data(void)
**函数功能:t6963c读数据子程序
**输入参数:无
**输出参数:
*****************************************************/
void &LCD_read_data(void)
//对于显示,一般只写不读,故此函数暂时定为空函数
/****************************************************
**函数名称:LCD_Write_Command(uint8 dat)
**函数功能:t6963c写命令子程序
**输入参数:dat
**输出参数:无
*****************************************************/
void &LCD_Write_Command(u8 dat)
data=data&&16; //将8位数据转换为32位数据再传送
//判断是否空闲
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)|
& & //__nop();
//delay_ms(300);
& & GPIO_ResetBits(LCDIO,LCDWR);
/****************************************************
**函数名称:LCD_Write_Data(uint8 dat)
**函数功能:t6963c写数据子程序
**输入参数:dat
**输出参数:无
*****************************************************/
void &LCD_Write_Data(u8 dat)
data=data&&16; //将8位数据转换为32位数据再传送
//判断是否空闲
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)|
& & //__nop();
//delay_ms(300);
GPIO_SetBits(LCDIO,LCDWR);
/****************************************************
**函数名称:LCD_AutoWrite_Data(uint8 dat)
**函数功能:t6963c自动写数据子程序
**输入参数:dat
**输出参数:无
*****************************************************/
void &LCD_AutoWrite_Data(u8 dat)
data=data&&16; //将8位数据转换为32位数据再传送
//判断是否空闲
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)&
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)&
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)&
& address=y_asc*LCD_WID_LINE+x_ //上面已经设置一行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));
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)
& address=y_asc*LCD_WID_LINE+x_ //上面已经设置一行32个字符
& LCD_Write_Command2(LCD_ADR_POS,(u8)(address),(u8)(address&&8)); &//设置显示存储器地址&
& for(i=0;i&num_i++)
LCD_Write_Command1(LCD_INC_WR,code_asc); &//装入字符代码,写入数据,地址不变&
/****************************************************
**函数名称:LCD_cgram()
**函数功能:t6963c文本方式输入汉字时字库函数
**输入参数:无
**输出参数:无
*****************************************************/
void LCD_cgram()
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)&
& address=y_hz*LCD_WID_LINE+x_ //上面已经设置一行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_ //地址再往下移一行
& 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)
for(i=0;i&num_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)
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)
for(j=0;j&num_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)
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); //画点
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,
& & u32 xt,
& & u32 rs,row,
& & yt = Rx;
& & rr = (u32)Rx*Rx+5; // 补偿5,修正正方形
& & rs = (yt+(yt&&1))&&1; // (*0.75)分开1/8圆弧来画
& & for (xt=0;xt&=xt++)
& & & & xx = xt*
& & & & while ((yt*yt)&(rr-xx))
& & & & & & yt--;
& & & & row = Ox+ // 第一象限
& & & & col = Oy-
& & & & LCD_draw_dot(row,col,s);
& & & & row = Ox- // 第二象限
& & & & LCD_draw_dot(row,col,s);
& & & & col = Oy+ // 第三象限
& & & & LCD_draw_dot(row,col,s);
& & & & row = Ox+ // 第四象限
& & & & LCD_draw_dot(row,col,s);
& & & & /***************45度镜象画另一半***************/
& & & & row = Ox+ // 第一象限
& & & & col = Oy-
& & & & LCD_draw_dot(row,col,s);
& & & & row = Ox- // 第二象限
& & & & LCD_draw_dot(row,col,s);
& & & & col = Oy+ // 第三象限
& & & & LCD_draw_dot(row,col,s);
& & & & row = Ox+ // 第四象限
& & & & 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)&
& for(i=i&=i++) &//两水平线&
LCD_draw_dot(i,ystar,s);
LCD_draw_dot(i,yend,s);
& for(i=i&=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)
for(i=0;i&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&j++)
LCD_Write_Command1(LCD_INC_WR,*dat);
/****************************************************
**函数名称:main()
**函数功能:主函数
**输入参数:dly 延时参数,值越大,延时越久
**输出参数:无
*****************************************************/
int main (void)
{// add user source code&
& 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文本方式连续输入字符
主题帖子精华
在线时间13 小时
没用过帮顶
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
数据位为啥是输入啊&&是不是输入输出搞错了
Powered by

我要回帖

更多关于 云雀叫了一整天 pdf 的文章

 

随机推荐