wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

Atmega16單片機實用程序

作者:韓冰   來源:本站原創   點擊數:  更新時間:2013年11月29日   【字體:
/*********************************************************************
 MCU:        ATmega16
 外部晶振:  8MHz
 程序功能:  4*4鍵盤識別,LED七段數碼管顯示,密碼功能模塊,直流電機正反轉控制
             AD轉換模塊, 模擬比較器,外部中斷應用,12864液晶,C/T0
 硬件設計:  參考PROTUES硬件仿真電路
 調試:      所有程序主要功能都軟硬件仿真通過,實際使用時要根據需要加入可靠性。
 編譯環境:  ICC AVR 
 Design by:   wdw        
 ********************************************************************/
#include<iom16v.h>
#include<macros.h>
#include<math.h>                            
#define uchar unsigned char
#define uint unsigned int
#define   SET_1(a,b)   a|=bit(b)       //將寄存器a的第b位置1
#define   CLR_0(a,b)   a&=~bit(b)      //將寄存器a的第b位清0
#program date code:
   const date[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,//共陽數據;
                  0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
#program duan code:
   const duan[]={0x20,0x10,0x08,0x04,0x02,0x01};              //段選;
char adchannel; 
int dispbuf[]={0,0,0,0,0,0,};                           //顯示緩存;
uchar securbuf[]={0,0,0,0,0,};                       //5位密碼緩存;
/********************************************************************
名稱:ms延時子函數
功能:延時指定的ms
*********************************************************************/
void delayms(int ms)
  {
    int i,j;
 for(i=ms;i>0;i--)
   {
    for(j=1722;j>0;j--);                              //8M時改為1141;
    }                                                 //12M時為1722;
   }
/*******************************************************************
名稱:us延時子程序
功能:延時指定的us
********************************************************************/
void delayus(uchar us)
    {
 
 for(us;us<0;us--);
       {
  
     }                    //12M時單位T為1.45US
       
 
  } 
/********************************************************************
單參數LED 顯示
硬件連接:數據PORTC-----D7~D0
          段選PORTD-----D7~D4
*********************************************************************/ 
void LEDShow(long int shownum)
{
 uchar i,tmp,curnum;
 long int tmpnum;
  tmp = 0xfb;
  tmpnum = shownum;
  for(i=0;i<6;i++)                 //顯示的位數為5
  { 
   curnum = tmpnum % 10;
   tmpnum = tmpnum / 10;
   PORTD = tmp;
   PORTC = date[curnum];
   delayus(1);
   tmp = (tmp << 1) + 0x01;    //補上移位造成的最右位為0;  
  }
}
/*******************************************************
名稱:七段LED共陽數碼管,在指定數位上顯示指定的數,雙參數
功能:在指定的位置上顯示制定的數;
硬件連接:PC口複用控制段選和位選,有2片573進行數據鎖存;
*******************************************************/  
void show(uchar dat,uchar num)                  //六位七段數碼管顯示程序OK;
       {
    PORTC=date[dat];
    PORTD|=BIT(0);
    PORTD&=~BIT(0);                          //送數據;
    delayus(2);
   
    PORTC=0X00;
    delayus(1);
       PORTC=duan[num];
    PORTD|=BIT(1);
    delayus(2);
    PORTD&=~BIT(1); 
    delayus(2); 
    }                                       //送選通信號;
/************************************************************
名稱:MCU端口初始化
功能:設置MCU端口初始方向為輸出初始狀態為低
*************************************************************/
void Gpioinit0()
      {
    DDRA=0XFF;
    PORTA=0X00;
    DDRB=0XFF;
    PORTB=0X00;
    DDRC=0XFF;
    PORTC=0X00;
    DDRD=0XFF;
    PORTD=0X00;  
    }
/***********************************************************
名稱:MCU端口初始化
功能:設置MCU端口初始為輸出初始狀態為高   
************************************************************/
void Gpioinit1()
     {
  DDRA=0Xff;
  PORTA=0XFF;
  DDRB=0xff;
  PORTB=0XFF;
  DDRC=0xff;
  PORTC=0XFF;
  DDRD=0xff;
  PORTD=0XFF;
  }  
/**************************************************
名稱:單端口測試
輸入:測試PC的任意端口號0~7
功能:週期改變一個端口的電平
**************************************************/ 
void IOtest(uchar num)
     {
  
   DDRC|=BIT(num);
  // while(1)
    //  {
     PORTC|=BIT(num);
     delayms(50);
     PORTC&=~BIT(num);
     delayms(50);
    // }
   }
/*************************************************
名稱:按鍵動作檢測子程序。
功能:檢測4*4鍵盤是否有鍵按下;
硬件連接:PB0~PB3為行;PB4~pb7為列;
*************************************************/ 
uchar key_press()
    {
  uchar key;
  DDRB=0XFF;
  PORTB=0X0F;
  DDRB=0XF0;
  delayms(2);                         //此處要加上適當延時否則讀不到端口信息;                           
  key=PINB;
  key&=0x0f;                          //按下返回1,否則為0;
 
  if(key==0x0f)
    {
     return 0;
     }
  else
     return 1;
    
     }
/***************************************************
 名稱:4*4矩陣按鍵掃描子程序
 功能:掃描一個4*4矩陣案件,比返回相應按鍵值;
 硬件連接:PB0~PB3為行;PB4~pb7為列;
***************************************************/ 
uchar keyscan()                                   //4*4鍵盤掃面程序,調試0K;
     {
   uchar keycode,keynum;
  do{
     }while(key_press()==0);                   //按鍵是否按下?
   asm("nop");
   asm("nop");
   while(key_press()==1)
     {
  DDRB=0XFF;                                //PB0~PB3為列,PB4~PB7為行;
  PORTB=0X0F;                               //列輸出高電平,行輸出低電平;
  DDRB=0XF0;             
  delayus(10);                               //延時2毫秒,讀列狀態;
  keycode=PINB;
  
  keycode&=0x0f;                            //讀列狀態,屏蔽行狀態;
  
  DDRB=0XFF;
  PORTB=0XF0;
  DDRB=0X0F;
  delayus(10);
  PINB&=0Xf0;                               //讀行狀態,屏蔽列狀態;
  
  keycode|=PINB;
  delayus(10);
      
    do{
    }while(key_press()==1);                //按鍵是否釋放;
   
  switch(keycode)
      {
    case 0xee:
        keynum=0;
     break;
       case 0xde:
        keynum=1;
     break;
       case 0xbe:
        keynum=2;
     break;
    case 0x7e:
        keynum=3;
     break;
    case 0xed:
        keynum=4;
     break;
    case 0xdd:
        keynum=5;
     break;
    case 0xbd:
        keynum=6;
     break;
    case 0x7d:
        keynum=7;
     break;
    case 0xeb:
        keynum=8;
     break;
    case 0xdb:
        keynum=9;
     break;
    case 0xbb:
        keynum=10;
     break;
    case 0x7b:
        keynum=11;
     break;
    case 0xe7:                      
        keynum=12;
     break;
    case 0xd7:
        keynum=13;
     break;
    case 0xb7:
        keynum=14;
     break;
    case 0x77:
        keynum=15;
     break;         
      
    default :
       keynum=16;
        break; 
   
    }  
  
   } 
  return keynum;
  
   } 

/************************************************************
 名稱:六位密碼輸入比對程序
 功能:輸入六位數並與存儲密碼比對,0K返回1,按錯或者順序錯返回0;
       原始密碼654321
**************************************************************/ 
uchar securtcom()                                    //6位密碼輸入比對程序0K;
    {
 uchar  keycount=0;
  while(key_press()==1);
  delayms(3);
  do{
      while(key_press()==1);
   delayms(1);
      while(key_press()==0);
    show(8,keycount);
   securbuf[keycount++]=keyscan();
   }while(keycount<6);
  if(securbuf[0]==6)                           //初始比對,密碼654321;
       {
      if(securbuf[1]==5)
       {
      if(securbuf[2]==4)
       {
         if(securbuf[3]==3)
        {
         if(securbuf[4]==2)
      {
       if(securbuf[5]==1);
       }
        }
      
       }  
     }
   return  1;                                    //密碼正確,返回1;
    }                       
       else
    return  0;                                    //密碼錯誤,返回0;
  } 
uchar serset()                                         //密碼設定子程序;                         
    {
 
   
 }
uchar speci_keypress(uchar presstimes)  //特殊按鍵F按下某一設定次數OK;
    {
 }
   
uchar key_longpress(uchar prst)        //按鍵長按子程序
      {
   
    }   
/**************************************************
名稱:  直流蜂鳴器控制 
功能:  控制蜂鳴器鳴響時間
硬件連接:PD5輸出控制信號
**************************************************/   
void dcbeep(uchar beeptime)            //直流蜂鳴器,調試OK;
     {uchar beep;
   DDRD|=BIT(5);
   PORTD&=~BIT(5);
   PORTD|=BIT(5);
   delayus(beeptime);
   PORTD&=~BIT(5);
   delayus(100-beeptime);
    
    }
/**********************************************************
名稱:直流電機全橋控制
功能:fbw=1.正轉;fbw=0,反轉;
硬件連接:PD6與PD7口組合輸出控制信號;
**********************************************************/   
void moto(uchar fbw)                 //直流電機正反轉程序,驅動全橋;
      {
    DDRD|=BIT(6);
    DDRD|=BIT(7);
    PORTD&=~BIT(6);
    PORTD&=~BIT(7);
    delayms(5);
    if(fbw==1)
      {
      
    PORTD|=BIT(6);
    delayms(500);
    PORTD&=~BIT(6);
    delayms(20);
  
    }
    else
       {
     }
   if(fbw==0)
     {
    PORTD|=BIT(7);
    delayms(500);
    PORTD&=~BIT(7);
    delayms(20);
    
      }     
   }
/*********************************************************
 名稱: AD單次轉換子程序;
 功能: 採樣AD通路0的電壓,該函數輸出為AD 轉換後的數據,
        查詢工作方式
*********************************************************/  
void ad_init()
   {
   ADMUX=0XC0;                //設置AD輸入通道為0通道,內部2.56V參考電壓;
   ADCSRA=0X80;               //使能ADC,清中斷標誌ADIF,查詢方式;
   DDRA&=~BIT(0);             //設置PA0口為輸入;
   PORTA&=~BIT(0);            //PA0口清零;
  
    }
int ad_conv()                                //單次轉換子程序,OK;
       {
     int addata;
  ADCSRA|=BIT(ADSC);                   //啟動一次轉換;
    
  while(!(ADCSRA&(BIT(ADIF))));    //查詢等待轉換結束標誌置位;
  ADCSRA&=~BIT(ADIF);
  addata=ADCL;
     addata=addata+ADCH*256;
  return addata;
   
    } 
int ad_aver()                             //轉換8次,做平均值濾波
     {
    int adaver,count;
    for(count=7;count>0;count--)
        {
      adaver=ad_conv();
   adaver+=adaver;
   delayms(1);
      }  
    adaver=adaver/8;
    delayms(1);  
    return adaver;
   }
/*********************************************************
名稱:AD採樣
功能:採樣AD0的電壓,內部2.56V參考電壓,中斷工作方式
**********************************************************/
void ad0_init()
    {
  ADMUX=0xc0; 
  adchannel=0;
  ADCSRA=0x98;
  DDRA&=~BIT(0);
  PORTA&=~BIT(0);
  SEI();
     }  
#pragma interrupt_handler process:15    //interrupt process program
void process()
     {
       int adcode=0;
    ADCSRA&=~BIT(ADIE);
    adcode=ADCL;
    adcode=(ADCH<<8)+adcode;      //get adc value
    /************************
                   中斷處理函數
          *************************/
    ADCSRA|=BIT(ADIE);
   }
/********************************************************
名稱:DAC0832 DA轉換
輸入:有效分度0~255
輸出:無
功能:對8為數字信號進行DA轉換,實際應用需調試
********************************************************/ 
#define cs_low  PORTD&=~BIT(0)
#define cs_high PORTD|=BIT(0)
#define wr1_low  PORTD&=~BIT(1)
#define wr1_high PORTD|=BIT(1)
#define ile_high  PORTD|=BIT(2)
#define ile_low   PORTD&=~BIT(2)
#define wr2_low   PORTD&=~BIT(3)
#define wr2_high  PORTD|=BIT(3)
#define xfer_low  PORTD&=~BIT(5)
#define xfer_high PORTD|=BIT(5)
void dac(int dadata)
     {
   Gpioinit1();
   DDRD=0xff;
   DDRC=0xff;
   ile_high;
   //delayus(1);
   cs_low;
   wr1_low;
   //delayus(1);
   PORTC=dadata;
   //delayus(1);
   wr1_high;
   cs_high;
  // delayus(1);
   wr2_low;
   xfer_low;
  // delayus(1);
   xfer_high;
  
   
   }
/*****************************************************
名稱: 數據拆分顯示函數
功能: 將四位數據分別顯示到對應的數碼管。
*****************************************************/           
void addisplay(int addat)                  //轉換數據顯示,運算OK;
       {
     int a;
  a=addat;
  show(a/1000,3);
  delayms(2);
  show((a/100)%10,2);
  delayms(2);
  show(((a/10)%10)/10,1);
  delayms(2);
     show(a%10,0);
  delayms(2);
    
   } 
/**********************************************************
名稱:SPI通信
功能:應用mega16自身SPI通信模塊與外設進行通信.查詢方式;
***********************************************************/  
void SPI_masterinit()
     {
   DDRB|=BIT(5)|BIT(7);               //設置MOSI與SCK為輸出
   DDRB&=~(BIT(4)&BIT(6));            //設置MISO與SS為輸入
   SPCR|=BIT(4)|BIT(3)|BIT(1)|BIT(0); //數據高位先發送,主機模式,空閒時鐘極性
                                      //為高,SCK起始沿採樣數據,128分頻
   SPCR|=BIT(6);                      //使能SPI          
   delayms(1);         
   }  
void SPI_mastertransdata(uchar data)
     {
  SPDR=data;
  while(!(SPSR&BIT(7)));
  } 
void SPI_slaveinit()
     {
  
   }
void SPI_slaverecive()
      {
    }
   
/*********************************************************
名稱:比較匹配模式,,中斷方式,調試OK
功能:AVR比較匹配模式應用,當AIN大於AIN1時,上升沿產生中斷
**********************************************************/   
void com_inti()                        
      {
     SEI();                         //開總中斷;
     DDRB&=((~BIT(2))&(~BIT(3)));   //設置PB2/3口為輸入;
  SFIOR&=~BIT(3);                //設置AIN1為模擬比較器反向輸入端;
  ACSR&=~BIT(7);                 //使能模擬比較器,注意此處為低電平有效;
  ACSR&=~BIT(6);                 //設置AIN0為正極輸入端;
  ACSR|=BIT(3);                  //使能模擬比較器中斷;
     ACSR|=(BIT(1)|BIT(0));         //比較器上升沿觸發中斷;
    }
   
#pragma interrupt_handler comp:17       //注意函數名後不加();
void comp()                            //模擬比較器中斷服務程序;
      {
    ACSR&=~BIT(3);
   /*************
    此處加中斷處理函數
   
    **************/
    ACSR|=BIT(3);
  
                      
    }
/**********************************************************
名稱:外部中斷INT0 調試OK
功能:低電平觸發INT0端口引起中斷,並響應相關中斷服務程序
**********************************************************/  
void int0_init()
      {
    DDRD&=~BIT(2);                         //PD2/INT0端口配置為輸入;
    MCUCR&=((~BIT(0))&(~BIT(0)));          //INT0觸發方式為低電平;
    GICR|=BIT(6);                          //使能外部中斷0;
    SEI();                                 //開總中斷;
   
    }
#pragma interrupt_handler int0:2
void int0()                                   //INT0中斷服務函數;
     {
    GICR&=~BIT(6);                         //關閉外部INT0;
  /************************
 
 
   此處加INT0中斷處理函數
         
 
  ************************/ 
    GICR|=BIT(6);                         //開啟外部INT0;
   }
/*********************************************************
名稱:外部中斷INT1,
功能:邊沿觸發INT0端口引起中斷,並響應相關中斷服務程序
**********************************************************/    
void int1_init()
     {
   DDRD&=~BIT(3);                        //將PD3口配置為輸入;
   PORTD&=~BIT(3);                       //pd3口初始值為0;
   MCUCR|=(BIT(3)|BIT(2));               //INT1上升沿觸發中斷;
   GICR|=BIT(7);                         //使能INT1中斷;
   SEI();                                //開總中斷;
   }
#pragma interrupt_handler int1:3
void int1()
     {
   GICR&=~BIT(7);                       //關閉INT1中斷;
   /*******************************
  
   此處加INT1中斷服務函數;
  
   *******************************/                                 
   GICR|=BIT(7);                        //開啟INT1中斷; 
                 
   } 
/**********************************************************       
/**********************************************************
名稱:12864(ks0108)顯示應用
功能:圖形液晶使用
**********************************************************/  
#define EN_CLR          PORTD&=~BIT(0)       //使能12864
#define EN_SET          PORTD|=BIT(0)        //關閉12864
#define RW_READ         PORTD|=BIT(1)        //讀操作
#define RW_WRITE        PORTD&=~BIT(1)       //寫操作
#define RS_COMM         PORTD&=~BIT(2)       //命令操作
#define RS_DATA         PORTD|=BIT(2)        //數據操作
#define RESET           PORTD&=~BIT(3)       //12864液晶複位
#define RESET_OVER      PORTD|=BIT(3)        //12864液晶結束複位;
#define CS1_EN          PORTD&=~BIT(4)       //使能CS1,選擇左半屏幕;
#define CS1_DIS         PORTD|=BIT(4)        //禁止CS1
#define CS2_EN          PORTD&=~BIT(5)       //使能CS2,選擇右半屏幕;
#define CS2_DIS         PORTD|=BIT(5)        //禁止CS2
#define basic_com       0x30                 //一次送8BIT數據,基本指令集;
#define explo_com       0xc4                 //擴展指令集
#define show_stitude    0x0f                 //顯示狀態,整體顯示,游標開,游標位置開
#define cleanscreen     0x01                 //顯示清零,AC歸零
#define cursor          0x07                 //寫入/讀取時,游標右移,畫面左移
#define AC_0            0x03                 //AC歸0,不改變DDRAM內容
const int char_0816[]={
                       0xe0,0x18,0x04,0x04,0x04,0x18,0xe0,0x00,
        0x07,0x18,0x20,0x20,0x20,0x18,0x07,0x00
                        };
/************************************************************
名稱:MCU端口初始化
功能:設置MCU端口初始方向以及狀態
*************************************************************/
void GPIO_INIT()
      {
    DDRA=0XFF;
    PORTA=0X00;
    DDRB=0XFF;
    PORTA=0X00;
    DDRC=0XFF;
    PORTA=0X00;
    DDRD=0XFF;
    PORTA=0X00;  
    }
/****************************************************************
名稱:輸入數據
功能:MCU將數據送到總線
*****************************************************************/   
void SET_DATA(uchar data)
     {
   delayus(3);
   PORTC=data;
   delayus(3);
   }
/****************************************************************
名稱:開關顯示控制
功能:開啟與關閉顯示操作,1為開顯示,0為關閉顯示
*****************************************************************/ 
void LCD_Command_Displayonoff(uchar onoff) 
      {
    RW_WRITE;
    RS_COMM;
    EN_CLR;
    SET_DATA(0x3e + onoff);     //onoff為1開顯示,為0關顯示;
    EN_SET;
    delayus(2);
    EN_CLR;
   }
/***************************************************************
名稱: LCD顯示起始行設定
功能:設置LCD顯示起始行位置,startline範圍0~63
***************************************************************/  
void LCD_Command_setstartline(uchar startline)
     {
  RW_WRITE;
  RS_COMM;
  EN_CLR;
  SET_DATA(0Xc0 + startline);    //12864行地址為0~63之間設定;
  EN_SET;
  delayus(2);
  EN_CLR;
  }
/***************************************************************
名稱:設置顯示行頁地址
功能:設置顯示行頁地址,12864為0~7
****************************************************************/ 
void LCD_Command_set_x(uchar x)
   {
     RW_WRITE;
  RS_COMM;
  EN_CLR;
  SET_DATA(0xB8+x);    //設置12864行頁地址  x範圍0~7;
  EN_SET;
  delayus(2);
  EN_CLR;
    }
/****************************************************************
名稱:設置顯示列地址
功能:設置顯示列地址y,範圍0~63;
*****************************************************************/
void LCD_Command_set_y(uchar column)
    {
  RW_WRITE;
  RS_COMM;
  EN_CLR;
  SET_DATA(0x40+column);    //設置顯示列地址y,範圍0~63;
  EN_SET;
  delayus(2);
  EN_CLR;
  }
/********************************************************************
名稱:LCD顯示數據寫入
功能:將顯示數據寫入12864液晶
*********************************************************************/
void LCD_Command_writebyte(uchar data)
    {
  RW_WRITE;
  RS_DATA;
  EN_CLR;
  SET_DATA(data);
  EN_SET;
  delayus(2);
  EN_CLR;
  } 
/*********************************************************************
名稱:LCD複位操作
功能:複位LCD
**********************************************************************/ 
void LCD_RESET()
     {
   RESET;
   NOP();
   NOP();
   NOP();
   RESET_OVER;
   } 
/************************************************************
名稱:清除指定範圍函數
功能:清除LCD屏幕指定範圍起始行~結束行的顯示內容
************************************************************/   
void LCD_CLEAR_LINE(uchar startline,uchar endline)
     {
   uchar i,j;
   for(i-startline;i<=endline;i++)
      {
    CS1_EN;
    CS2_EN;
    LCD_Command_set_x(i);
    LCD_Command_set_y(0);               //y地址每次操作後自動加1;
    for(j=0;j<64;j++)
       {
     LCD_Command_writebyte(0x00);
     }
    }
   } 
/*************************************************************
名稱:顯示初始化
功能:初始化LCD
*************************************************************/   
void LCD_init()
     {
   LCD_RESET();
   LCD_CLEAR_LINE(0,7);
   NOP();
   LCD_Command_Displayonoff(1);
   NOP();
   LCD_Command_setstartline(0);
   }
/**************************************************************
名稱:LCD_WRITE_DATA
輸入:x in [0,7] and y in [0,127]
輸出:無
功能:在LCD指定行列寫一個數據
**************************************************************/ 
void LCD_write_data(uchar x,uchar y,uchar data)
     {
   if(y<64)
     {
   CS1_EN;
   CS2_DIS;
   LCD_Command_set_x(x);
   LCD_Command_set_y(y);
   }
   else
   {
   CS1_DIS;
   CS2_EN;
   LCD_Command_set_x(x);
   LCD_Command_set_y(y-64);
   }
  LCD_Command_writebyte(data); 
  delayus(1);
  }
/*********************************************************
名稱:LCD_WRITE_DOT
輸入:x in [0,63] and y in [0,127]
輸出:無
功能:在指定像素位置描點,此函數為覆蓋式描點,原位置一個
      字節數據被覆蓋
*********************************************************/ 
void LCD_write_dot(uchar x,uchar y)
     {
   uchar x_address,y_address;
   uchar data=0;
   if((x<64)&&(y<128))
     {
   x_address=x>>3;
   y_address=y;
   LCD_write_data(x_address,y_address,data|(1<<(x%8)));
   }
  }
/**********************************************************
名稱:LCD_WRITE_CHAR
輸入:x in [0,3],y in [0,15], disp-顯示字符自模數組首地址
輸出:無
功能:在LCD指定顯示單元顯示一個字符,每個顯示單元默認為8*16
      點陣字體,對12864點陣LCD,x最多顯示4行,y最多顯示16個字
   符。
***********************************************************/ 
void LCD_write_char(uchar x,uchar y,const uchar *disp)
     {
   uchar i;
   uchar x_address;
   uchar y_address;
  if((x<4)&&(y<16))
      {
   for(i=0;i<8;i++)
       {
     x_address=x<<1;
     y_address=(y<<3)+i;
     LCD_write_data(x_address,y_address,*disp++);
     }
     for(i=0;i<8;i++)
        {
      x_address=(x<<1)+1;
      y_address=(y<<3)+i;
      LCD_write_data(x_address,y_address,*disp++);
      }  
    }
   }
/***********************************************************
名稱:LCD_write_word
輸入:x in [1,3],y in [1,14] disp-顯示字符字模組首地址
輸出:無
功能:在LCD指定顯示單元顯示一個中文字符,每個顯示單元默認為
      16*16點陣字體,對128*64點陣LCD,x最多顯示4行,y最多顯
   示16個字符,不允許顯示半個漢字
***********************************************************/
void LCD_write_word(int x,int y,const uchar *disp)
      {
   int i;
   int x_address;
   int y_address;
    if((x<4)&&(y<15))
      {
    for(i=0;i<16;i++)
       {
     x_address=x<<1;
     y_address=(y<<3)+i;
     LCD_write_data(x_address,y_address,*disp++);
     }
    }
      for(i=0;i<16;i++)
       {
     x_address=(x<<1)+1;
     y_address=(y<<3)+i;
     LCD_write_data(x_address,y_address,*disp++);
     } 
   }
/************************************************************
名稱:LCD_write_picture
輸入:x in [1,7] and y in [0,127],x1_length-縱向像素(8的整數倍),
      y1_length-橫向像素(不一定為8的整數倍)
輸出:無
功能:在指定區域顯示指定像素大小的圖片
************************************************************/ 
void LCD_write_picture(int x1,int y1,int x_length,int y_length,const int *pdata)
        {
   int x_address;
   int y_address;
   for(x_address=x1;x_address<=x1+(x_length>>3)-1;x_address++)
       {
     for(y_address=y1;y_address<y1+y_length;y_address++)
        {
      LCD_write_data(x_address,y_address,*pdata);
      }
    }
   }  
/**********************************************************
名稱: busy
輸入:無
輸出:忙狀態返回1,空閒狀態返回0;
功能:判別LCD控制器內部狀態,忙時返回1,閑時返回0
**********************************************************/  
uchar busy(void)
      {
   RS_COMM;
   RW_READ;
   if(BIT(7)==0)
      {
    return 0;
    }
    else
       return 1;  
    } 
/***************************************************************
名稱:12864測試
功能:逐點掃描
****************************************************************/ 
void LCD_test()
     {
   uchar i,j;
  for(i=0;i<63;i++)
      {
   for(j=0;j<127;j++)
      {
     delayms(20);
     LCD_write_dot(i,j);
     delayms(100);
    }
    }
  }  
/**************************************************************
名稱:axis()
輸入:無
輸出:無
功能:標定界面坐標
***************************************************************/ 
void  axis()
     {
   uchar a,b,y,x;
    for(a=0;a<63;a++)                 //y軸坐標及分位點;
       {
     LCD_write_data(a,29,0x01);
     }
  for(b=0;b<127;b+=5)              //x軸坐標及分位點;
      {
         LCD_write_data(30,b,0x04);
   
      }
   }
/**********************************************************   
/********************************************************
名稱:定時器0初始化
輸入:
輸出:
描述:普通方式,中斷工作方式,注意中斷響應程序中要重裝初值
*********************************************************/
void timer0_init()
      {
    SFIOR|=BIT(0);                        //復位預定比例分頻器;
    TCCR0|=(BIT(2)|BIT(0));               //設定分頻器為1024分頻;
    //TCCR0|=BIT(0);                      //設定分頻器為無分頻;
    TCNT0=255;                            //裝訂計數初值
    TIMSK|=BIT(0);                        //開啟T/C0中斷;
    SEI();                                //開總中斷;   
   
    DDRC|=BIT(0);
    PORTC|=BIT(0);      
    }
/************************************************************
中斷處理函數
************************************************************/ 
#pragma interrupt_handler time0_proc:10
void time0_proc()
      {
    TIMSK&=~BIT(0);                     //關閉中斷;
    TCNT0=255;                          //重新裝訂計數初值;
    PORTC^=BIT(0);
    TIMSK|=BIT(0);                      //開啟T0中斷
   }
  
/*************************************************************
名稱:6位數碼管按鍵位移顯示
輸入:無
輸出:無
描述:按鍵輸入時在LED上移位顯示按鍵值,當按下f時,全部清零。
**************************************************************/
void keymovedis()
       {  
      uchar keyval1,keyval2,presstimes;
   while(1)
      {
     if(keyscan()==15)              //F的鍵值為15;
        {
       for(presstimes=0;presstimes<5;presstimes++)
          {
        dispbuf[presstimes]=date[0];
        show(0,presstimes);
           } 
      }
      else
         {
        for(presstimes=0;presstimes<5;presstimes++)
         {
      
       dispbuf[5-presstimes]=dispbuf[4-presstimes];
       dispbuf[0]=keyscan();
       show(dispbuf[presstimes],presstimes);
      
       }
      }  
    }
  
     }
/*********************************************************
主函數main().c,地球人都知道,不必廢話
**********************************************************/ 
void main()
    {
 
  while(1)
    {
    
  
     }
 
   
    
     }
 
關閉窗口

相關文章

欧美午夜激情小视频| 一区二区三区久久久久| 特级黄色录像片| 久久av一区二区三区亚洲| 成人免费自拍视频| 国产精品欧美日韩一区二区| 在线观看xxx| 精品日本12videosex| 欧美三级黄色大片| 国产精品熟妇一区二区三区四区| 国产三级精品三级在线| 不用播放器的免费av| 加勒比av中文字幕| 青青草精品在线| 亚洲日本久久久| 草草影院第一页| 国产伦理片在线观看| 日韩精品久久久久久久的张开腿让| 加勒比一区二区| 超碰人人干人人| 婷婷伊人五月天| 国产污污视频在线观看| 天堂网av手机版| 91高潮大合集爽到抽搐| 黄色av网址在线| 色中文字幕在线| 四虎国产成人免费观看| 日日爱夜夜操| 曰韩少妇与小伙激情| 九色视频网站在线观看| 免费av网站在线观看| 极品在线视频| 欧美久久亚洲| 精品欧美久久| 日韩制服丝袜av| 不卡视频免费播放| 亚洲私人影院在线观看| 色偷偷88欧美精品久久久| 欧美一区二区福利在线| 在线播放日韩av| 992tv在线成人免费观看| 国产精品丝袜高跟| 日本精品二区| 亚洲国产精品毛片av不卡在线| wwwwwxxxx日本| 不卡一卡2卡3卡4卡精品在| 豆国产97在线| 亚洲国产一二三精品无码| 中文字幕av专区| 国产精品无码一区二区三区免费| 国精产品久拍自产在线网站| 看黄色一级大片| 亚洲人成电影院在线观看| 色一色在线观看视频网站| 国产国产国产国产国产国产| 成全电影播放在线观看国语| 性国裸体高清亚洲| 第一区第二区在线| 亚洲国产婷婷| av电影在线观看一区| 亚洲一区二区三区精品在线| 日韩三级av在线播放| 久久久精品久久久| 亚洲一区二区三区四区在线播放| 久久免费视频2| 亚洲免费在线播放视频| 日韩黄色免费观看| 亚洲精品字幕在线观看| 黄色的毛片免费| 国产高清在线看| 日本精品裸体写真集在线观看| 九九久久电影| 精品一区二区三区欧美| 亚洲伊人色欲综合网| 亚洲第一中文字幕| 国产成人精品日本亚洲| 曰韩不卡视频| 午夜剧场免费看| 天天射天天干天天| 成人午夜国产福到在线| 91九色porny在线| 国产三级电影在线播放| 精品一区在线| 国产黄色91视频| 疯狂做受xxxx高潮欧美日本| 色婷婷av一区二区三区久久| 亚洲在线视频观看| 黄色a级片免费| 亚洲成人生活片| 美女视频一区二区三区在线| 草久在线视频| 婷婷久久综合九色综合99蜜桃| 欧美午夜不卡| 国产精品久久久久久久久搜平片| 精品国产免费视频| 成人黄色免费网站在线观看| 两根大肉大捧一进一出好爽视频| 国产精品69久久久久孕妇欧美| 午夜国产在线视频| 在线观看国产福利视频| www.久久爱.com| 青青草成人在线观看| 欧美日韩免费区域视频在线观看| 一区二区三区国产在线观看| 日韩一区二区三区观看| 日本国产高清不卡| 国产手机免费视频| 国产一区二区精彩视频| 国产中文伊人| 麻豆传媒在线免费| 清纯唯美日韩| 国产农村妇女毛片精品久久麻豆 | 狠狠色丁香婷婷综合| 精品国产精品三级精品av网址| 久久精品国产69国产精品亚洲| 麻豆av一区| 国产中文字幕一区二区| 欧美一级一区二区三区| 完全免费av在线播放| 精品三级av在线导航| 成人91在线观看| 亚洲成人久久一区| 精品不卡一区二区三区| 黄色录像a级片| 成人综合社区| 国产黄色在线免费观看| 羞羞色午夜精品一区二区三区| 中文av一区特黄| 美女福利视频一区| 国产免费黄色一级片| 青青国产在线观看| 白虎精品一区| 免费看成人哺乳视频网站| 97精品久久久午夜一区二区三区| 精品小视频在线| 日产精品一线二线三线芒果| 天美传媒免费在线观看| 秋霞午夜剧场| 国产极品一区| 国产在线一区二区| 日韩极品精品视频免费观看| 视频一区视频二区视频| 国产高潮流白浆| 成人禁在线观看网站| 免费欧美网站| 久久精品视频一区二区| 欧美刺激性大交免费视频| 精品人妻一区二区三区四区在线 | 青青草原在线免费观看| 黄色动漫在线免费观看| jizz18欧美18| 国产精品视频免费| 高清视频欧美一级| 亚洲综合婷婷久久| √天堂资源中文www| 日本三级一区| 国产成人在线视频网址| 一区二区三区四区在线观看视频| 中文字幕色呦呦| 五月婷婷六月婷婷| wwwxxx在线观看| 亚洲区一区二| 日本不卡一二三区黄网| 欧美一二三四区在线| 久久亚洲高清| 日韩免费视频网站| 在线国产一区二区三区| 亚洲天天影视网| 欧美日韩午夜影院| 视频一区亚洲| 欧美日韩在线视频播放| 欧美一区二区三区| 丝袜亚洲另类欧美| 亚洲女在线观看| 草b视频在线观看| 老牛影视av牛牛影视av| 欧美xxx视频| 久久久午夜精品理论片中文字幕| 久久久在线免费观看| 星空大象在线观看免费播放| 黑巨茎大战欧洲金发美女| 无码少妇一区二区三区| 欧美性猛交xxxx黑人| 久久久久久久久久久久久久一区| 欧美三级韩国三级日本三斤在线观看| 青青久草在线| 日韩精品乱码av一区二区| 国产亚洲欧美日韩美女| 一级在线免费视频| 国产麻豆永久视频| 秋霞在线一区| 在线精品视频免费观看| 亚洲精品在线观看免费| 国产男女猛烈无遮挡| 天堂√8在线中文| 国产欧美综合在线观看第十页| 国产精品色午夜在线观看| 97在线观看免费高| 黄色在线播放| 国产美女在线精品| 欧美亚洲第一区| 性猛交娇小69hd| 中文字幕在线视频网| 日本不卡一区二区三区| 欧美人成在线视频| 亚洲天堂视频一区| 视频一区二区在线播放| 久久精品国产99| 久久全国免费视频| 蜜桃av.com| 麻豆tv在线| 2017欧美狠狠色| 99国产在线| 亚洲午夜精品久久久| 国产另类xxxxhd高清| 亚洲乱码国产乱码精品精的特点 | 国产探花精品一区二区| 亚洲人免费短视频| 亚洲.国产.中文慕字在线| 亚洲国产高清国产精品| 亚洲伦理在线观看| 九色视频入口| 国内精品久久久久久久97牛牛| 亚洲精品一区久久久久久| 伊人五月天婷婷| 国产视频三区| 蜜桃91丨九色丨蝌蚪91桃色| 欧洲午夜精品久久久| 欧美交换国产一区内射| 中文在线字幕免费观看| 国产女人水真多18毛片18精品视频| 国产激情一区二区三区在线观看 | 伊人久久大香线蕉精品组织观看| 日韩成人在线免费观看| 性鲍视频在线观看| 黑料吃瓜在线观看| 国产很黄免费观看久久| 91亚洲精品视频| 中文字幕视频一区二区| 久久综合偷偷噜噜噜色| 91精品国产欧美一区二区18| 手机看片一级片| 成人在线小说| 99这里只有精品| 久久国产精品一区二区三区| 天堂网在线播放| 成人激情免费视频| 色偷偷av一区二区三区| 永久av免费网站| 女人高潮被爽到呻吟在线观看| 洋洋成人永久网站入口| 久久亚洲国产成人精品无码区| 国产成人禁片在线观看| 国产农村妇女毛片精品久久莱园子| 51精品在线观看| 久久久久亚洲视频| 粉嫩的18在线观看极品精品| 日韩精品在线免费播放| 超薄肉色丝袜一二三| 17videosex性欧美| 色呦呦日韩精品| 超碰中文字幕在线观看| porn亚洲| 亚洲图片有声小说| 北条麻妃视频在线| 中文字幕视频免费在线观看| 国产亚洲欧美日韩日本| av不卡在线免费观看| h视频免费网站| 丰满少妇久久久久久久| 欧美日韩精品免费在线观看视频| 欧美午夜春性猛交xxxx| 国产精品日本欧美一区二区三区| 国产精品成人aaaaa网站| 不卡视频免费在线观看| 天天做天天爱天天综合网2021| 国内外成人免费激情在线视频| 中文字幕乱码人妻无码久久| 西野翔中文久久精品国产| 久久精品国产欧美亚洲人人爽| 影音先锋亚洲天堂| 日本亚洲不卡| 欧美成人全部免费| 中文字幕人妻一区二区在线视频 | 久久久久久国产精品| 天天干天天干天天干天天| 久久亚洲道色| 久热爱精品视频线路一| 国产美女www爽爽爽| 欧美电影《轻佻寡妇》| 秋霞av国产精品一区| 国产欧美久久久| 欧美日韩蜜桃| 91九色在线视频| 精品国产福利一区二区在线 | 热久久99这里有精品| www.国产免费| 国产一区清纯| 亚洲自拍在线观看| 国产偷窥老熟盗摄视频| 国产综合色产在线精品| 亚洲国产高清国产精品| www99avcom| 亚洲天堂免费看| 一级日本黄色片| 亚洲天堂av在线| 亚洲精品黄网在线观看| 日本熟妇一区二区| 成人毛片免费看| 国产精品视频精品| 精品入口麻豆传煤| 岛国精品在线播放| 欧美精品久久久久久久久久久| 黄视频在线观看免费| 欧美亚洲免费在线一区| 大胸美女被爆操| 成人性生交大片免费看96| 久久人人爽国产| 性欧美高清强烈性视频| 成人免费不卡视频| 国产乱子夫妻xx黑人xyx真爽| 免费在线视频欧美| 欧美大黄免费观看| 自拍偷拍欧美亚洲| 欧美极品一区二区三区| 国产在线精品一区二区三区| eeuss鲁片一区| 亚洲成a人片在线观看中文| 成人免费av片| 大奶在线精品| 国产精品都在这里| 色视频线观看在线播放| 国产欧美日韩久久| 人妻体体内射精一区二区| 3d欧美精品动漫xxxx无尽| 超碰日本道色综合久久综合| 无码精品视频一区二区三区| 国产黄色成人av| 搡女人真爽免费午夜网站| 成人动漫一区| 色综合男人天堂| 欧美性xxxx交| 国产精品丝袜一区| 欧美无人区码suv| 欧美自拍视频| 91免费精品视频| 成人黄色电影在线| 日本电影亚洲天堂一区| 久久视频免费看| 在线观看一区| 粉嫩av一区二区三区天美传媒| av在线中文| 精品视频—区二区三区免费| av加勒比在线| 国产成人综合自拍| 伊人免费视频二| 视频一区日韩精品| 国产欧美日韩精品丝袜高跟鞋| eeuss网址直达入口| 黑人狂躁日本妞一区二区三区| 欧美日韩一级大片| 亚洲天堂偷拍| 亚洲天堂第一区| av在线加勒比| 97色在线视频观看| www.eeuss影院| 色哟哟一区二区在线观看| 国产区在线观看视频| 视频一区二区欧美| 精品久久久久久久免费人妻| 欧美123区| 国产精品av在线播放| 91.·福利| 日韩欧美亚洲另类制服综合在线 | 国产成人无码一区二区在线播放| 国产亚洲午夜| 男人靠女人免费视频网站| 成人免费视频观看| 成人激情视频在线观看| 少妇精品放荡导航| 日韩精品在线免费| 欧美三级又粗又硬| 亚洲大片精品永久免费| 黄色在线观看国产| 国产精品一区久久久久| 欧美激情一区二区三区p站| 亚洲精品无吗| 亚洲欧美丝袜| 欧美aa在线| 国产日产欧美精品| 色天堂在线视频| 色偷偷噜噜噜亚洲男人的天堂| 91九蝌蚪视频| 欧美视频中文一区二区三区在线观看| 在线观看免费视频a| 91麻豆精品一区二区三区| 亚洲精品国产精品国自| 久久午夜激情| 丰满人妻一区二区三区大胸| 日韩www.|