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

📄 main__.c

📁 该设备是一款基于AVR mega16L单片机的电子书阅读器
💻 C
📖 第 1 页 / 共 3 页
字号:
{ 
   unsigned char i;
   unsigned char temp;
   while(start_flag)
    { 
      if(address_get)
    { 
      for (i=0;i<4;i++)
      {     
        if(Buffer[i]=='*')
        {
        temp=Buffer[i];
        i++;
         if(temp!=Buffer[i])
         {
           switch(Buffer[i])
           {
            case 'A': 
            currentMemoryPage=0x0002;            
            break;
            case 'B': 
            currentMemoryPage=0x0041;
            break;
            case 'C': 
            currentMemoryPage=0x0081;
            break;
            case 'D': 
            currentMemoryPage=0x00C1;
            break;
            case 'E': 
            currentMemoryPage=0x00FF;
            break;
            case 'F': 
            currentMemoryPage=0x013E;
            break;
            case 'G': 
            currentMemoryPage=0x017D;
            break;
            case 'H': 
            currentMemoryPage=0x01BC;
            break;
            case 'I': 
            currentMemoryPage=0x01FB;
            break;
            case 'J': 
            currentMemoryPage=0x023A;
            break;
            case 'K': 
            currentMemoryPage=0x0279;
            break;
            case 'L': 
            currentMemoryPage=0x02B8;
            break;
            case 'M': 
            currentMemoryPage=0x02F7;
            break;
            case 'N': 
            currentMemoryPage=0x0336;
            break;
            case 'O': 
            currentMemoryPage=0x0375;
            break;
            case 'P': 
            currentMemoryPage=0x03B4;
            break;
            default:
            start_flag=0;
            break;
            }          
           }           
          }
         }
         if(start_flag)
           {
           address_get=0;
            for(i=0;i<buffersize;i++)
            Buffer[i]=' ';
            lcd_clear();
            lcd_set_xy(0,1);
            lcd_write_stringf("文档下载中.....");      
           USART_Transmit('#');
           USART_Transmit('#');
           }
         }                
          if(buffer_overflow)
         { 
          //关USART中断
          UCSRB=0x00;
          //判断BUFFER内容***号吗,若是就停止接受。         
            if (Buffer[2]=='*') //一个奇怪的符号  
            {
             lcd_clear(); 
             lcd_set_xy(0,1);
             lcd_write_stringf("文档下载完毕!"); 
             for(i=0;i<buffersize;i++)
             Buffer[i]=' ';                    
             delay_ms(1000);
             delay_ms(1000);
             start_flag=0; 
             address_get=1;  //此标志位很重要 确定下载地址
             ShowMenu();
             UCSRB=0x98;            
             }
         if( start_flag)
          {                    
         WriteBufferToMemory( Buffer, BUFFER_SIZE,currentMemoryPage); 
         buffer_overflow=0;
         currentMemoryPage++;
         for(i=0;i<buffersize;i++)
          Buffer[i]=' '; 
          UCSRB=0x98;
          delay_us(10);                                 
          USART_Transmit('#');
         USART_Transmit('#'); 
           } 
         }                 
    } 
    start_flag=0; 
}
/******************************************************************************
 * Initialize()
 *
 * Initializes the AVR microcontroller by setting up port I/O, etc.
******************************************************************************/

void Initialize( void )
{
   unsigned char	i	= 0;
   menuX=7;
   menuY=0;
   textY=3;
   textX=7;   
    PORTD = 0x03;       // TXD(PD1)输出
    DDRD = 0x02;        // RXD(PD0)输入,上拉有效  
    /* InitializeButtons */   
    DDRB&=0xF0;
    PORTB=(0xF0&PINB);     
    UCSRA = 0x00;       // USART初始化       
    UCSRB = 0x98; // 允许RXC中断,接收允许,发送允许
    UCSRC = 0x86; // 8 Data, 1 Stop, No Parity
    UBRRH = BAUD_H;     // 设置波特率
    UBRRL = BAUD_L;
    lcd_init();
    InitializeKeyboard();    
    Initi_Flash(); 
    lcd_clear(); 
	mode = MENU;
	endOfmenuBuffer=15;
	currentMemoryPage = 0;
        endOfBuffer = 63;
	userchoose=0;
	displaypoint=0;
	displaystart=0;
	for( i = 0; i < BUFFER_SIZE; i++ )
	{
	Buffer[i] = ' ';
	}
     lcd_clear(); 
    #asm("sei")         // 开中断   
    menuBufferTOBuffer(); 
    WriteBufferToMemory( Buffer, BUFFER_SIZE,0 ); 
   ReadMemoryToBuffer( Buffer, BUFFER_SIZE,0 );
   BufferTOmenuBuffer();  
    ShowMenu(); 
	return;
}

/******************************************************************************
 * interrupt [EXT_INT0] void ext_into_isr (void)
 * Interrupt subroutine triggered by INT0, which is an external interrupt.
 * The keyboard clock pin is attached to INT0, so whenever the keyboard has
 * data to send this interrupt is triggered.
******************************************************************************/
void check_key(void)
{  
  if(EDIT==1)
   {     
   if( key != 0 )    
   {        
      // A valid scancode was found 
      //lcd_set_xy(0,0);
     // lcd_write_data( key );
      if( key == 8 )
      {
         // backspace 
         if (mode==MENU)
       {
         endOfmenuBuffer--;
         if( endOfmenuBuffer <=2 )
         {
            endOfmenuBuffer = 2;
         }
         menuBuffer[userchoose][endOfmenuBuffer] = ' ';
          if (++negative_counter>1)
             { negative_counter=0;
             menuX--;}             
         if( menuX <= 2 )
         {
            menuX = 2;
         }
        }
        else {//mode=TEXT
           endOfBuffer--;
         if( endOfBuffer < 0 )
         {
            endOfBuffer = 0;
         }
         *(screenBuffer+endOfBuffer) = ' ';
          if (++negative_counter>1)
             { negative_counter=0 ;
             textX--;
             }             
         if( textX < 0 )
         {
            textX = 7;
            textY--;            
            if(textY<0)
            {
              textX = 0;
              textY=0; 
             }           
         }
         SetLCDCursor(textX,textY);
       }
      }
      else
      {     
            if (mode==MENU)
            {
            menuBuffer[userchoose][endOfmenuBuffer]=key;
            endOfmenuBuffer++;
            if( endOfmenuBuffer >=13)
              {
               endOfmenuBuffer = 13;
              }
              if (negative_counter++>1)
              { negative_counter=0;
                menuX++;
               }             
              if( menuX >7 )
                {
                 menuX = 7;
                
                }  
            }
            else// mode == TEXT )
            { 
             *(screenBuffer+endOfBuffer) = key;              
            endOfBuffer++;
            if( endOfBuffer >= 63 )
              {
               endOfBuffer = 63;
              }
                if (++negative_counter>1)
                  { negative_counter=0 ;
                    textX++;
                  }             
                if( textX >7 )
                   {
                    textX = 0;
                    textY++;            
                     if(textY>3)
                        {
                         textX = 7;
                         textY=3; 
                        }           
                    }             
            }            
      } 
       if (mode==TEXT)
     {
     lcd_write_full( screenBuffer );     
    SetLCDCursor( textX, textY );
     }
     else 
     {
     ShowMenu();     
     SetLCDCursor( menuX, menuY );
     }          
   }    
}
key=0; 
}
#include <mega16.h>
#include <delay.h> 
#include <12864.h> 
#define RS PORTA.0
#define RW PORTA.1
#define E PORTA.2
/*1--GND
  2--VCC
  3--V0--kong
  4--RS--PA0
  5--RW--PA1
  6--E---PA2
  7---14   PC0---PC7
  15--PSB---VCC选并口
*/

void lcd_init(void)               //初始化
{      
        DDRC=0xff;
        PORTC=0x00;
        DDRA=0xff;
        PORTA=0x00;
        delay_ms(50);
        lcd_write_command(0x30);          // //选择基本指令集
        delay_ms(1);
        lcd_write_command(0x0c);           //开显示(无游标、不反白)
        delay_ms(1);
        lcd_write_command(0x01);           //清除显示,并且设定地址指针为00H
        delay_ms(1);
        lcd_write_command(0x06);        //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
        delay_ms(1);
        lcd_write_command(0x80);        //
}   

void lcd_write_command(unsigned char cmdcode)     //写指令RS=0,RW=0,下降沿打入。
{
        chek_busy ();       
        RS = 0;
        RW = 0;
        E = 1;
         #asm("nop");
        PORTC = cmdcode;
         #asm("nop");                      
        E = 0;      
}      

void chek_busy(void)                    //判忙, RS=0,RW=1,E=1,读指令。
{      
        DDRC &= 0x7f;
        RS = 0;
        RW = 1;        
        E = 1;
         #asm("nop");
        while(PINC&0x80);       
         #asm("nop");
        E = 0;
        DDRC |= 0x80;                
}       

void lcd_write_data(unsigned char disdata)        //写数据,RS=1,RW=0,下降沿打入。
{
        chek_busy ();
        RS = 1;
        RW = 0;
        E = 1;
        #asm("nop");
        PORTC = disdata;
         #asm("nop");         
        E = 0;
        #asm("nop");
}     
void lcd_set_xy( unsigned char x, unsigned char y )     //写地址函数 
{ 
       unsigned char address; //x范围是0~7  y范围0~3
       switch ( y )
        {
          case 0 : address=0x80+x;
          break;
          case 1 : address=0x90+x;
          break;
          case 2 : address=0x88+x;
          break;
          case 3 : address=0x98+x;
          break;
          default: break;
        }        
      lcd_write_command(address);  
} 

void SetLCDCursor( unsigned char x,unsigned char y )
{
   lcd_cursor_flash(1);
   lcd_set_xy(x,y);
}
void lcd_write_stringf(unsigned char flash *s)
{   
  while(*s>0)
   {  

⌨️ 快捷键说明

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