零基础入门(三)
认识数码管
段选是哪个灯亮,位选是第几个数码管亮,当前数码管是给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;
}
}

