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

📄 main.c

📁 该设备是一款基于AVR mega16L单片机的电子书阅读器
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 *电子书设计程序
 * File:   'e_record.c'
******************************************************************************/
#include <mega16.h>
#include <delay.h>
#include <flashic.h> 
#include <key.h>
#include <12864.h> 
#define MENU 0
#define TEXT 1
#define ShowCount 3
#define BUFFER_SIZE 255 //336 /* LINE_LENGTH * NUM_ROWS */
#define BAUD    9600            //波特率采用9600bps
#define CRYSTAL 4000000			//系统时钟4MHz
#define DATA_REGISTER_EMPTY (1<<5)
//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define buffersize  255  
unsigned char negative_counter=0;  
unsigned char command=' ';
bit   buffer_overflow=0;
bit start_flag=0;
bit download_flag=0; 
bit address_get=1;
unsigned char menuBuffer[16][16]=
{{"1.Text1"}, {"2.Text2"}, {"3.Text3"},   {"4.Text4"},
 {"5.Text5"},{"6.Text6"},   {"7.Text7"},  {"8.Text8"}, 
 {"9.Text9"},{"10.Text10"}, {"11.Text11"},{"12.Text12"},
 {"13.Text13"},{"14.Text14"},{"15.Text15"},{"16.Text16"}
};
//开辟screenBuffer
//专门用来显示,一个屏幕只能显示64字节
unsigned char mode;
unsigned char key;//全局变量用来存放中断获取的键值
unsigned int currentMemoryPage; 
unsigned char * screenBuffer;
unsigned char Buffer[255];
unsigned char displaypoint,displaystart;
bit EDIT_flag=0;
unsigned char EDIT=0;
int  endOfBuffer;
unsigned char userchoose;
char endOfmenuBuffer;
int startOfBuffer;
int textX,menuX;
int textY,menuY;                                            
void Initialize( void );
void ShowMenu(void);
void check_key(void);
void check_download(void);
void USART_Transmit(unsigned char data);
void  menuBufferTOBuffer(void)
{
    unsigned char *p;                  
    unsigned char i;
    p=&menuBuffer[0][0];
    for (i=0;i< BUFFER_SIZE;i++)
    {
      Buffer[i]=*p;
      p++;
    }
}
void  BufferTOmenuBuffer(void)
{
    unsigned char *p;                  
    unsigned char i,j;
    p=Buffer;
    for (i=0;i<16;i++)
     for (j=0;j<16;j++)
       { 
         menuBuffer[i][j]=*p;
         p++;
       }
}
interrupt [USART_RXC] void usart_rx_isr(void)   // USART接收中断服务
{
    unsigned char status,data;
    static unsigned char i=0;
    status = UCSRA;
    data=UDR ;   
    if(!start_flag)
    {          
      Buffer[i]=data ;
      if(i++>3)
      {
      i=0;
      start_flag=1;
      }            
    }
    else 
    {    
    Buffer[i]=data;     
    if(i++==buffersize)
    buffer_overflow=1;
    }               
}

void USART_Transmit(unsigned char data)
{
	while (!(UCSRA & DATA_REGISTER_EMPTY));     // 等待发送寄存器空			                
	UDR = data;                                 // 发送数据			        
}
void main( void )
{  
   unsigned char  buttons     = 0;
   unsigned char  buttons2    = 0;
   int	 i          = 0; 
   Initialize();
   while( 1 )//功能键连接端口
   {
      buttons =  PINB  & 0x0F;
      delay_ms(10);
      buttons2 =  PINB  & 0x0F;		
      if( ( buttons == buttons2 ) && ( buttons != 0x0F ) )
      { 
          while( ( PINB  & 0x0F ) != 0x0F ); // wait for button release 
         switch( buttons )
         {
            case 0x0D:              // PB1 is low 0000 1101 UPBUTTON
            {  
              if(EDIT==0)
              {
               if( mode==TEXT )
               {  
                  startOfBuffer=startOfBuffer-64;   //screenBuffer是一个指针                  
                  if(startOfBuffer<0)  
                  {                                                                                     
                    startOfBuffer=192;                                       
                  // clear the buffer 
                    for( i = 0; i < BUFFER_SIZE; i++ )
                      {
                       Buffer[i] = ' ';            //可以限制在一个文件即8个PAGES内变动
                      }
                       currentMemoryPage -= 1;
                     if( currentMemoryPage < 0x02 )
                       {
                        currentMemoryPage = 0x02;
                       }
                      ReadMemoryToBuffer(Buffer,BUFFER_SIZE,currentMemoryPage );                  
                  }
                  screenBuffer = &Buffer[startOfBuffer];
                  lcd_clear();                                   
                  endOfBuffer = startOfBuffer+63;
         //screenBuffer保证指向64个元素,开头是startOfBuffer,结尾是endOfBuffer                      
                  lcd_write_full(screenBuffer);
                                         
      //如果是编辑状态,就把光标设置在最右角,并闪动,泛白显示
               }
               else //mode==MENU
               {                        
                 // lcd_cursor_flash(0); 
                  userchoose--;
                  if( userchoose ==255 )
                  {
                     userchoose = 15;
                  }
                  ShowMenu();
               } 		
               }                                              
               break;
            }            
            case 0x07:              // PB3 is low  0000 0111 ENTER 
		{
		 lcd_cursor_flash(0);         
		
               if( mode == TEXT)   //阅读状态时,在文本模式中,按ENTER返回菜单
               {   
                  if(EDIT==0)                
                  {
                   mode = MENU; // go back to the menu  
                  ReadMemoryToBuffer( Buffer, BUFFER_SIZE,0 );               
                  BufferTOmenuBuffer();
                  ShowMenu(); 
                  }                         
               }                                                                    
               else // mode == MENU 
               {  //在菜单模式下 按ENTER就直接进入对应文章显示DISPLAY置位
                                                     
                  //把菜单对用的数组存入第0 ,1,页中
                  //估计有16*16个字节大小,故要0页才可 
                  mode =TEXT;
                  menuBufferTOBuffer();
                  WriteBufferToMemory( Buffer, BUFFER_SIZE,0 );                  
		switch( userchoose )
                  {
                     case 0:
                        currentMemoryPage = 0x0002; // 0000 0010 
                        break;
                     case 1:
                         currentMemoryPage=0x0041;
                        break;
                     case 2:
                        currentMemoryPage=0x0081;
                        break;
                     case 3:
                         currentMemoryPage=0x00C1;
                        break;
                     case 4:
                        currentMemoryPage=0x00FF;
                        break;
                     case 5:
                         currentMemoryPage=0x013E;
                        break;
                     case 6:
                        currentMemoryPage=0x017D;
                        break;
                     case 7:
                        currentMemoryPage=0x01BC;
                        break;
                     case 8:
                        currentMemoryPage=0x01FB;
                        break;
                     case 9:
                        currentMemoryPage=0x023A;
                        break;
                     case 10:
                        currentMemoryPage=0x0279;
                        break;
                     case 11:
                        currentMemoryPage=0x02B8;
                        break;
		     case 12:
                         currentMemoryPage=0x02F7;
                        break;
		     case 13:
                        currentMemoryPage=0x0336;
                        break;
                     case 14:
                        currentMemoryPage=0x0375;
                        break;
                     case 15:
                        currentMemoryPage=0x03B4;
                        break;                     
                     default:
                        currentMemoryPage = 0;
                        break;
                  }
                  lcd_clear();
                  ReadMemoryToBuffer( Buffer, BUFFER_SIZE,currentMemoryPage );                                   
               /////////////////   
                  startOfBuffer=0;
                  screenBuffer=&Buffer[startOfBuffer];
                  lcd_write_full(screenBuffer);                 
                   endOfBuffer = startOfBuffer+63;                                     
               }
               break;
             }
            case 0x0B:              // PB2 is low  0000 1011 DOWNBUTTON 
            { 
            if(EDIT==0)
            { 
              if( mode==TEXT )
               {  
                  startOfBuffer=startOfBuffer+64;   //screenBuffer是一个指针                  
                  if(startOfBuffer>255)  
                  {                                                                                       
                    startOfBuffer=0;                                       
                  // clear the buffer 
                    for( i = 0; i < BUFFER_SIZE; i++ )
                      {
                       Buffer[i] = ' ';            //可以限制在一个文件即8个PAGES内变动
                      }
                       currentMemoryPage += 1;
                     if( currentMemoryPage > 0x1ff )
                       {
                        currentMemoryPage = 0x1ff;
                       }
                      ReadMemoryToBuffer(Buffer,BUFFER_SIZE,currentMemoryPage );                                     
                  }
                  screenBuffer=&Buffer[startOfBuffer];                  
                  lcd_clear();                 
                  lcd_write_full(screenBuffer);
                  endOfBuffer = startOfBuffer+63;
         //screenBuffer保证指向64个元素,开头是startOfBuffer,结尾是endOfBuffer                                                                
      //如果是编辑状态,就把光标设置在最右角,并闪动,泛白显示
               }
               else if( mode == MENU ) 
               {  
                  //lcd_cursor_flash(0); 
                  userchoose++;
                  if( userchoose ==16 )
                  {
                     userchoose = 0;
                  }
                  ShowMenu();                 
		}
             }                                              
               break;
            }
            case 0x0E:              // PB0 is low  0000 1110 edit 
            {   
            
                EDIT_flag=~EDIT_flag;
                if(EDIT_flag)
                   {
                   EDIT=1;                 
                   }
                   else 
                   {
                   EDIT=0;                 
                   }
               if (EDIT==0)
               {    
                    //绿灯灭                     
                    PORTD&=~0x20;                    
                    if( mode== MENU )
                    {
                    menuBufferTOBuffer(); 
                    WriteBufferToMemory( Buffer, BUFFER_SIZE,0 );
                     lcd_cursor_flash(0);                    
                    }else 
                    {                                               
                   WriteBufferToMemory( Buffer, BUFFER_SIZE,currentMemoryPage );
                     lcd_cursor_flash(0);
                    } 
               }
               else {
               //绿色灯亮
                    DDRD|=0x20;//PD5控制绿灯
                    PORTD|=0x20; 
                    if(mode==TEXT)
                    {                    
                      lcd_cursor_flash(1);
                       textX=7;
                       textY=3;
                       lcd_set_xy(textX,textY);                   
                    }
                    else if(mode==MENU)
                    {
                     lcd_cursor_flash(1);                       

⌨️ 快捷键说明

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