《AVRmega16基本程序》由会员分享,可在线阅读,更多相关《AVRmega16基本程序(21页珍藏版)》请在金锄头文库上搜索。
1、/* MCU: ATmega16 外部晶振: 8MHz 程序功能: 4*4鍵盤識別,LED七段數碼管顯示,密碼功能模塊,直流電機正反轉控制 AD轉換模塊, 模擬比較器,外部中斷應用,12864液晶,C/T0 硬件設計: 參考PROTUES硬件仿真電路 調試: 所有程序主要功能都軟硬件仿真通過,實際使用時要根據需要加入可靠性。 編譯環境: ICC AVR Design by: wdw */#include#include#include #define uchar unsigned char#define uint unsigned int#define SET_1(a,b) a|=bit(b)
2、 /將寄存器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
3、=0,0,0,0,0,; /5位密碼緩存;/*名稱:ms延時子函數功能:延時指定的ms*/void delayms(int ms) int i,j;for(i=ms;i0;i-) for(j=1722;j0;j-); /8M时改为1141; /12M时为1722; /*名稱:us延時子程序功能:延時指定的us*/void delayus(uchar us) for(us;us0;us-); /12M时单位T为1.45US /*单参数LED 显示硬件连接:数据PORTC-D7D0 段选PORTD-D7D4*/void LEDShow(long int shownum)uchar i,tmp,cu
4、rnum;long int tmpnum;tmp = 0xfb;tmpnum = shownum;for(i=0;i6;i+) /显示的位数为5curnum = tmpnum % 10;tmpnum = tmpnum / 10;PORTD = tmp;PORTC = datecurnum;delayus(1);tmp = (tmp 1) + 0x01; /补上移位造成的最右位为0; /*名稱:七段LED共陽數碼管,在指定数位上显示指定的数,双参数功能:在指定的位置上顯示制定的數;硬件連接:PC口複用控制段選和位選,有2片573進行數據鎖存;*/ void show(uchar dat,ucha
5、r num) /六位七段數碼管顯示程序OK; PORTC=datedat; PORTD|=BIT(0); PORTD&=BIT(0); /送數據; delayus(2); PORTC=0X00; delayus(1); PORTC=duannum; PORTD|=BIT(1); delayus(2); PORTD&=BIT(1); delayus(2); /送選通信號;/*名稱:MCU端口初始化功能:設置MCU端口初始方向為輸出初始狀態為低*/void Gpioinit0() DDRA=0XFF; PORTA=0X00; DDRB=0XFF; PORTB=0X00; DDRC=0XFF; PO
6、RTC=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的任意端口號07功能:週期改變一個端口的電平*/ void IOtest(uchar num) DDRC|=BIT(num); / while(1) / PORTC|=BIT(num); delayms(50
7、); PORTC&=BIT(num); delayms(50); / /*名稱:按鍵動作檢測子程序。功能:檢測4*4鍵盤是否有鍵按下;硬件連接:PB0PB3為行;PB4pb7為列;*/ 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矩陣案件,比返回相應按鍵值; 硬件連接:PB0PB3為行;PB4pb7為列;*/ uchar keyscan() /4*4鍵盤掃面程序,調試0K; uchar keycode,keynum; do while(key_press()=0); /按鍵是否按下? asm(nop); asm(nop); while(key_press()=1) DDRB=0XFF; /PB0PB3為列,PB4PB7為行;PORTB=0X0F; /列輸出高電平,行輸出低電平;DDRB=0XF0; delayus(10); /延時2毫秒,讀列狀態;keycode=PINB;keycode&=0x0f;