8.零基础入门(三)

零基础入门(三)

认识数码管

段选是哪个灯亮,位选是第几个数码管亮,当前数码管是给0是灭(共阴极数码管),位码也是0是选中。

选中第一个数码管 1111 1110 0xfe(八个口分布在后六个口)

//位码
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//段码
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

段码连接到P2_6,位码连接到P2_7,段码和位码的数据储存在P0口

数码管显示函数

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;
}
Seg_Disp(0,1);//第一个数码管亮1

定时器

生成步骤

1.打开STC_ISP烧录软件,找到定时器计算器

2.系统频率 12MHz 定时长度 1毫秒 定时器模式 16位(不自动重载) 定时器时钟 12T

3.复制C代码到工程中

4.删除AUXR&=0X7F;

5.添加ET0=1;
EA=1;

//定时器初始化函数
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0=1;                  //打开闹钟
	EA=1;                   //开始计时
}

//定时器0中断服务函数
void Timer0Server() interrupt 1
{
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
}

void main()
{
	Timer0_Init();
	while(1)
	{
	
	}
}

动态数码管

中断配置方法

1.在生成的定时器初始化函数内增加中断打开命令 ET0=1;EA=1;

2.书写中断服务函数(Timer0Server)

3.在服务函数内初始化计数值

4.在主程序内添加定时器0初始化函数

动态数码管显示逻辑

1.定义一个数组,将每一个数码管要显示的数据放在数组对应位置

2.将买一个数码管显示的函数放在中断内

程序

unsigned char Seg_Pos;
unsigned char Seg_Buf[]={10,10,10,10,10,10};
unsigned char Time=500;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
bit System_Flag=1;//流转状态标识位 0-停止 1-启动

//定时器初始化函数
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	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 main()
{
	Timer0_Init();
	while(1)
	{
		Key_Read();
		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:
				System_Flag=1;
			break;
			case 2:
				System_Flag=0;
			break;
			case 3:
				Time +=100;
			break;
			case 4:
				Time -=100;
			break;	
		}
		
		Seg_Buf[0]=Time/100%10;
		Seg_Buf[1]=Time/10%10;
		Seg_Buf[2]=Time/1%10;
	}
}