新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Atmega16單片機(jī)實(shí)用程序

Atmega16單片機(jī)實(shí)用程序

作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
/*********************************************************************
MCU: ATmega16
外部晶振: 8MHz
程序功能: 4*4鍵盤識(shí)別,LED七段數(shù)碼管顯示,密碼功能模塊,直流電機(jī)正反轉(zhuǎn)控制
AD轉(zhuǎn)換模塊, 模擬比較器,外部中斷應(yīng)用,12864液晶,C/T0
硬件設(shè)計(jì): 參考PROTUES硬件仿真電路
調(diào)試: 所有程序主要功能都軟硬件仿真通過,實(shí)際使用時(shí)要根據(jù)需要加入可靠性。
編譯環(huán)境: ICC AVR
Design by: wdw
********************************************************************/
#include
#include
#include
#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,//共陽(yáng)數(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位密碼緩存;
/********************************************************************
名稱:ms延時(shí)子函數(shù)
功能:延時(shí)指定的ms
*********************************************************************/
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
{
for(j=1722;j>0;j--); //8M時(shí)改為1141;
} //12M時(shí)為1722;
}
/*******************************************************************
名稱:us延時(shí)子程序
功能:延時(shí)指定的us
********************************************************************/
void delayus(uchar us)
{
for(us;us<0;us--);
{
} //12M時(shí)單位T為1.45US
}
/********************************************************************
單參數(shù)LED 顯示
硬件連接:數(shù)據(jù)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++) //顯示的位數(shù)為5
{
curnum = tmpnum % 10;
tmpnum = tmpnum / 10;
PORTD = tmp;
PORTC = date[curnum];
delayus(1);
tmp = (tmp << 1) + 0x01; //補(bǔ)上移位造成的最右位為0;
}
}
/*******************************************************
名稱:七段LED共陽(yáng)數(shù)碼管,在指定數(shù)位上顯示指定的數(shù),雙參數(shù)
功能:在指定的位置上顯示制定的數(shù);
硬件連接:PC口複用控制段選和位選,有2片573進(jìn)行數(shù)據(jù)鎖存;
*******************************************************/
void show(uchar dat,uchar num) //六位七段數(shù)碼管顯示程序OK;
{
PORTC=date[dat];
PORTD|=BIT(0);
PORTD&=~BIT(0); //送數(shù)據(jù);
delayus(2);
PORTC=0X00;
delayus(1);
PORTC=duan[num];
PORTD|=BIT(1);
delayus(2);
PORTD&=~BIT(1);
delayus(2);
} //送選通信號(hào);
/************************************************************
名稱:MCU端口初始化
功能:設(shè)置MCU端口初始方向?yàn)檩敵龀跏紶顟B(tài)為低
*************************************************************/
void Gpioinit0()
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0X00;
DDRC=0XFF;
PORTC=0X00;
DDRD=0XFF;
PORTD=0X00;
}
/***********************************************************
名稱:MCU端口初始化
功能:設(shè)置MCU端口初始為輸出初始狀態(tài)為高
************************************************************/
void Gpioinit1()
{
DDRA=0Xff;
PORTA=0XFF;
DDRB=0xff;
PORTB=0XFF;
DDRC=0xff;
PORTC=0XFF;
DDRD=0xff;
PORTD=0XFF;
}
/**************************************************
名稱:?jiǎn)味丝跍y(cè)試
輸入:測(cè)試PC的任意端口號(hào)0~7
功能:週期改變一個(gè)端口的電平
**************************************************/
void IOtest(uchar num)
{
DDRC|=BIT(num);
// while(1)
// {
PORTC|=BIT(num);
delayms(50);
PORTC&=~BIT(num);
delayms(50);
// }
}
/*************************************************
名稱:按鍵動(dòng)作檢測(cè)子程序。
功能:檢測(cè)4*4鍵盤是否有鍵按下;
硬件連接:PB0~PB3為行;PB4~pb7為列;
*************************************************/
uchar key_press()
{
uchar key;
DDRB=0XFF;
PORTB=0X0F;
DDRB=0XF0;
delayms(2); //此處要加上適當(dāng)延時(shí)否則讀不到端口信息;
key=PINB;
key&=0x0f; //按下返回1,否則為0;
if(key==0x0f)
{
return 0;
}
else
return 1;
}
/***************************************************
名稱:4*4矩陣按鍵掃描子程序
功能:掃描一個(gè)4*4矩陣案件,比返回相應(yīng)按鍵值;
硬件連接:PB0~PB3為行;PB4~pb7為列;
***************************************************/
uchar keyscan() //4*4鍵盤掃面程序,調(diào)試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); //延時(shí)2毫秒,讀列狀態(tài);
keycode=PINB;
keycode&=0x0f; //讀列狀態(tài),屏蔽行狀態(tài);
DDRB=0XFF;
PORTB=0XF0;
DDRB=0X0F;
delayus(10);
PINB&=0Xf0; //讀行狀態(tài),屏蔽列狀態(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:
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;
}

上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉