亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? iopic18.c

?? 單片機c語言程序設計100例--基于PIC+PROTEUS
?? C
?? 第 1 頁 / 共 2 頁
字號:
// 將指定棋盤格子(含格式內的棋子)反相顯示
// (當選定待移動棋子但未走動時,通過反復反相顯示形成閃爍效果)
//-----------------------------------------------------------------
void panel_invert(BYTE loc[], BYTE flag)
{ 
   BYTE char_code;
   //文本區首地址為0x2000,每個棋盤格子由4x4=16個字符(16字節)鋪成,
   //每行有8列棋盤格子,占16x8=128字節.
   //下面的語句根據位置loc得到平鋪指定格子底色的字符在DDRAM中的起始地址
   WORD addr = 0x2000 + loc[0] * 128 + loc[1] * 4;
   //偶數行奇數列,奇數行偶數列為黑格子,否則為白格子(& 0x01可得到1/0[奇/偶])
   if ((loc[0] & 0x01) ^ (loc[1] & 0x01))
   {  //黑格子反相(flag為1)時用編碼為0x00的字符鋪底
      //否則(flag為0)還原時用編碼為0x80的自定義字符"■"鋪底
      char_code = flag ? 0x00 : 0x80;
   }
   else
   {  //白格子反相(flag為1)時用編碼為0x80的自定義字符"■"鋪底
      //否則(flag為0)還原時用編碼為0x00的內置字符(無色)鋪底
      char_code = flag ? 0x80 : 0x00; 
   }
   //用編碼為0x00或0x80的全白或全黑字符重新對指定格子鋪底色
   //每個格子需要鋪4行字符
   for (INT i = 0; i < 4; i++)
   {  //設置顯示DDRAM地址
      lcd_wrcmd2(LCD_ADDRESS, addr);
      //每行鋪4個編碼為0x00或0x80的字符
      for (INT j = 0; j < 4; j++) lcd_wrcmd1(LCD_WRITEINC, char_code);
      //鋪完一行后,addr指向下一行的DDRAM地址
      //(由于棋盤每格有4列字符,共8列,故定位到下一行同一列的地址需要+32)
      //(該值與所設置的文本區寬度:LCD_TEXTAREA,32也相對應)
      addr += 32;
   }
}

//-----------------------------------------------------------------
// 檢測液晶狀態寄存器(STA0~STA7)
//-----------------------------------------------------------------  
void lcd_status_check(BYTE STA_mask)
{
    BYTE status; TRISD = 0xFF; //PORTD設為輸入,讀取狀態寄存器
    do
    {   //發送讀狀態寄存器字節命令
        PORTA = LCD_STATUS; asm("nop");
        //從PORTD讀取狀態寄存器字節,保存到status變量
        //隨后禁止LCD操作(禁止讀/寫,禁止片選,C/D設為1) 
        status = PORTD; PORTA = LCD_DONE;
        //與掩碼相與時為0x00則繼續讀狀態
    } while ((status & STA_mask) == 0x00); 
} 
   
//-----------------------------------------------------------------
// LCD清屏
//-----------------------------------------------------------------
void lcd_cls()
{
   lcd_wrcmd(LCD_DISPLAY + 0x00);   //關閉顯示
   lcd_wrcmd2(LCD_ADDRESS, 0x0000); //LCD RAM地址指針設為0x0000
   lcd_wrcmd(LCD_AUTOWRITE);        //發送數據自動寫命令(RAM地址自動遞增)
   for (INT i = 0; i < 0x2400; i++) //
   {  
      lcd_status_check(0x08);       //數據自動寫就緒(DAWRDY)標志位為0則等待
      PORTD = 0x00; TRISD = 0x00;   //向PORTD端口寫全0
      PORTA = LCD_DATA;             //在PORTA端口使能寫數據(C/D=0,WR=0,CE=0,RD=1)
      PORTA = LCD_DONE;             //完成后禁止操作
   }    
   lcd_wrcmd(LCD_AUTORESET);        //自動讀/寫復位(退出自動讀/寫方式)
   lcd_wrcmd(LCD_DISPLAY + 0x0C);   //設置顯示模式(啟用圖形/文本顯示)
}

//-----------------------------------------------------------------
// 將img指針所指向的棋子圖形點陣數據中的num個字節寫入LCD的addr地址顯示
//-----------------------------------------------------------------  
void lcd_blit(WORD addr, const BYTE *img, BYTE num)
{ 
   lcd_wrcmd2(LCD_ADDRESS,addr);//設置顯示DDRAM地址為addr
   lcd_wrcmd(LCD_AUTOWRITE);    //設置自動寫(DDRAM地址自動遞增)
   while (num--)                //共發送num個字節
   { 
      lcd_status_check(0x08);   //檢測LCD狀態寄存器中的STA3,等待自動寫就緒
      //向PORTD端口輸出顯示字節
      PORTD = *img++;  TRISD = 0; 
      //PORTA端口使能寫后結束操作
      PORTA = LCD_DATA; PORTA = LCD_DONE;
   }
   lcd_wrcmd(LCD_AUTORESET);   //自動寫復位(停止自動寫)
}

//-----------------------------------------------------------------
// 寫無參數LCD命令
//-----------------------------------------------------------------
void lcd_wrcmd(BYTE cmd)
{  
   lcd_status_check(0x01);     //檢測LCD狀態寄存器中的STA0,等待指令讀寫狀態位就緒
   PORTD = cmd; TRISD = 0;     //命令字節送PORTD端口
   PORTA = LCD_COMMAND;        //寫命令
   PORTA = LCD_DONE;           //禁止操作
}

//-----------------------------------------------------------------
// 寫帶單字節參數的LCD命令
//-----------------------------------------------------------------
void lcd_wrcmd1(BYTE cmd, BYTE data)
{
   lcd_status_check(0x02);     //檢測LCD狀態寄存器中的STA1,等待數據讀寫狀態位就緒
   PORTD = data; TRISD = 0x00; //參數送PORTD端口 
   PORTA = LCD_DATA;           //寫參數數據
   PORTA = LCD_DONE;           //禁止操作
   lcd_status_check(0x01);     //檢測LCD狀態寄存器中的STA0,等待指令讀寫狀態位就緒
   PORTD = cmd;  TRISD = 0x00; //命令字節送PORTD端口
   PORTA = LCD_COMMAND;        //寫命令
   PORTA = LCD_DONE;           //禁止操作
 }

//-----------------------------------------------------------------
// 寫帶字參數(兩字節)LCD命令
//-----------------------------------------------------------------
void lcd_wrcmd2 (BYTE cmd, WORD arg)
{  
   lcd_status_check(0x02);     //檢測LCD狀態寄存器中的STA1,等待數據讀寫狀態位就緒
   PORTD = arg & 0xFF;TRISD = 0x00; //參數D1送PORTD端口   
   PORTA = LCD_DATA;           //寫參數數據D1
   PORTA = LCD_DONE;           //禁止操作
   lcd_status_check(0x02);     //檢測LCD狀態寄存器中的STA1,等待數據讀寫狀態位就緒  
   PORTD = arg >> 8;  TRISD = 0x00; //參數D2送PORTD端口    
   PORTA = LCD_DATA;           //寫參數數據D2
   PORTA = LCD_DONE;           //禁止操作
   lcd_status_check(0x01);     //檢測LCD狀態寄存器中的STA0,等待指令讀寫狀態位就緒
   PORTD = cmd;  TRISD = 0x00; //命令字節送PORTD端口
   PORTA = LCD_COMMAND;        //寫命令
   PORTA = LCD_DONE;           //禁止操作
}

//-----------------------------------------------------------------
// 輸出提示音,提示yourmove
//-----------------------------------------------------------------
void sound_yourmove()
{ 
   tone(100, 100);
}   
//-----------------------------------------------------------------
// 棋子被捕獲時所輸出的聲音
//-----------------------------------------------------------------
void sound_capture()
{ 
   tone(50, 100); tone(75, 75); tone(100, 50); sleep(200);
}
//-----------------------------------------------------------------
// 棋子無效移動時所輸出的聲音
//-----------------------------------------------------------------
void sound_illegal()
 { 
    tone(400, 100);
 }
//-----------------------------------------------------------------
// 通過T0定時器,按指定周期和時長輸出聲音
//-----------------------------------------------------------------
void tone(WORD period, WORD cycles)
{
   LATC = 0x03;                 //RC0,RC1初始輸出11(0x03)
   T0CON = 0x04;                //T0定時器關,設16位模式,1/32分頻
   while (cycles--)
   { 
      TMR0H = -period >> 8;     //設置TMR0定時初值
      TMR0L = -period & 0xFF;
      TMR0IF = 0;               //中斷標志位請0
      TMR0ON = 1;               //啟動定時器
      while (TMR0IF == 0);     //等待T0溢出
      TMR0ON = 0;               //停止定時器
      LATC ^= 0x03;             //RC0,RC1兩腳輸出11,00,11,00,驅動揚聲器輸出
   }
 }

//-----------------------------------------------------------------
// 按鍵掃描函數,無鍵按下時返回0xFF
//-----------------------------------------------------------------
BYTE scankeypad()
{  
   BYTE r,c,tmp,key = 0xFF;
   //掃描8x8按鍵矩陣(相當于本例的觸摸屏的8x8=64個格子)
   for (c = 0; c < 8; c++)
   {  //在相應的列上設置低電平,然后讀取行狀態tmp
      //由于使用了3-8譯碼器,輸出000~111時
      //實際輸出的列字節為111111110,11111101,...01111111(僅有一位為0)
      PORTE = c; sleep(1); tmp = PORTB;
      //查看變為低電平的行,根據行號r與列號c,得出當前按鍵序號(0~63)
      for (r = 0; r < 8; ++r)
      { 
          if ((tmp & (1 << r)) == 0) { key = r * 8 + c;  goto done; }
      }
   }
   done: return key;
}

//-----------------------------------------------------------------
// 睡眠函數
//-----------------------------------------------------------------
void sleep(INT msecs)
{ 
    while (msecs--)
    {
      TMR0L = -32;              //設置TMR0定時初值
      TMR0IF = 0;               //TMR0溢出中斷標志位清0
      T0CON = 0xC6;             //T0定時器設為8位模式(T08BIT),啟動(TMR0ON)
      while (TMR0IF == 0);      //等待定時器溢出      
      TMR0ON = 0;               //定時器關
    }
}

//-----------------------------------------------------------------
// 字符輸出函數
//-----------------------------------------------------------------
void putch(char value)
{ 
   if (value == '\n') value = '\r';
   TXREG = value; while (!TRMT);//向串口輸出一字節,等待發送結束
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜精品久久久久久免费视| 日本大胆欧美人术艺术动态| 亚洲国产视频a| 蜜臀久久99精品久久久画质超高清| 国产精品88av| 欧美一级艳片视频免费观看| 中文字幕亚洲视频| 国产精品一区二区三区四区| 这里只有精品视频在线观看| 亚洲色图第一区| 懂色av一区二区三区免费看| 日韩欧美视频一区| 午夜av电影一区| 欧美在线一二三| 国产精品国产三级国产aⅴ无密码| 奇米影视一区二区三区| 91香蕉视频mp4| 国产精品午夜在线观看| 国产又粗又猛又爽又黄91精品| 欧美精品在线一区二区| 亚洲成人久久影院| 欧美伊人久久大香线蕉综合69| 国产精品毛片高清在线完整版| 极品销魂美女一区二区三区| 欧美一区三区二区| 石原莉奈在线亚洲二区| 欧美性猛片xxxx免费看久爱| 亚洲综合男人的天堂| 色成人在线视频| 亚洲精品国产无天堂网2021| 色老汉一区二区三区| 亚洲人成影院在线观看| 成人18视频日本| 国产精品国产自产拍高清av王其| 国产91精品一区二区麻豆网站| 国产亚洲综合av| 国产白丝精品91爽爽久久| 久久精品欧美一区二区三区麻豆| 国产盗摄视频一区二区三区| 欧美韩日一区二区三区四区| 国产成人激情av| 日本一区二区视频在线| 99re亚洲国产精品| 亚洲精品国产高清久久伦理二区| 99精品一区二区三区| 综合欧美一区二区三区| 在线免费观看视频一区| 日日夜夜精品视频天天综合网| 欧美一区二区三区在线观看| 麻豆国产精品一区二区三区 | 欧美亚洲国产一区二区三区| 一区二区三区高清| 91麻豆精品国产91久久久久久久久 | 精品国产在天天线2019| 日本伊人色综合网| 精品久久免费看| 国产成人av电影| 亚洲视频一区二区在线| 欧美日韩精品专区| 国内不卡的二区三区中文字幕| 久久精品视频一区二区三区| 色伊人久久综合中文字幕| 亚洲国产成人porn| 欧美成人一区二区| av在线免费不卡| 午夜天堂影视香蕉久久| 国产亚洲欧美色| 色欲综合视频天天天| 日本成人中文字幕| 欧美成人一级视频| 老鸭窝一区二区久久精品| 久久亚洲春色中文字幕久久久| 91精品国产麻豆| 国产精品一二三| 亚洲另类中文字| 欧美va天堂va视频va在线| 成人蜜臀av电影| 日韩电影免费一区| 最新中文字幕一区二区三区| 91精品国产一区二区| 成人性生交大合| 日本亚洲欧美天堂免费| 国产精品天美传媒| 欧美成人伊人久久综合网| 日本精品一级二级| 高清不卡在线观看av| 天堂久久一区二区三区| 日韩毛片高清在线播放| 久久久久久一级片| 欧美一区二区三区免费观看视频| 99久久综合精品| 国产在线一区二区| 日本不卡一二三| 亚洲午夜免费视频| 综合自拍亚洲综合图不卡区| 精品1区2区在线观看| 欧美美女直播网站| 在线影院国内精品| 色婷婷亚洲婷婷| 成人免费视频app| 国精产品一区一区三区mba视频| 亚洲成av人片在线观看无码| 一区二区三区国产精华| 亚洲丝袜精品丝袜在线| 国产精品三级av在线播放| 欧美精品一区二区三区在线| 91麻豆精品国产91久久久久久 | 欧美日韩亚洲综合在线 | 三级不卡在线观看| 亚洲第一会所有码转帖| 一区二区国产视频| 亚洲精品国产品国语在线app| 亚洲视频图片小说| 亚洲久本草在线中文字幕| 亚洲欧洲精品一区二区三区不卡| 国产精品三级视频| 中文字幕精品一区| 国产精品久久久久久久浪潮网站 | 久久精品夜色噜噜亚洲a∨| 欧美色欧美亚洲另类二区| 日本韩国欧美在线| 在线亚洲免费视频| 欧美在线短视频| 欧美日韩国产欧美日美国产精品| 欧美美女网站色| 日韩美女主播在线视频一区二区三区| 538prom精品视频线放| 7777精品伊人久久久大香线蕉超级流畅 | 夜夜亚洲天天久久| 亚洲国产视频一区二区| 日韩不卡一二三区| 激情亚洲综合在线| 国产精华液一区二区三区| 成人午夜碰碰视频| 色综合久久久久综合体桃花网| 一本大道久久精品懂色aⅴ| 欧美综合一区二区| 欧美一区二区三区啪啪| 久久精品亚洲乱码伦伦中文 | 国产三级欧美三级日产三级99| 国产日韩精品一区| 亚洲精品免费播放| 久久精品国产第一区二区三区 | 免费视频一区二区| 国产成人免费在线观看不卡| 91女人视频在线观看| 欧美久久一二区| 精品盗摄一区二区三区| 中文字幕日韩精品一区| 午夜电影久久久| 国产一区二区精品在线观看| 91影视在线播放| 欧美一区二区三区不卡| 亚洲国产精品t66y| 日韩黄色一级片| 岛国精品一区二区| 88在线观看91蜜桃国自产| www国产成人| 伊人夜夜躁av伊人久久| 国产毛片精品国产一区二区三区| 91最新地址在线播放| 欧美成va人片在线观看| 亚洲精品福利视频网站| 国产一区二区女| 制服丝袜中文字幕一区| 中文字幕中文字幕一区| 免费在线观看不卡| 欧美熟乱第一页| 中文幕一区二区三区久久蜜桃| 天天操天天干天天综合网| 99国产精品一区| 亚洲精品一线二线三线| 亚洲影视在线播放| 成人午夜激情片| 精品欧美乱码久久久久久1区2区 | 欧美一区二区私人影院日本| 中文字幕日韩欧美一区二区三区| 久久成人综合网| 在线综合+亚洲+欧美中文字幕| 亚洲免费av在线| 波多野结衣欧美| 久久久久久99精品| 青青草视频一区| 在线看国产一区| 亚洲色图在线视频| av网站一区二区三区| 欧美韩国日本综合| 国产成人综合在线观看| 久久亚洲一级片| 精品一区二区三区久久久| 欧美一区二区精品在线| 亚洲国产精品自拍| 在线观看91精品国产入口| 亚洲人午夜精品天堂一二香蕉| 国产99久久精品| 欧美激情综合五月色丁香小说| 国产一区二区看久久| 久久久久亚洲综合| 成人一区二区三区视频| 国产精品白丝在线|