#include \ lcd.c delay(unsigned char time) {
while(--time); }
//LCD状态检测,根据最高位判断LCD是否忙 unsigned char LCD_BUSY(void) {
delay(20);//Protues仿真环境下必须延时 if((bit)(LCD_CR & 0x80)) return (1); else return (0); }
//将要显示的字符写入LCD
void Print(unsigned char *str,unsigned char n){
unsigned char i;
for(i=0;i //LCD初始化 void LCD_Init(void) { while(LCD_BUSY()); LCD_CW = LCD_SET_7; while(LCD_BUSY()); LCD_CW = LCD_AC_UP; while(LCD_BUSY()); LCD_CW = LCD_SHOW; } while(LCD_BUSY()); LCD_DW = *str;//直接针对外部地址些 movx指令 str++; //光标位置设定,由行列参数确定(1,16)(2,1) void LCD_SET_CURSOR(unsigned char line, unsigned char column) { while(LCD_BUSY()); switch(line){ case 1: LCD_CW = 0x80 + column-1;//光标定位 break; case 2: LCD_CW = 0xc0 + column-1;//光标定位 break; default: break; } //显示光标设定 /* void LCD_CURSOR_ONOFF(unsigned char cursor_flag) { while(LCD_BUSY()); switch(cursor_flag) { case 1: LCD_CW = LCD_NO_CURSOR;//无光标 break; case 2: LCD_CW = LCD_CURSOR_NO_FLASH;//有光标不闪烁 break; case 3: LCD_CW = LCD_CURSOR_FLASH;//有光标闪烁 break; default: break; } } */ } #include \ keyboard.h unsigned char key,key_old,key_new,key_pressed_time; sbit BEGIN_KEY =P3^0; sbit UP_KEY =P3^1; sbit DOWN_KEY =P3^3; sbit VOL UP_KEY =P3^4; sbit VOL DOWN_KEY=P3^5; void scan_keyboard(void) //键盘扫描 { if(key)return; if((KEY_INPUT & KEY_PIN)==KEY_PIN) //按键释放 { if(!key_old) //如果上次无按键按下 { return; //返回 } else //如果上次有按键按下 { if(key_pressed_time>100) //按键时间超过一秒,长按键码 { // key=key_old+0x80; //长按键码等于普通按键码加0x80 } else if(key_pressed_time>1) { key=key_old; //按键值 } key_old=0; } return; } else //按键按下 { key_new=0; if(BEGIN_KEY)key_new=KEY_BEGIN; if(DOWN_KEY)key_new=KEY_DOWN; if(UP_KEY)key_new=KEY_UP; if(VOL DOWN_KEY)key_new=KEY_DOWN; 下 if(VOL UP_KEY)key_new=KEY_UP; if(key_new==key_old) 10ms { if(key_pressed_time>80) { key_pressed_time-=5; 隔50ms按一次 key=key_new; return; } else { key_pressed_time++; } } else { key_pressed_time=0; //BEGIN键按下 //DOWN键按下 //UP键按下 //VOL DOWN键按 //VOL UP键按下 //如果按键按下长于//如果按键按下超过1s //则自动按键。相当于每 //按键按下计时加一 //如果本次按下跟上次按 下不一样,则按键按下时间清零 } key_old=key_new; //保存本次按键值 } } #include \ unsigned long int DosBootSector; //操作系统引导扇区 unsigned char SectorPerClus; //每簇扇区数(一般很小,2-64) unsigned long int FatStartSector; //FAT表开始扇区 unsigned long int DataStartSector; //数据开始扇区 /*读主引导记录******master boot record********/ void RdMBR (unsigned char *buf) { READ_SECTOR(0, buf); DosBootSector = buf[454] + buf[455]*256 + buf[456]*65536 + buf[457]*65536*256; } /****读操作系统引导记录扇区***dos boot recode************/ void RdDBR (unsigned char *buf) { idata unsigned long int fat_size ; //文件分配表的大小 idata unsigned long int reserved_sector ; READ_SECTOR(DosBootSector,buf); fat.c