第二周
入门(一)
基本格式
//头文件
#include <REGX52.H>
//main
void main()
{
while(1)
{
}
}
自定义的延迟函数
void Delay(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
流水灯
void main()
{
while(1)
{
//P1 = 0xAA; //12121212
/*
P1_2=0;//亮
Delaylms(1000);
P1_2=1;
Delaylms(1000);
*/
ucLed =_crol_(ucLed,1);
Delay1ms(1000);
}
}
入门(二)
按键控制
//头文件
#include <REGX52.H>
#include <intrins.h>
//延迟函数
void Delay1ms(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
//变量
unsigned char ucLed = 0xfe;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
//按键
unsigned char Key_Read()
{
unsigned char temp = 0;
if(P3_4==0)temp=1;
if(P3_5==0)temp=2;
if(P3_6==0)temp=3;
if(P3_7==0)temp=4;
return temp;
}
//main
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 (Key_Down == 1)P1_0=0;
if (Key_Up == 2)P1_0=1;
if (Key_Old == 3)
P1_1=0;
else
P1_1=1;
}
}
流水控制
//头文件
#include <REGX52.H>
#include <intrins.h>
//延迟函数
void Delay1ms(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
//变量
unsigned char ucLed = 0xfe;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
bit System_Flag;
//按键
unsigned char Key_Read()
{
unsigned char temp = 0;
if(P3_4==0)temp=1;
if(P3_5==0)temp=2;
if(P3_6==0)temp=3;
if(P3_7==0)temp=4;
return temp;
}
//main
void main()
{
while(1)
{
//P1 = 0xAA; //12121212
/*
P1_2=0;//亮
Delay1ms(1000);
P1_2=1;
Delay1ms(1000);
*/
/*
ucLed =_crol_(ucLed,1);
Delay1ms(1000);
*/
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 (Key_Down == 1)P1_0=0;
if (Key_Up == 2)P1_0=1;
if (Key_Old == 3)//长按
P1_1=0;//亮
else
P1_1=1;//暗
*/
if (System_Flag == 1)
{
ucLed =_crol_(ucLed,1);
P1 = ucLed;
Delay1ms(1000);
}
if (Key_Down == 1)System_Flag = 1;
if (Key_Down == 2)System_Flag = 0;
}
}
流水部分优化
switch (Key_Down)
{
case 1:
System_Flag = 1;
break;
case 2;
System_Flag = 0;
break;
}
led彩灯控制系统
彩灯运行模式:
模式1:Led1 – Led2 – Led3 – Led4 – Led5 – Led6 – Led7 – Led8
模式2:Led8 – Led7 – Led6 – Led5 – Led4 – Led3 – Led2 – Led1
模式3:Led1+Led8 – Led2+Led7 - Led3+Led5 – Led4+Led6
模式4:Led4+Led6 – Led3+Led5 – Led2+Led7 – Led1+Led8
按键功能定义:
S1:彩灯系统启动按键
S2:彩灯系统暂停按键
S3:显示模式调整按键(运行模式+1)(若模式4+1后返回到模式1)
S4:显示模式调整按键(运行模式-1)(若模式1-1后返回到模式4)
初始化状态:
上电时,默认为模式启动状态,固定流转时间500ms/次
#include <REGX52.H>
#include <intrins.h>
//变量
unsigned char Val,Down,Up,Old;
unsigned int Time = 500;
unsigned char Led = 0xfe;
unsigned char Mode = 1;
signed char i=0;
unsigned char mode_3_4[] = {0x7e,0xbd,0xdb,0xe7};
bit Flag = 1;//启动暂停
//按键读取函数
unsigned char Read()
{
unsigned char temp = 0;
if(P3_4 == 0) temp = 1;
if(P3_5 == 0) temp = 2;
if(P3_6 == 0) temp = 3;
if(P3_7 == 0) temp = 4;
return temp;
}
//延迟函数
void Delay(unsigned int xms)
{
unsigned char i,j;
while (xms--)
{
i = 2;
j = 239;
do
{
while (--j);
}
while(--i);
}
}
//main
void main()
{
while(1)
{
Val = Read();// 读取
Down = Val & (Val ^ Old);
Up = ~Val & (Val ^ Old);
Old = Val;
switch (Down)
{ case 1 :
Flag = 1;
break;
case 2 :
Flag = 0;
break;
case 3 :
if(Flag == 1)
{
Mode++;
if (Mode > 4)Mode = 1;
i=0;
}
if (Mode == 1 || Mode == 2) Led = 0xfe;
break;
case 4 :
if(Flag == 1)
{
Mode--;
if (Mode == 0)Mode = 4;
i=0;
}
if (Mode == 1 || Mode == 2) Led = 0xfe;
break;
}
if(Flag == 0) continue;
switch (Mode)
{
case 1:
P1 = Led;
Delay(Time);
Led = _crol_(Led,1);
break;
case 2:
P1 = Led;
Delay(Time);
Led = _cror_(Led,1);
break;
case 3:
Led= mode_3_4[i];
Delay(Time);
i++;
if (i>=4) i=0;
P1 = Led;
break;
case 4:
Led= mode_3_4[i];
Delay(Time);
i--;
if (i<0) i=3;
P1 = Led;
break;
}
}
}
入门(三)
断选
1是选中,0是不选中
小数点—>中间—>左上角开始逆时针转
位选
0是选中,1是不选中
unsigned char Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void Seg_Disp (unsigned char wela,dula)
{
P0 = 0x00;
P2_6 = 1;
P2_6 = 0;
P0 = Seg_Wela [wela];
P2_7 = 1;
P2_7 = 0;
P0 = Seg_Dula [dula];
P2_6 = 1;
P2_6 = 0;
}
定时器初始化
void Timer0_Init(void) //1毫秒@12.000MHz
{
//AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
计时器
unsigned char Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char Seg_Pos = 0;
unsigned char Seg_Buf[] = {1,2,3,4,5,6};
//定时器初始化函数
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
//定时器0中断服务函数
void Timer0Server() interrupt 1
{
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
if (++Seg_Pos == 6)Seg_Pos = 0;
Seg_Disp (Seg_Pos,Seg_Buf[Seg_Pos]);
}
//数码管显示函数
void Seg_Disp (unsigned char wela,dula)
{
P0 = 0x00;
P2_6 = 1;
P2_6 = 0;
P0 = Seg_Wela [wela];
P2_7 = 1;
P2_7 = 0;
P0 = Seg_Dula [dula];
P2_6 = 1;
P2_6 = 0;
}
void main()
{
Timer0_Init();
Seg_Buf [0] = Time / 100 %10;
Seg_Buf [1] = Time / 10 %10;
Seg_Buf [2] = Time / 1 %10;
}