本帖最后由 honeyfw 于 2010-5-20 10:35 编辑
我用的是LPC2214,程序是UCOS在ARM移植下的使用LCD程序,
情况如下:
我在ADS里面有两个工程,分别是不带UCOS的LCD程序和带UCOS的LCD程序(带UCOS的是直接移植后的程序),在板子上编译完全正常,下到FLASH后,裸奔的程序可以正常运行,LCD画面正常,带UCOS的程序中的LED正常,LCD画面正常,
但是,如果直接运行带UCOS的程序或者复位后直接运行,LCD画面就没有,LED正常亮,郁闷,
反正就是必须裸奔的程序先运行一遍,不复位,不断电,则带UCOS的程序可以正常运行效果,否则不正常,
求助大虾!!!!为什么啊???郁闷....已经纠结三天了.....工程如下:
#include "config.h"
#define BEEP (1<<7) /* P0.7为蜂鸣器控制 */
#define TaskStkLength 64
#define LED2 (1<<29)
#define LED1 (1<<28)
OS_STK TaskLCDStk[TaskStkLength];
// 声明外部函数
extern void HzDisp(void);
// LED1--LED4控制宏定义
#define LED_ADJ 28
#define LED_IOCON (0xFF<<LED_ADJ)
#define LED_OFF() IO2SET=LED_IOCON
#define LED_DISP(dat) LED_OFF(); IO2CLR=((dat)<<LED_ADJ)
// 定义LED显示数据
uint8 const LED_DISP_TAB[42] =
{ 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, // 全闪
0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00,
0x00, 0x01, 0x03, 0x07, 0x0F, 0x07, // 向右增加
0x03, 0x01, 0x00,
0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A, // 向左移动
0x05, 0x0A, 0x05, 0x0A, 0x05, 0x0A,
0x00, 0x08, 0x0C, 0x0E, 0x0F, 0x0E, // 向右增加
0x0C, 0x08, 0x00
};
static uint8 led_no = 0; // LED显示数据计数器(LED_DISP_TAB[led_no])
void TaskLCD(void *pdata);
/****************************************************************************
* 名称:Time0Init()
* 功能:初始化定时器0,定时时间为0.3S,并打开中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Timer0Init(void)
{
T0IR = 0xffffffff;
T0TC = 0;
T0TCR = 0x01;
T0MCR = 0x03;
T0MR0 = (Fpclk / OS_TICKS_PER_SEC);
}
int main (void)
{
OSInit();
OSTaskCreate(TaskLCD,(void*)0,&TaskLCDStk[TaskStkLength-1],2);
OSStart();
return 0;
}
//主程序。控制LCD显示图片、汉字,控制LED显示流水灯。
void TaskLCD(void *pdata)
{
pdata=pdata;
TargetInit();
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000000;
Timer0Init();
VICInit();
IO0SET |= BEEP;
GUI_Initialize();
while(1)
{
// 显示" 广州周立功
// 单片机
// 发展有限公司 "
HzDisp();
//DelayNS(10000000); // 延时
OSTimeDly(10);
GUI_ClearSCR();
}
//return(0);
}
void Timer0_Exception(void)
{
OS_ENTER_CRITICAL();
IO0DIR |= BEEP;
IO0CLR |= BEEP;
OSTimeDly(30);
IO0SET |= BEEP;
T0IR = 0x01;
VICVectAddr0 = 0; //interrupt close 通知中断控制器中断结束
OSTimeTick();
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
void GUI_Initialize(void)
{
TftInit();
TFT_FillSCR(BLACK);
}
void TftInit(void)
{
int i;
STCOM_INI init_dat;
TftReset();
for(i = 0; i < 100; i++) { // 设定最多100条初始化命令
init_dat = TFT208E_INI;
if(init_dat.com == DATA_END) break;
TftSendCom(init_dat.com);
TftSendDat(init_dat.dat);
DelaymS(init_dat.dly);
}
TftSendCom(WR_RD_DATA); //WRITE DATA TO GRAM
}
void TFT_FillSCR(uint16 dat)
{
uint16 i, j;
TftSetWrite(0,0);
for(i = 0; i < GUI_LCM_YMAX; i++) { // 历遍所有行
for(j = 0; j < GUI_LCM_XMAX; j++) { // 历遍所有行
TftSendDat(dat); // 填充数据
}
}
} |