AVRmega16基本程序_第1頁
AVRmega16基本程序_第2頁
AVRmega16基本程序_第3頁
AVRmega16基本程序_第4頁
AVRmega16基本程序_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、MCU:外部晶振:ATmega168MHz程序功能:4*4鍵盤識別,LED七段數(shù)碼管顯示,密碼功能模塊,直流電機正反轉(zhuǎn)控制AD 轉(zhuǎn)換模塊 , 模擬比較器 , 外部中斷應用,12864液晶 ,C/T0硬件設計:參考PROTUES硬件仿真電路調(diào)試:所有程序主要功能都軟硬件仿真通過,實際使用時要根據(jù)需要加入可靠性。編譯環(huán)境:ICC AVRDesign by:wdw*#include#include #include #define uchar unsigned char #define uint unsigned int將寄存器a的第b位置1/將寄存器a的第b位清0#define SET_1(a,b

2、) a|=bit(b)#define CLR_0(a,b) a&=bit(b) #program date code:const date=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,/ 共陽數(shù)據(jù)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位密碼

3、緩存 ;名稱:ms延時子函數(shù)功能:延時指定的 ms*void delayms(int ms)int i,j;for(i=ms;i0;i-)/8M 時改為 1141;/12M 時為 1722; for(j=1722;j0;j-);名稱:us延時子程序功能:延時指定的 us * void delayus(uchar us)for(us;us0;us-); /12M時單位T為1.45US/* 單參數(shù) LED 顯示硬件連接:數(shù)據(jù) PORTCD7D0段選 PORTDD7D4* void LEDShow(long int shownum)uchar i,tmp,curnum;long int tmpnum

4、;tmp = 0xfb;tmpnum = shownum; for(i=0;i6;i+)curnum = tmpnum % 10; tmpnum = tmpnum / 10; PORTD = tmp;PORTC = datecurnum; delayus(1);/ 顯示的位數(shù)為 5/ 補上移位造成的最右位為 0;tmp = (tmp 1) + 0x01; 硬件連接:PC 口複用控制段選和位選,有2片573進行數(shù)據(jù)鎖存;名稱:七段 LED 共陽數(shù)碼管 ,在指定數(shù)位上顯示指定的數(shù),雙參數(shù) 功能:在指定的位置上顯示制定的數(shù) ;*void show(uchar dat,uchar num)PORTC=

5、datedat;PORTD|=BIT(0);PORTD&=BIT(0);delayus(2);/六位七段數(shù)碼管顯示程序 OK ;/送數(shù)據(jù);PORTC=0X00;delayus(1);PORTC=duannum;PORTD|=BIT(1);delayus(2);PORTD&=BIT(1);delayus(2); /* 名稱: MCU 端口初始化功能:設置 MCU 端口初始方向為輸出初始狀態(tài)為低/送選通信號*void Gpioinit0()DDRA=0XFF;PORTA=0X00;DDRB=0XFF;PORTB=0X00;DDRC=0XFF;PORTC=0X00;DDRD=0XFF;PORTD=0

6、X00;/* 名稱: MCU 端口初始化功能:設置 MCU 端口初始為輸出初始狀態(tài)為高 * void Gpioinit1()DDRA=0Xff;PORTA=0XFF;DDRB=0xff;PORTB=0XFF;DDRC=0xff;PORTC=0XFF;DDRD=0xff;PORTD=0XFF;/* 名稱:單端口測試輸入:測試PC的任意端口號07功能:週期改變一個端口的電平*/void IOtest(uchar num)DDRC|=BIT(num);/ while(1)/ PORTC|=BIT(num);delayms(50);PORTC&=BIT(num);delayms(50);/ /* 名稱

7、:按鍵動作檢測子程序。功能:檢測 4*4鍵盤是否有鍵按下 ;硬件連接:PBOPB3為行;PB4pb7為列;*/uchar key_press()uchar key;DDRB=0XFF;PORTB=0X0F;/此處要加上適當延時否則讀不到端口信息/按下返回 1,否則為 0;DDRB=0XF0; delayms(2); key=PINB; key&=0x0f;if(key=0x0f) return 0; else return 1;/*名稱: 4*4 矩陣按鍵掃描子程序功能:掃描一個 4*4 矩陣案件,比返回相應按鍵值硬件連接:PBOPB3為行;PB4pb7為列;*/uchar keyscan()

8、uchar keycode,keynum;dowhile(key_press()=0);asm(nop);asm(nop);while(key_press()=1)DDRB=0XFF;PORTB=0X0F;DDRB=0XF0;delayus(10);keycode=PINB;/4*4鍵盤掃面程序,調(diào)試 0K;/按鍵是否按下?/PBOPB3為歹列, PB4PB7為行/列輸出高電平,行輸出低電平/延時 2毫秒,讀列狀態(tài) ;keycode&=0x0f;/讀列狀態(tài),屏蔽行狀態(tài)DDRB=0XFF;PORTB=0XF0;DDRB=0X0F;delayus(10);PINB&=0Xf0;/讀行狀態(tài),屏蔽列狀

9、態(tài) 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:

10、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;*名稱:六位密碼輸入比對程序功能:輸入六位數(shù)並與存儲密碼比對,0K返回1按錯或者順序錯返回 0;原始

11、密碼 6543210K;*uchar securtcom()uchar keycount=0;while(key_press()=1);delayms(3);dowhile(key_press()=1);delayms(1);while(key_press()=0);show(8,keycount);securbufkeycount+=keyscan(); while(keycount0;count-) adaver=ad_conv(); adaver+=adaver; delayms(1); adaver=adaver/8; delayms(1); return adaver; /* 名稱:

12、 AD 採樣功能:採樣ADO的電壓,內(nèi)部2.56V參考電壓,中斷工作方式*/ void adO_init()ADMUX=OxcO; adchannel=O; ADCSRA=Ox98; DDRA&=BIT(O); PORTA&=BIT(O); SEI();#pragma interrupt_handler process:15 /interrupt process program void process()int adcode=O;ADCSRA&=BIT(ADIE); adcode=ADCL; adcode=(ADCH8)+adcode; /get adc value /*中斷處理函數(shù)*/AD

13、CSRA|=BIT(ADIE);/*名稱: DACO832 DA 轉(zhuǎn)換輸入:有效分度 O255輸出:無功能:對8為數(shù)字信號進行DA轉(zhuǎn)換,實際應用需調(diào)試*/ #define cs_low PORTD&=BIT(O)#define cs_high PORTD|=BIT(O)#define wr1_low PORTD&=BIT(1)#define wr1_high PORTD|=BIT(1)#define ile_high#define ile_low#define wr2_lowPORTD|=BIT(2)PORTD&=BIT(2)PORTD&=BIT(3)#define wr2_high#defi

14、ne xfer_lowPORTD|=BIT(3)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;/*名稱: 數(shù)據(jù)拆分顯示函數(shù) 功能: 將四位數(shù)據(jù)分別顯示到對

15、應的數(shù)碼管。 */ void addisplay(int addat)/ 轉(zhuǎn)換數(shù)據(jù)顯示 ,運算 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);/* 名稱:SP通信功能:應用mega16自身SPI通信模塊與外設進行通信 .查詢方式 *void SPI_masterinit()DDRB|=BIT(5)|BIT(7);DDRB&=(BIT(4)&BIT(6);/設置MOSI與SCK為輸岀設

16、置MISO與SS為輸入SPCR|=BIT(4)|BIT(3)|BIT(1)|BIT(0); / 數(shù)據(jù)高位先發(fā)送,主機模式,空閒時鐘極性SPCR|=BIT(6);為高,SCK起始沿採樣數(shù)據(jù),128分頻/使能 SPIdelayms(1);void SPI_mastertransdata(uchar data)SPDR=data; while(!(SPSR&BIT(7);void SPI_slaveinit()void SPI_slaverecive()/* 名稱:比較匹配模式 , 中斷方式,調(diào)試 OK 功能:AVR比較匹配模式應用,當AIN大於AIN1時,上升沿產(chǎn)生中斷 */void _inti(

17、)SEI();DDRB&=(BIT(2)&(BIT(3);SFIOR&=BIT(3);ACSR&=BIT(7);ACSR&=BIT(6);ACSR|=BIT(3);ACSR|=(BIT(1)|BIT(0);/開總中斷 ;/設置PB2/3口為輸入;/設置 AIN1 為模擬比較器反向輸入端 ;/使能模擬比較器,注意此處為低電平有效/設置 AIN0 為正極輸入端 ;/使能模擬比較器中斷 ; /比較器上升沿觸發(fā)中斷 ;#pragma interrupt_handler comp:17 void comp()ACSR&=BIT(3);/*此處加中斷處理函數(shù)/注意函數(shù)名後不加();/模擬比較器中斷服務程序

18、*ACSR|=BIT(3);名稱:外部中斷 INT0 調(diào)試 OK功能:低電平觸發(fā) INT0 端口引起中斷,並響應相關中斷服務程序*void int0_init()DDRD&=BIT(2);MCUCR&=(BIT(0)&(BIT(0);GICR|=BIT(6);SEI();/PD2/INT0 端口配置為輸入 /INT0 觸發(fā)方式為低電平 ; / 使能外部中斷 0; /開總中斷 ;#pragma interrupt_handler int0:2 void int0()GICR&=BIT(6);/*/INT0 中斷服務函數(shù)/關閉外部 INT0;此處加 INT0 中斷處理函數(shù)*/GICR|=BIT(6

19、); /* 名稱:外部中斷 INT1, 功能:邊沿觸發(fā)INTO端口引起中斷,並響應相關中斷服務程序 */開啟外部 INT0;void int1_init()DDRD&=BIT(3);PORTD&=BIT(3);MCUCR|=(BIT(3)|BIT(2);GICR|=BIT(7);SEI();#pragma interrupt_handler int1:3 void int1()GICR&=BIT(7);/*/將PD3 口配置為輸入; pd3 口初始值為0;/INT1 上升沿觸發(fā)中斷 ;/使能INT1中斷;/開總中斷 ;/關閉INT1中斷;此處加 INT1 中斷服務函數(shù) ;*/GICR|=BIT

20、(7);/開啟 INT1 中斷 ;#define EN_CLR #define EN_SET #define RW_READ #define RW_WRITE #define RS_COMM #define RS_DATA #define RESET #define RESET_OVER #define CS1_EN #define CS1_DIS #define CS2_EN #define CS2_DISPORTD&=BIT(0)PORTD|=BIT(0)PORTD|=BIT(1)PORTD&=BIT(1)PORTD&=BIT(2)PORTD|=BIT(2)PORTD&=BIT(3)POR

21、TD|=BIT(3)PORTD&=BIT(4)PORTD|=BIT(4)PORTD&=BIT(5)PORTD|=BIT(5)/使能 12864/關閉 12864/讀操作/寫操作/命令操作/數(shù)據(jù)操作/12864液晶複位/12864液晶結(jié)束複位 ;使能CS1,選擇左半屏幕/禁止 CS1使能CS2,選擇右半屏幕/禁止 CS2/*名稱:12864 ( ks0108)顯示應用功能:圖形液晶使用*#define basic_0x30#define explo_0xc4#define show_stitude0x0f#define cleanscreen0x01#define cursor0x07#defi

22、ne AC_00x03const int char_0816=/一次送 8BIT 數(shù)據(jù),基本指令集 ; /擴展指令集/顯示狀態(tài),整體顯示 ,游標開 ,游標位置開 /顯示清零,AC歸零/寫入/讀取時 ,游標右移,畫面左移/AC歸0,不改變DDRAM容0xe0,0x18,0x04,0x04,0x04,0x18,0xe0,0x00,0x07,0x18,0x20,0x20,0x20,0x18,0x07,0x00 ;/*名稱: MCU 端口初始化功能:設置 MCU 端口初始方向以及狀態(tài)*void GPIO_INIT()DDRA=0XFF;PORTA=0X00;DDRB=0XFF;PORTA=0X00;D

23、DRC=0XFF;PORTA=0X00;DDRD=0XFF;PORTA=0X00;/* 名稱:輸入數(shù)據(jù)功能: MCU 將數(shù)據(jù)送到總線 * 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

24、_CLR; /* 名稱:LCD顯示起始行設定功能:設置LCD顯示起始行位置,startline範圍063 */ void LCD_Command_setstartline(uchar startline)RW_WRITE;RS_COMM;EN_CLR;SET_DATA(0Xc0 + startline); /12864行地址為 063之間設定 ;EN_SET;delayus(2);EN_CLR; /* 名稱:設置顯示行頁地址功能:設置顯示行頁地址,12864為 07*/ void LCD_Command_set_x(uchar x)RW_WRITE;RS_COMM;EN_CLR;SET_DAT

25、A(0xB8+x);II設置 12864行頁地址x範圍 07;EN_SET;delayus(2);EN_CLR; I*名稱:設置顯示列地址功能:設置顯示列地址 y,範圍063;*void LCD_Command_set_y(uchar column) RW_WRITE; RS_COMM; EN_CLR;SET_DATA(0x40+column);設置顯示列地址y,範圍063;EN_SET;delayus(2);EN_CLR; /* 名稱: LCD 顯示數(shù)據(jù)寫入 功能:將顯示數(shù)據(jù)寫入 12864液晶 */ void LCD_Command_writebyte(uchar data)RW_WRIT

26、E;RS_DATA;EN_CLR;SET_DATA(data);EN_SET; delayus(2);EN_CLR; /* 名稱: LCD 複位操作 功能:複位 LCD */ void LCD_RESET()RESET; NOP(); NOP(); NOP(); RESET_OVER; /* 名稱:清除指定範圍函數(shù) 功能:清除 LCD 屏幕指定範圍起始行 結(jié)束行的顯示內(nèi)容 */ void LCD_CLEAR_LINE(uchar startline,uchar endline)uchar i,j; for(i-startline;i=endline;i+)/y 地址每次操作後自動加 1; CS

27、1_EN; CS2_EN; LCD_Command_set_x(i); LCD_Command_set_y(0);for(j=0;j64;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 輸出:無

28、功能:在 LCD 指定行列寫一個數(shù)據(jù) */ void LCD_write_data(uchar x,uchar y,uchar data)if(y64)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 輸出:無 功

29、能:在指定像素位置描點,此函數(shù)為覆蓋式描點,原位置一個字節(jié)數(shù)據(jù)被覆蓋 */ void LCD_write_dot(uchar x,uchar y)uchar x_address,y_address;uchar data=0;if(x64)&(y3;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- 顯示字符自模數(shù)組首地址 輸出:無功能:在 LCD 指定顯示單元顯示一個字符,每個顯示單元默認為 8*16 點陣字體,對12864點陣

30、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(x4)&(y16)for(i=0;i8;i+)x_address=x1;y_address=(y3)+i;LCD_write_data(x_address,y_address,*disp+);for(i=0;i8;i+)x_address=(x1)+1;y_address=(y3)+i;LCD_write_data(x_address,y_addres

31、s,*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(x4)&(y15)for(i=0;i16;i+)x_address=x1;y_address=(y3

32、)+i;LCD_write_data(x_address,y_address,*disp+);for(i=0;i16;i+)x_address=(x1)+1;y_address=(y3)+i;LCD_write_data(x_address,y_address,*disp+);/*名稱: LCD_write_picture輸入: x in 1,7 and y in 0,127,x1_length- 縱向像素( 8的整數(shù)倍), y1en gth-橫向像素(不一定為 8的整數(shù)倍)輸出:無 功能:在指定區(qū)域顯示指定像素大小的圖片 */ void LCD_write_picture(int x1,in

33、t y1,int x_length,int y_length,const int *pdata)int x_address;int y_address;for(x_address=x1;x_address3)-1;x_address+) for(y_address=y1;y_addressy1+y_length;y_address+) LCD_write_data(x_address,y_address,*pdata);/*名稱: busy 輸入:無 輸出:忙狀態(tài)返回 1 ,空閒狀態(tài)返回 0;功能:判別LCD控制器內(nèi)部狀態(tài),忙時返回1,閑時返回0*/ uchar busy(void)RS_COMM;RW_READ;if(BIT(7)=0)return 0;elsereturn

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論