1、DS18B20温度检测芯片(单总线方式实现)
2、1路A/D(电位器模拟实现)
3、DS1302实时时钟
4、1路串口(max3232实现)
5、3*3点阵键盘
5路流水灯简介
由图可知要想点亮对应的LDE的话,I/O口需输出一个低电平
5路流水灯实验程序如下:
#define ALL_ON {PORTA&=0X1F;ORTC&=0XFC;}
#define ALL_OFF {PORTA|=~0X1F;ORTC|=~0XFC;}
#define LED1_ON PORTA&=0XDF
#define LED2_ON PORTA&=0XBF
#define LED3_ON PORTA&=0X7F
#define LED4_ON PORTC&=0XFD
#define LED5_ON PORTC&=0XFE
#define LED1_OFF PORTA|=~0XDF
#define LED2_OFF PORTA|=~0XBF
#define LED3_OFF PORTA|=~0X7F
#define LED4_OFF PORTC|=~0XFD
#define LED5_OFF PORTC|=~0XFE
void Gpio_Init(void)
{
DDRA|=0XE0;
PORTA&=0X1F;
DDRC|=0X03;
PORTC&=0XFC;
}
void led (void)
{
LED1_ON;
delay_nms(200);
LED2_ON;
delay_nms(200);
LED3_ON;
delay_nms(200);
LED4_ON;
delay_nms(200);
LED5_ON;
delay_nms(200);
LED1_OFF;
delay_nms(200);
LED2_OFF;
delay_nms(200);
LED3_OFF;
delay_nms(200);
LED4_OFF;
delay_nms(200);
LED5_OFF;
delay_nms(200);
}
具体的实现方法我将在下面的软件代码里说明:
#define GET_L1 !(PINC&0X04)
#define GET_L2 !(PINC&0X08)
#define GET_L3 !(PINC&0X10)
#define GETS GET_L1|GET_L2|GET_L3
void delay_nms(int a);
int GET_S1=0,GET_S2=0,GET_S3=0,GET_S4=0,GET_S5=0,GET_S6=0,GET_S7=0,GET_S8=0,GET_S9=0;
void GETS_INIT(void)
{
GET_S1=0;
GET_S2=0;
GET_S3=0;
GET_S4=0;
GET_S5=0;
GET_S6=0;
GET_S7=0;
GET_S8=0;
GET_S9=0;
}
void key(void)
{
PORTC&=0X1F; //设置输出PC5,6,7为低
if(GETS)
delay_nms(5);
if(GETS) //如果输入时PC2,3,4为低,即有按键被按下
{
if(GET_L1) //如果输入时PC3为低,即第二列有按键被按下
{
PORTC|=0XC0;
PORTC&=0XDF; //设置输出PC5为低,PC6,7为高
if(GET_L1)
{
GET_S1=1; //S4键按下
}
else if(!GET_L2)
{
PORTC&=0X1F;
PORTC|=0XA0;
PORTC&=0XBF; //设置PC6低,PC5,7为高
if(GET_L1)
{
GET_S2=1; //S5键按下了
}
else if(!GET_L1)
{
GET_S3=1; //S6键按下了
}
}
}
if(GET_L2) //如果输入时PC3为低,即第二列有按键被按下
{
PORTC|=0XC0;
PORTC&=0XDF; //设置输出PC5为低,PC6,7为高
if(GET_L2)
{
GET_S4=1; //S4键按下
}
else if(!GET_L2)
{
PORTC&=0X1F;
PORTC|=0XA0;
PORTC&=0XBF; //设置PC6低,PC5,7为高
if(GET_L2)
{
GET_S5=1; //S5键按下了
}
else if(!GET_L2)
{
GET_S6=1; //S6键按下了
}
}
}
if(GET_L3) //如果输入时PC4为低,即第三列有按键被按下
{
PORTC|=0XC0;
PORTC&=0XDF; //设置输出PC5为低,PC6,7为高
if(GET_L3)
{
GET_S7=1; //S7键按下
}
else if(!GET_L3)
{
PORTC&=0X1F;
PORTC|=0XA0;
PORTC&=0XBF; //设置PC6低,PC5,7为高
if(GET_L3)
{
GET_S8=1; //S8键按下了
}
else if(!GET_L3)
{
GET_S9=1; //S9键按下了
}
}
}
}
}
欢迎光临 珩源工控论坛 (http://bbs.hymcu.com/) | Powered by Discuz! 7.2 |