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

📄 main.c

📁 320x240 inicialization code for display
💻 C
字号:
/***********************************************************************
 *                                                                     *
 *      Project Name:   Demo board for graphic LCD PG320240            *
 *      Description:    Driving of the LCD PG320240 with SED1335 driver*
 *                                                                     *
 *      Processor:      uPD78F9177                                     *
 *      Revision:       1.0                                            *
 *      Date:           24.11.2004                                     *
 *      Compiler:       C crosscompiler IAR 2.22                       *
 *      Author:         Lukas Bier                                     *
 *      Company:                                                       *
 *      Email:          Bier@elatec.cz                                 *
 *                                                                     *
 ***********************************************************************/

#include <in78000.h>
#include "Df9177ay.H"
#include "defines.h"
#include "LCD_pg320240.h"
unsigned char Picture = 0;
unsigned char Second;
unsigned char Minutes;
unsigned char Interval = 0;
bit bEven;
bit bButton1;
bit bButton2;
bit bButton3;
bit bButton4;
bit bPicture;
bit bPicture_old;

unsigned int osaX_empty, osaY_empty;
unsigned int osax, osay;
void hodiny(void);
void scan_touch(void);
void showx(void);
unsigned int scan_x(void);
unsigned int scan_y(void);

// interrupt from watch timer
interrupt [INTWT_vect] void vWatchTimer(void)
{
   bEven = ~bEven;
   showx();
   if (bEven)
   { 
      if (Second < 60) Second++;
        else {Second = 0;Minutes++;}
      if (Minutes == 60) Minutes = 0;
      //if (!Picture) hodiny();
      if((osax < 100) && (!bPicture_old)) { bPicture = 1; bPicture_old = 1;}
      else bPicture_old = 0;
      showx(); 
   }   
}
 
interrupt [INTWTI_vect] void vWatchTimerI(void)
{
  Interval++;
  if (Interval >10)
  {
    Interval = 0;
    osax = scan_x();
    osay = scan_y();
   }
}
  
interrupt [INTTM80_vect] void vTimer80(void)
{
}
interrupt [INTP0_vect] void vINTP0(void)
{
  if (!Button1) bButton1 = TRUE;
 }   
interrupt [INTP1_vect] void vINTP1(void)
{
  if (!Button2) bButton2 = TRUE;
 }
interrupt [INTP2_vect] void vINTP2(void)
{
  if (!Button3) bButton3 = TRUE;
 } 
 
interrupt [INTP3_vect] void vINTP3(void)
{
  if (!Button4) bButton4 = TRUE;
 }

unsigned int getAD(unsigned char ucChannel)
{
    ADS0     = ucChannel;              // Set selected A/D channel
    ADCS0    = TRUE;                   // Start AD-Conversion 
    ADIF0    = 0;
    ADCS0    = TRUE;                   // Start AD-Conversion 
    while(!ADIF0){_NOP();}
    ADIF0 = 0;
    while(!ADIF0){_NOP();} 
    ADCS0    = FALSE;                  // Stop A/D conversion
    return (ADCR0 >> 6);               // Return A/D conversion result
}
 
void init_app(void)
{
  unsigned int i;
  // clock generator setting
    PCC  = 0x00;                       // Use high speed mode
  // port setting
  PM5 = 0xF0;                          // Port DataH to output
  DataH = 0x00;                        // DataH to low
  P2 = 0xFF;                         
  PM2 = 0x80;                           // Port to output 
  P1 = 0xFF;                       
  PM1 = 0xFC;
  P3  = 0xFF;
  PM3 = 0xFF;                            // Port to input
  PUB3 = 0xFF;                            // pullup resistors ON
  PM0  = 0xC0;                            // Port to output
  PWM = 0;
  RESET = 0;                            // Reset of LCD

  // Watch Timer
  WTM = 0x53;                         // set watch timer from mainclock
  WTMK = 0;
  WTIMK = 0;
  WTIF = 0;
  
  
  // ******* Obsluha vnejsich preruseni ****************
  INTM0 = 0x00;
  PIF0 = FALSE;
  PMK0 = FALSE;
  //  INTM0 |= 0x04;  // nabezna hrana preruseni vyvola interrupt
  PIF1 = FALSE;
  PMK1 = FALSE;
  // INTM0 |= 0x10;  // nabezna hrana preruseni vyvola interrupt
  PIF2 = FALSE;
  PMK2 = FALSE;
  PIF3 = FALSE;
  PMK3 = FALSE;
  
  
  // 8 Bit PWM on TM80
    P2.6 = 0;
    PM2.6 = 0;
    TMC80   = 0x81;               // Timer 80 - 19,5 kHz
    TCE80 = 1;                    // Operation enable
    PWME80 = 1;                   // PWM output enable
    TOE80 = 1;                    // output enable
    CR80    = 128;                // 
    TMIF80  = FALSE;              // Clear interrupt
    TMMK80  = FALSE;              // Enable Timer80 Interrupt
  
  Second = 0;
  Minutes = 0;
  bButton1 = 0;
  bButton2 = 0;
  bButton3 = 0;
  bButton4 = 0;
  // Analog Converter setting
                                       // Stop AD-Converter, start conversion by SW
  ADM0   = 0x00;                     // conversion time 144/fx (-> 17.1祍) 
  ADS0   = 0x00;                     // Default selection: channel 0
  ADIF0  = FALSE;                    // Clear Interrupt request bit ADC
  for (i=1; i<1024; i++) _NOP();
  RESET = 1;
        
}
void set_pwm(unsigned char PWM_CR)
{
 TCE80 = 0;
 CR80 = PWM_CR;
 TCE80 = 1;
}
void hodiny(void)
{
  lcdwrite_command(0x46);
  lcdwrite_data(0x9c);
  lcdwrite_data(0x02);        // Set cursor address
  lcdwrite_command(0x42);
  lcdwrite_data(Minutes / 10 + 0x30);
  lcdwrite_data(Minutes % 10 + 0x30);
  lcdwrite_data(':');
  lcdwrite_data(Second / 10 + 0x30);
  lcdwrite_data(Second % 10 + 0x30); 
}

void showx(void)
{
  lcdwrite_command(0x46);
  lcdwrite_data(0x9f);
  lcdwrite_data(0x04);        // Set cursor address
  lcdwrite_command(0x42);
  lcdwrite_data(osax / 1000 + 0x30);
  lcdwrite_data((osax % 1000)/100 + 0x30);
  lcdwrite_data(((osax % 1000)%100)/10 + 0x30);
  lcdwrite_data(((osax % 1000)%100)%10 + 0x30);
  lcdwrite_data(' ');lcdwrite_data('-');
  lcdwrite_data(osay / 1000 + 0x30);
  lcdwrite_data((osay % 1000)/100 + 0x30);
  lcdwrite_data(((osay % 1000)%100)/10 + 0x30);
  lcdwrite_data(((osay % 1000)%100)%10 + 0x30);
   
}

void show_pwm(unsigned char PWM_CR)
{
  lcdwrite_command(0x46);
  lcdwrite_data(0x95);
  lcdwrite_data(0x04);        // Set cursor address
  lcdwrite_command(0x42);
  lcdwrite_data(PWM_CR / 100 + 0x30);
  PWM_CR = PWM_CR % 100;
  lcdwrite_data(PWM_CR / 10 + 0x30);  
  lcdwrite_data(PWM_CR % 10 + 0x30); 
}

void show_picture(unsigned char Number)
{
    unsigned char *ptrPicture;
    unsigned int i;
    
    switch (Number)
    {
      case 0: ptrPicture = (unsigned char *)0x1000;break;
      case 1: ptrPicture = (unsigned char *)0x3580;break;
    }
    _DI();
    lcdwrite_command(0x46);
    lcdwrite_data(0xB0);
    lcdwrite_data(0x04);                       // Set cursor
    lcdwrite_command(0x42);                    // write
    for (i=0;i < 9600;i++) 
      {
          lcdwrite_data(*ptrPicture);
          ptrPicture++;
      }
    _EI();  
}

unsigned int scan_x(void)
{ 
  P2.2 = 0;                             // Set to low output
  PM2.2 = 1;                            // Set to input
  PM2.0 = 0;                            // Set to output
  P2.0 = 0;
  P1.0 = 1;                             // disconnect transistor
  P1.1 = 0;                             // connect transistor
  return (getAD(AN1));
}
  
unsigned int scan_y(void)  
{
  P1.1 = 1;                             // disconnect transistor
  PM2.0 = 1;                            // Set to input
  P2.2 = 0;                             // Set to low output
  PM2.2 = 0;                            // Set to output
  P2.0 = 0;
  P1.0 = 0;                             // disconnect transistor
  return(getAD(AN0)); 
}


void main(void)
{
  unsigned char PWM_Reg = 0x7F;

  _DI();                             // Disable all interrupts
  init_app();                        // Peripheral settings
  _EI();                             // Enable all interrupts                   
  bPicture = bPicture_old = 0;
  init_lcd();
 // hodiny();
  show_picture(0);
  show_pwm(PWM_Reg);
  osaX_empty = scan_x();
  osaY_empty = scan_y();
  while (1)
  {
   if (bPicture)
   {
      Picture = (Picture + 1) % 2;
      show_picture(Picture);
      bPicture = FALSE;
    }
    
   if(bButton3)
      {
        bButton3 = FALSE;
        if (PWM_Reg < 0xF6) PWM_Reg = PWM_Reg + 10;
        set_pwm(PWM_Reg);
        show_pwm(PWM_Reg); 
       }
    if(bButton4)
      {
        bButton4 = FALSE;
        if (PWM_Reg > 11) PWM_Reg = PWM_Reg - 10;
        set_pwm(PWM_Reg);
        show_pwm(PWM_Reg);  
       }  
    if(bButton1)
      {
        bButton1 = FALSE;
        bPicture = FALSE;
        Picture = 0;
        show_picture(Picture);  
       }
    if(bButton2)
      {
        bButton2 = FALSE;
        bPicture = FALSE;
        Picture = 1;
        show_picture(Picture);  
       }       
  }

}

⌨️ 快捷键说明

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