学习日志 姓名:王宁捷 日期:2018.06.25
今日学习任务: 安装软件protues和keil4,protues仿真和keil4编写代码
今日任务完成情况:1 LED灯的点亮 2 蜂鸣器 3 独立按键 4 矩阵按键 5 数码管(digital)。
今日开发中遇到的问题汇总:不清楚各个功能怎么用,以及接口的对应关系。
今日未解决的问题:无
今日开发收获:知道了:矩阵按键的使用,数码管以及锁存器的功能,学会看懂原理图以及端口与芯片的连接关系。
自我评价:优秀。
上课知识点:
芯片:
1 LED
#include <reg51.h> //点亮LED灯有两种方法。1给P1赋值如:P1=0x00;8个灯全部点亮
//#define LED P1
sbit LED1 = P1^0;//位寻址,你要哪一位就让哪一位点亮
sbit LED2 = P1^1;
void delay()
{
int x = 200 ,y;
while(x--)
{
for(y = 0;y <2000; y++)
}
}
void main()
{
//LED = 0x00;//
LED1 = 0;//
LED2 = 0;
while(1);
/*{
LED = 0xfe;
delay();
LED = 0xfd;
delay();
for(i = 0; i < 8; i++)
{
LED = ~(1 << i);
delay();
}
} */
}
2蜂鸣器
#include <reg51.h>
sbit beep = P2^3;
void delay()
{
int x = 10, y;
while(x--)
{
for(y = 0; y < 2; y++);
}
}
void main()
{
while(1)
{
beep = ~beep;
delay();
}
}
3 用独立按键点亮LED灯
#include <reg51.h>
#define LED P1
sbit button2 = P3^4;
sbit button3 = P3^5;
sbit button4 = P3^6;
sbit button5 = P3^7;
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
void main()
{
while(1)
{
LED = 0xff;//首先让LED灯全部熄灭,不亮,LED是低电平点亮。
if(button2 == 0)
{
led1 = 0;
}
if(button3 == 0)
{
led2 = 0;
}
if(button4 == 0)
{
led3 = 0;
}
if(button5 == 0)
{
led4 = 0;
}
}
}
4矩阵按键来控制LED的点亮
知识点:先列后行,顺序:RD-》P3.0,比如要第一列亮,也就是LCDEN=0;(低电平有效),P3=11101111
#include <reg51.h>
#define LED P1
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
void main()
{ int key ;
while (1)
{
key = 0;
LED = 0xff;//先全部置一,没有任何一个键按下
P3 = 0xf0;//11110000 ,每一列都没有按下(0表示按下,低电平有效)左边第一个1表示的是RD=1,没有按下。
if (P3 != 0xf0)//因为按下了,所以P3不再是0xff.
{
switch(P3)
{
case 0xe0://11100000
key += 0;
break;
case 0xd0://11010000
key += 1;
break;
case 0xb0: //10110000
key += 2;
break;
case 0x70:
key += 3;
break;
}
}
P3 = 0x0f;//00001111现在判断到底是哪一行
//(列RD WR RS LCDEN 都为0,表示按下了,行都为1,没有一个按下)
switch(P3)//分析行的情况{
case 0x0e://00001110
key += 1;
break;
case 0x0d://00001101
key += 5;
break;
case 0x0b://00001011
key += 9;
break;
case 0x07://00000111
key += 13;
break;
}
}
switch(key)
{
case 1:
led1 = 0;
break;
case 2:
led2 = 0;
break;
case 3:
led3 = 0;
break;
case 4:
led4 = 0;
break;
}
}
5.数码管 重要的知识点:由于段选和位选都由P0一个端口控制,所以用锁存器来存储,目的是:数据不被覆盖掉,当位选开启时 也就是:DULA=1,P1执行位选功能,然后位选关闭,也就是:DULA=0;再段选开启,也就是:WELA=1,确认数字,然后再关闭。交替进行。
LA
#include <reg51.h>
sbit duan =P2^6;
sbit wei = P2^7;
unsigned char code table_wei[] = {0xfe, 0xfd, 0xfb};//位从左到右
unsigned char code table_duan[] = {0x3f, 0x06,0x5b};//数字由(a b c d e f g)构成
void delay()
{
int x = 50, y;
while(x--)
{
for (y = 0; y < 30; y++);
}
}
void main()
{
/*wei = 1;//
P0 = 0x00;
wei = 0;
duan = 1;
P0 = 0x3f;
duan = 0;
while(1);*/
int i = 0;
while(1)
{
for(i = 0; i < 3; i++)
{
wei = 1;//位使能端开启
P0 = table_wei[i];//
wei = 0;//位 关闭
duan = 1;//段开启
P0 = table_duan[i];
duan = 0;//段关闭
delay();
}
}
}