弱弱问一下用DSP2808做LCD12864的问题!
用DSP2808做LCD12864,LCD的型号是QC12864!写了几次都不行,特来网上发帖!情况是这样子的,全速运行就不行,但是单步可以!在程序中延时很多都不行!有时行了,一延时就不行!
现在贴出程序:(程序中的延时是为了单步调试才删除的!)之所以所有IO都一个一个来操作是因为之前写过一起操作的,发现一起操作不行,会有些数据位呈现是脉冲的状况,我在另外一个帖子上已经有提问(http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4985163&bbs_page_no=1&bbs_id=1002)!
那位大侠有用过2808操作过LCD12864,给点意见!现在对2808的IO口操作很纠结!
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_670466R4SZ6U.png
电路原理图1 (原文件名:搜狗截图_2011-08-23_18-27-08.png)
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_670467GUE3QO.png
电路原理图2 (原文件名:搜狗截图_2011-08-23_18-27-22.png)
#include "DSP280x_Device.h"
#include "DSP280x_Examples.h"
// 宏定义
#define CODE 0
#define DATA 1
#define SetRS GpioDataRegs.GPBSET.bit.GPIO34=1
#define ClrRS GpioDataRegs.GPBCLEAR.bit.GPIO34=1
#define SetRW GpioDataRegs.GPASET.bit.GPIO17=1
#define ClrRW GpioDataRegs.GPACLEAR.bit.GPIO17=1
#define SetE GpioDataRegs.GPASET.bit.GPIO16=1
#define ClrE GpioDataRegs.GPACLEAR.bit.GPIO16=1
// 函数声明
void Delays(Uint16 number);// 延时子程序
void Init_LCD(void);// LCD初始化子程序
void Busy_mark(void);// 判忙子程序
void Write_LCD(unsigned int code_data,unsigned int content);// 写数据和指令函数
void Clear_LCD(void);// LCD清屏函数
void Display_x_y(unsigned int y, unsigned int x);//指定要显示字符的坐标
void Display_String(unsigned char *str);//显示字符串子程序
void Display_Chara(unsigned char Chara);//显示字子程序
/***********************************************************/
// 主函数
/***********************************************************/
void main(void)
{
/* 以下为系统初始化*********************************/
/* 第一步:初始化系统控制:**************************/
InitSysCtrl(); // 初始化系统时钟
/* 第二步: 初始化系统GPIO:*************************/
InitGpio(); // GPIO初始化
/* 第三: 清除所有的中断和初始化PIE矢量表:*********/
DINT; // 关中断
InitPieCtrl(); // 初始化PIE模块到一个已知状态
IER = 0x0000; // 禁止CPU中断
IFR = 0x0000; // 清除CPU中断标志
InitPieVectTable(); // 初始化PIE向量表
// 初始化系统用到的中断矢量表
EALLOW;
// 要用到的中断指向相应的中断处理函数
EDIS;
/* 第四步:初始化所有设备外设:**********************/
Init_LCD();
/* 第五步: 用户特定的代码,使能中断:*****************/
// 使能组1的中断(CPU中断控制器)
IER |= M_INT1;
// 开全局中断
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
Display_x_y(3,1);
Display_Chara('7');
for(;;)
{
}
}
/******************************************************/
// 延时子程序,延时时间为delayi*1US
/******************************************************/
void Delays(Uint16 number)
{
Uint16 delayi;
Uint16 delayj;
for(delayi=0;delayi<number;delayi++)
{
for(delayj=0;delayj<100;delayj++)
{
asm(" NOP");
}
}
}
/********************************************/
// LCD初始化子程序
/********************************************/
void Init_LCD(void)
{
EALLOW;
// 设置所有在LCD中用到的引脚作为通用IO使用
// 设置所有在LCD用到的引脚上拉电阻使能
GpioCtrlRegs.GPBPUD.bit.GPIO34 =0;
GpioCtrlRegs.GPAPUD.bit.GPIO6=0;
GpioCtrlRegs.GPAPUD.bit.GPIO7=0;
GpioCtrlRegs.GPAPUD.bit.GPIO8=0;
GpioCtrlRegs.GPAPUD.bit.GPIO9=0;
GpioCtrlRegs.GPAPUD.bit.GPIO10=0;
GpioCtrlRegs.GPAPUD.bit.GPIO11=0;
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;
GpioCtrlRegs.GPAPUD.bit.GPIO19=0;
GpioCtrlRegs.GPAPUD.bit.GPIO16=0;
GpioCtrlRegs.GPAPUD.bit.GPIO17=0;
GpioDataRegs.GPASET.bit.GPIO6 = 1;
GpioDataRegs.GPASET.bit.GPIO7 = 1;
GpioDataRegs.GPASET.bit.GPIO8 = 1;
GpioDataRegs.GPASET.bit.GPIO9 = 1;
GpioDataRegs.GPASET.bit.GPIO10 = 1;
GpioDataRegs.GPASET.bit.GPIO11 = 1;
GpioDataRegs.GPASET.bit.GPIO18 = 1;
GpioDataRegs.GPASET.bit.GPIO19 = 1;
GpioDataRegs.GPASET.bit.GPIO16 = 1;
GpioDataRegs.GPBSET.bit.GPIO34 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO17=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO6 =0;
GpioCtrlRegs.GPAMUX1.bit.GPIO7 =0;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 =0;
GpioCtrlRegs.GPAMUX1.bit.GPIO9 =0;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 =0;
GpioCtrlRegs.GPAMUX1.bit.GPIO11 =0;
GpioCtrlRegs.GPAMUX2.bit.GPIO16 =0; // E
GpioCtrlRegs.GPAMUX2.bit.GPIO17 =0; // RW
GpioCtrlRegs.GPAMUX2.bit.GPIO18 =0; //
GpioCtrlRegs.GPAMUX2.bit.GPIO19 =0; //
GpioCtrlRegs.GPBMUX1.bit.GPIO34 =0; // RS
// 设置所有在LCD中用到的引脚初始化为输出,故在读数据时需设置为输入
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
EDIS;
Write_LCD(CODE,0x30);
Write_LCD(CODE,0x01);
Write_LCD(CODE,0x06);
Write_LCD(CODE,0x0c);
}
//********************************
// 判忙子程序
//********************************
void Busy_mark(void)
{
Uint32 Temp = 0x80000;
// Uint16Busyi;
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO6 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO7 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO10 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO11 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO18 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 0;
EDIS;
asm(" NOP");
ClrRS;
asm(" NOP");
SetRW;
// for(Busyi=0;Busyi<5000;Busyi++)
// {
asm(" NOP");
// }
while(Temp)
{
SetE;
// for(Busyi=0;Busyi<5000;Busyi++)
// {
asm(" NOP");
// }
Temp =(GpioDataRegs.GPADAT.all)&0x80000;
// for(Busyi=0;Busyi<5000;Busyi++)
// {
asm(" NOP");
// }
ClrE;
// for(Busyi=0;Busyi<5000;Busyi++)
// {
asm(" NOP");
// }
}
}
//********************************
// 写数据和指令函数
// 根据dat_comm的值得判断是写的是指令还是数据,如果是指令(数据)就产生相应的时序,
//********************************
void Write_LCD(unsigned int code_data,unsigned int content)
{
// Uint16Write_LCDi;
content=content & 0x00FF;
Busy_mark();
asm(" NOP");
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
EDIS;
asm(" NOP");
if(code_data)
{
SetRS; //data
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
ClrRW; //write
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
}
else
{
ClrRS; //command
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
ClrRW; //write
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
}
GpioDataRegs.GPADAT.bit.GPIO6 = (content&0x01);
GpioDataRegs.GPADAT.bit.GPIO7 = ((content>>1)&0x01);
GpioDataRegs.GPADAT.bit.GPIO8 = ((content>>2)&0x01);
GpioDataRegs.GPADAT.bit.GPIO9 = ((content>>3)&0x01);
GpioDataRegs.GPADAT.bit.GPIO10 = ((content>>4)&0x01);
GpioDataRegs.GPADAT.bit.GPIO11 = ((content>>5)&0x01);
GpioDataRegs.GPADAT.bit.GPIO18 = ((content>>6)&0x01);
GpioDataRegs.GPADAT.bit.GPIO19 = ((content>>7)&0x01);
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
SetE;
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
ClrE;
// for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
// {
asm(" NOP");
// }
}
/*******************************************************/
// LCD清屏函数
/********************************************************/
void Clear_LCD(void)
{
Write_LCD(CODE,0x01);/*清屏,DDRAM地址指针指向00H*/
}
//********************************
//指定要显示字符的坐标
//********************************
void Display_x_y(unsigned int y, unsigned int x)
{
x--;
switch(y)
{
case 1:
Write_LCD(CODE,0x80|x);
break;
case 2:
Write_LCD(CODE,0x90|x);
break;
case 3:
Write_LCD(CODE,(0x80|x)+8);
break;
case 4:
Write_LCD(CODE,(0x90|x)+8);
break;
}
}
//**********************************
//显示字符串子程序
//**********************************
void Display_String(unsigned char *str)
{
while(*str!='\0')
{
Write_LCD(DATA,*str);
str++;
}
}
//**********************************
//显示字子程序
//**********************************
void Display_Chara(unsigned char Chara)
{
Write_LCD(DATA,Chara);
} 补充问一下,那些延时要怎么延时才是合理的啊! ./emotion/em103.gif 我对 12864操作的时候也有问题
EALLOW;
GpioCtrlRegs.GPAPUD.all &=~0xfc0;
// GpioCtrlRegs.GPAMUX1.all &=~0xfc0;
GpioCtrlRegs.GPADIR.all |=0xc0;
GpioCtrlRegs.GPAPUD.all &=~0xf0000;
// GpioCtrlRegs.GPAMUX1.all &=~0xf0000;
如果把这两句话保留,,就影响我 EPWM3B口的发波状态,,我只能把它删除以后EPWM3B发波很好,,也不知道原因,, 我不知道是不是因为IO的低16位和高16位操作之间的问题!是不是2808的IO口低16位和高16位操作之间存在区别或者问题呢! 如果把这两句话保留,,就影响我 EPWM3B口的发波状态,,我只能把它删除以后EPWM3B发波很好,,也不知道原因,,
就影响EPWM2B
EPWM1AEPWM1BEPWM2A这三个口的状态很正常 我做全桥移相的 ,,,4路 PWM发玻 ddddddddddddd 我对 12864操作的时候也有问题
EALLOW;
GpioCtrlRegs.GPAPUD.all &=~0xfc0;
// GpioCtrlRegs.GPAMUX1.all &=~0xfc0;
GpioCtrlRegs.GPADIR.all |=0xc0;
GpioCtrlRegs.GPAPUD.all &=~0xf0000;
// GpioCtrlRegs.GPAMUX1.all &=~0xf0000;
如果把这两句话保留,,就影响我 EPWM2B口的发波状态,,我只能把它删除以后EPWM2B发波很好,,也不知道原因,,
我做的是全桥移向,,, EPWM1AEPWM1BEPWM2A 发玻都正常 会不会是内部上拉的问题! 支持! 回复【楼主位】fpaisheng
-----------------------------------------------------------------------
#define SetRS GpioDataRegs.GPBSET.bit.GPIO34=1
#define ClrRS GpioDataRegs.GPBCLEAR.bit.GPIO34=1
#define SetRW GpioDataRegs.GPASET.bit.GPIO17=1
#define ClrRW GpioDataRegs.GPACLEAR.bit.GPIO17=1
#define SetE GpioDataRegs.GPASET.bit.GPIO16=1
#define ClrE GpioDataRegs.GPACLEAR.bit.GPIO16=1
这里宏定义写0写1不清楚
页:
[1]