📄 main.c
字号:
/******************************************************************************
*电子书设计程序
* 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 + -