Atmega16单片机实用程序
連接: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)
{
PO
Atmega16单片机实用程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)