⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 在ucos-ii下用LPC2290的spi端口驱动M65的液晶屏
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:          main.c
** Last modified Date: 2006-09-22
** Last Version:       v1.0
** Descriptions:      
**
********************************************************************************************************/
#include "config.h"
#include "disp.h"
#define TASK0_ID            16      // 任务的ID
#define TASK0_PRIO          16      // 任务的优先级
#define TASK0_STACK_SIZE    512     // 定义用户堆栈长度   

#define TASK1_ID            17      // 任务的ID
#define TASK1_PRIO          17      // 任务的优先级
#define TASK1_STACK_SIZE    512     // 定义用户堆栈长度
   
#define TASK2_ID            18      // 任务的ID
#define TASK2_PRIO          18      // 任务的优先级
#define TASK2_STACK_SIZE    512     // 定义用户堆栈长度

#define TASK3_ID            19      // 任务的ID
#define TASK3_PRIO          19      // 任务的优先级
#define TASK3_STACK_SIZE    512     // 定义用户堆栈长度

#define TASK4_ID            20      // 任务的ID
#define TASK4_PRIO          20      // 任务的优先级
#define TASK4_STACK_SIZE    512     // 定义用户堆栈长度

#define TASK5_ID            21      // 任务的ID
#define TASK5_PRIO          21      // 任务的优先级
#define TASK5_STACK_SIZE    512     // 定义用户堆栈长度

#define TASK6_ID            22      // 任务的ID
#define TASK6_PRIO          22      // 任务的优先级
#define TASK6_STACK_SIZE    512     // 定义用户堆栈长度

#define TASK7_ID            23      // 任务的ID
#define TASK7_PRIO          23      // 任务的优先级
#define TASK7_STACK_SIZE    512     // 定义用户堆栈长度


OS_STK  TASK0_STACK[TASK0_STACK_SIZE];
OS_STK  TASK1_STACK[TASK1_STACK_SIZE];
OS_STK  TASK2_STACK[TASK2_STACK_SIZE];
OS_STK  TASK3_STACK[TASK3_STACK_SIZE];
OS_STK  TASK4_STACK[TASK4_STACK_SIZE];
OS_STK  TASK5_STACK[TASK5_STACK_SIZE];
OS_STK  TASK6_STACK[TASK6_STACK_SIZE];
OS_STK  TASK7_STACK[TASK7_STACK_SIZE];

void TASK0(void *pdata);
void TASK1(void *pdata);
void TASK2(void *pdata);
void TASK3(void *pdata);
void TASK4(void *pdata);
void TASK5(void *pdata);
void TASK6(void *pdata);
void TASK7(void *pdata);


extern uint16  textcolor;    // color of text
extern uint16  backcolor;    // color of background

const uint16 pot10[4] ={10,100,1000,10000};

void ubi2dec( uint16 val,  uint8 *strg, uint8 nzero);
void ubi2dec( uint16 val,  uint8 *strg, uint8 nzero)
/*
  convert unsigned int16 value to a character string
  stringlength has to be 6 character 65536 + the final 0
  将val转换成十进制六个字符,五位数字+最后一个0
  if nzero==0, no leading zeros
  if nzero==1, with leading zeros  
*/
{
  INT8U dec,idx=4,odx=0;
  
  do
  {
    idx--;
    for (dec=0; val>=pot10[idx]; val-=pot10[idx])
    {
      dec++;
    }
    nzero+=dec;
    if (nzero) strg[odx++]='0'+dec;
  } while(idx);
  strg[odx++]='0'+val;
  strg[odx]=0;
}

void lcd_write(uint8 data);
void lcd_write(uint8 data)
{
  S0PDR = data;
  while(0==(S0PSR&0x80));
  //OSTimeDly(OS_TICKS_PER_SEC/3000);
  
   // 等待SPIF置位,即等待数据发送完毕
  
  //SPDR= dat;
  //while (!(SPSR & _BV(SPIF)));
}




void lcd_cmd (INT8U dat);
void lcd_cmd (INT8U dat)
{  
  LCD_RS_Clr();
  //PORTB &= ~_BV(LCD_RS);

  lcd_write(dat);
  lcd_write(0x00);

  LCD_RS_Set();
  //PORTB |= _BV(LCD_RS);
}

void lcd_dat0(uint8 dat);
void lcd_dat0(uint8 dat)
{
  lcd_write(dat);
  lcd_write(0x00);  
}

void lcd_dat16(uint16 dat);
void lcd_dat16(uint16 dat)
{
  lcd_write(dat>>8);
  lcd_write(dat);
}

void fill_screen(uint16 color);
void fill_screen(uint16 color)
{
  uint16 i;
  LCD_CS_Clr();  
  //PORTB &= ~_BV(LCD_CS);  // select display
  
  lcd_cmd(SD_CSET);
  lcd_dat0(0x08);  // start is 8, not 0
  lcd_dat0(0x01);
  lcd_dat0(0x8B);  // is 00x8B = 0x83+8
  lcd_dat0(0x01);

  lcd_cmd(SD_PSET);
  lcd_dat0(0x00);
  lcd_dat0(0xAF);
  
  lcd_cmd(RAMWR);

  // start data transmission  
  for (i=0; i<DISP_W*DISP_H; i++)
    lcd_dat16(color);
  
  LCD_CS_Set();    
  //PORTB |= _BV(LCD_CS);  // deselect display    
}




void put_char(uint8 x, uint8 y, uint8 c);
void put_char(uint8 x, uint8 y, uint8 c)
{
  uint8 h,ch,p,mask,he;
  
  LCD_CS_Clr();
  //PORTB &= ~_BV(LCD_CS);  // select display
  
  lcd_cmd(SD_CSET);
  lcd_dat0(0x08+x);  // start is 8, not 0
  lcd_dat0(0x01);
  lcd_dat0(0x08+x+CHAR_W-1);  // end is 00x8B = 0x83+8
  lcd_dat0(0x01);
  
  lcd_cmd(SD_PSET);
  lcd_dat0(y);
  if (y < DISP_H-CHAR_H)
  {
    he=CHAR_H;
    lcd_dat0(y+CHAR_H-1);
  }
  else
  {
    he=DISP_H-y;
    lcd_dat0(DISP_H-1);
  }

  lcd_cmd(RAMWR);
  
  for (h=0; h<he; h++) // every column of the character
  {        
        ch=ascii_tab[c-32][h];

        mask=0x80;
        for (p=0; p<CHAR_W; p++)  // write the pixels
        {
          if (ch&mask)
          {
            lcd_dat16(textcolor);                
          }
          else
          {
            lcd_dat16(backcolor);
          }
          mask=mask/2;
        }  // for p
  }

  LCD_CS_Set(); 
  //PORTB |= _BV(LCD_CS);  // deselect display    

}

void lcd_cspulse(void);
void lcd_cspulse(void)
{
  LCD_CS_Set();
  //PORTB |= _BV(LCD_CS);

  LCD_CS_Set();
  
 // __asm{ NOP;  };

  LCD_CS_Clr();
  //PORTB &= ~_BV(LCD_CS);
}



void print_str(uint8 x, uint8 y, uint8 *txt);
void print_str(uint8 x, uint8 y, uint8 *txt)
{
  uint8 i=0;
  while (txt[i]!=0)
  {
    put_char(x+i*CHAR_W,y,txt[i]);
    i++;
  }

}


void lcd_init_c(void)
/*
  Init the Siemens S65 Display with EPSON controller

  (c) Christian Kranz, 10/2005
*/
{
  uint8 i;
  static const uint8 disctl[9]={0x4C, 0x01, 0x53, 0x00, 0x02, 0xB4, 0xB0, 0x02, 0x00};
  static const uint8 gcp64_0[29]={0x11,0x27,0x3C,0x4C,0x5D,0x6C,0x78,0x84,0x90,0x99,0xA2,0xAA,0xB2,0xBA,
                       0xC0,0xC7,0xCC,0xD2,0xD7,0xDC,0xE0,0xE4,0xE8,0xED,0xF0,0xF4,0xF7,0xFB,
                       0xFE};
  static const uint8 gcp64_1[34]={0x01,0x03,0x06,0x09,0x0B,0x0E,0x10,0x13,0x15,0x17,0x19,0x1C,0x1E,0x20,
                      0x22,0x24,0x26,0x28,0x2A,0x2C,0x2D,0x2F,0x31,0x33,0x35,0x37,0x39,0x3B,
                      0x3D,0x3F,0x42,0x44,0x47,0x5E};
  static const uint8 gcp16[15]={0x13,0x23,0x2D,0x33,0x38,0x3C,0x40,0x43,0x46,0x48,0x4A,0x4C,0x4E,0x50,0x64};

  // generate clean display reset


  LCD_RESET_Clr();
  LCD_CS_Set();
  LCD_RS_Set();
  //PORTB &= ~_BV(LCD_RESET); // reset display
  //PORTB |= _BV(LCD_CS);  // CS is high during reset release
  //PORTB |= _BV(LCD_RS);  // RS is set to high
  


  OSTimeDly(OS_TICKS_PER_SEC/100);
  //_delay_ms(10);
  
  LCD_RESET_Set();
  //PORTB |= _BV(LCD_RESET);  // release reset
  
  OSTimeDly(OS_TICKS_PER_SEC/28);
  //_delay_ms(35);

  LCD_CS_Clr();
  //PORTB &= ~_BV(LCD_CS);  // select display

  lcd_cmd(DATCTL);
  lcd_dat0(0x2A);          // 0x2A=565 mode, 0x0A=666mode, 0x3A=444mode

  lcd_cspulse();
  
  lcd_cmd(DISCTL);
  for (i=0; i<9; i++)
  {
    lcd_dat0(disctl[i]);
  }
  
  lcd_cmd(GCP64);
  for (i=0; i<29; i++)
  {
    lcd_dat0(gcp64_0[i]);
    lcd_dat0(0x00);
  }
  for (i=0; i<34; i++)
  {
    lcd_dat0(gcp64_1[i]);
    lcd_dat0(0x01);
  }

  lcd_cmd(GCP16);
  for (i=0; i<15; i++)
  {
    lcd_dat0(gcp16[i]);
  }

  lcd_cmd(GSSET);
  lcd_dat0(0x00);

  lcd_cmd(OSSEL);
  lcd_dat0(0x00);

  lcd_cmd(SLPOUT);
  
  
   OSTimeDly(OS_TICKS_PER_SEC/100);
//  _delay_ms(7);

  lcd_cmd(SD_CSET);
  lcd_dat0(0x08);
  lcd_dat0(0x01);
  lcd_dat0(0x8B);
  lcd_dat0(0x01);

  lcd_cmd(SD_PSET);
  lcd_dat0(0x00);
  lcd_dat0(0x8F);


  lcd_cmd(ASCSET);
  lcd_dat0(0x00);
  lcd_dat0(0xAF);
  lcd_dat0(0xAF);
  lcd_dat0(0x03);
  
  lcd_cmd(SCSTART);
  lcd_dat0(0x00);

  LCD_RS_Clr();  
  //PORTB &= ~_BV(LCD_RS);
  lcd_dat0(DISON);
  
  LCD_CS_Set(); 
  //PORTB |= _BV(LCD_CS);  // deselect display 
}  



void Disp_pic(uint8 x, uint8 y, uint8 w, uint8 h,unsigned char *pic);
void Disp_pic(uint8 x, uint8 y, uint8 w, uint8 h,unsigned char *pic)
{
  uint8 i,j,ch,mask;
  
  LCD_CS_Clr();
  //PORTB &= ~_BV(LCD_CS);  // select display
  
  lcd_cmd(SD_CSET);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -