准备
1.软件安装
编写软件 keilv5
烧录软件 stcisp
2.新建工程:养成编程习惯
从上到下 由主到次
芯片AT89C52
品字 第一列工程名 第二列 user主程序 driver底层
魔术棒 hex文件创建
函数
3. 点灯 两种方式进行点亮
对整体赋值
例如 P2=0x5f //运用十六进制
//0x5f 为0101 1111 D6和D8为点亮状态
对单个赋值
例如 P2_0=0 D8为点亮状态
//头语言区
#include <REGX52.H>
//主程序
void main()
{
while(1)
{
P1=0x5f; //编写代码的地方
}
}
4.延迟函数 Delay(50) //延迟50
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
5.流水灯
_crol_左移 _cror_右 #include<intrins.h>
#include <REGX52.H>
#include <intrins.h>
int Led =0x5f;
void main()
{
while(1)
{
P2=Led;
Led=_crol_(Led,1);
}
}
流转时加速,达到一定界限会重置流转的时间
#include <REGX52.H>
#include <intrins.h>
//头文件
int Led =0x5f;//初始灯光设置
int time=500;
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void main()
{
while(1)
{
P2=Led;
Delay(time);
Led=_crol_(Led,1);
time=time-100;//流转越来越快
if(time==0){time=500;}//达到一定限制,进行重置
}
}
模块化编程
6.独立按键
unsigned char Key_Read()
{
unsigned char temp =0;
if(P3_1==0)temp=1;
if(P3_0==0)temp=2;
if(P3_2==0)temp=3;
if(P3_3==0)temp=4;
return temp;
}
//优先读取按键返回值
Key_Val=Key_Read();//读取键码
Key_Down=Key_Val&(Key_Val^Key_Old);//检测上升沿
Key_Up=~Key_Val&(Key_Val^Key_Old);//检测下降沿
Key_Old=Key_Val;//扫描变量
//纯背这块 定义后在这么写
小项目
自动开启流转为1000 带有次数限制 流转20次暂停
s1流转变为100 s2流转变为20
s3灯光变为4个(初始为两个) s4次数重置
//主区域
#include <REGX52.H>
#include<intrins.h>
//按键读取函数
unsigned char Key_Read()
{
unsigned char temp =0;
if(P3_1==0)temp=1;
if(P3_0==0)temp=2;
if(P3_2==0)temp=3;
if(P3_3==0)temp=4;
return temp;
}
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
//声明变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned int time =1000;
unsigned char Led=0x5f;
unsigned int count=0;
void main ()
{
while(1){
Key_Val=Key_Read();//读取键码
Key_Down=Key_Val&(Key_Val^Key_Old);//检测上升沿
Key_Up=~Key_Val&(Key_Val^Key_Old);//检测下降沿
Key_Old=Key_Val;//扫描变量
if(count<=10){
P2=Led;
Led=_cror_(Led,1);
Delay(time);
P2=Led;
count++;}
switch(Key_Down)
{
case 1:
time=100;
break;
case 2:
time=20;
break;
case 3:
Led=0xC3;
break;
case 4:
count=0;
break;
}
}
}
//主区域
#include <REGX52.H>
#include<intrins.h>
//按键读取函数
unsigned char Key_Read()
{
unsigned char temp =0;
if(P3_1==0)temp=1;
if(P3_0==0)temp=2;
if(P3_2==0)temp=3;
if(P3_3==0)temp=4;
return temp;
}
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
//声明变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned int time =1000;
unsigned char Led=0xfe;
unsigned int mode = 3;
unsigned int open =0;
unsigned char Led_34[4]={0x7e,0xbd,0xdb,0xe7};
unsigned int i ;
void main ()
{
P2=Led;
while(1){
Key_Val=Key_Read();//读取键码
Key_Down=Key_Val&(Key_Val^Key_Old);//检测上升沿
Key_Up=~Key_Val&(Key_Val^Key_Old);//检测下降沿
Key_Old=Key_Val;//扫描变量
switch(Key_Down)
{
case 1:
open=0;
break;
case 2:
open=1;
break;
case 3:
mode++;
if(mode==5){mode=1;}
break;
case 4:
mode--;
if(mode==255){mode=3;}
break;
}
if(open==0)
{
switch(mode)
{
case 1:
P2=Led;
Led=_crol_(Led,1);
Delay(500);
P2=Led;
break;
case 2:
P2=Led;
Led=_cror_(Led,1);
Delay(500);
P2=Led;
break;
case 3:
P2=Led_34[i];
i++;
if(i==4){i=0;}
Delay(500);
break;
case 4:
P2=Led_34[i];
if(i==0){i=4;}
i--;
Delay(500);
break;
}
}
}
}
7.动态数码管
先点亮LED模块然后利用SMG点亮灯条构成一个完整的表达符号
138译码器 P22 P23 P24 分别为1 2 4 最高值为7 代表LED8 对其进行点亮
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void main ()
{
while(1){
P2_2=0;
P2_2=1;
P2_2=0;
P0=0xfe;
Delay(500);
P0=0x00;
Delay(500);
}
}
进行简单的显示可以增加相应的流动效果
简单的定义简单明了
#include <REGX52.H>
#include "Delay.h"
unsigned char table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void Nixie(unsigned char Local,Num) //0-8λÖõĵÆ
{
switch(Local)
{
case 1:
P2_2=1; P2_3=1;P2_4=1;
break;
case 2:
P2_2=0; P2_3=1;P2_4=1;
break;
case 3:
P2_2=1; P2_3=0;P2_4=1;
break;
case 4:
P2_2=0; P2_3=0;P2_4=1;
break;
case 5:
P2_2=1; P2_3=1;P2_4=0;
break;
case 6:
P2_2=0; P2_3=1;P2_4=0;
break;
case 7:
P2_2=1; P2_3=0;P2_4=0;
break;
case 8:
P2_2=0; P2_3=0;P2_4=0;
break;
//·ÖÅäµÆ¿é
}
//µãÁÁµÆ¿é
P0=table[Num];
P0=0x00;
}
定时器
确定频率,一般为1毫秒 删除AUXR&=07f
标签:P2,9.22,Led,Val,9.16,unsigned,单片机,while,Key From: https://blog.csdn.net/2201_75813159/article/details/142414308