要在51单片机开发板上面实现的效果:
1、数码管固定显示"--8051--"约5s时间。
2、闪烁显示"--8051--"5次。
3、向左移动走字显示"--8051--"3遍。
4、重复执行1~3。
实现代码:(c语言)
#include <REGX51.H>
#include <intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar count=0; //定时器计数
uint flag=0; //开始为 第一小题
void Timer0Init(){ //50毫秒@12.000MHz
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //打开小开关
EA=1; //打开总开关
}
void Delay(unsigned int ms) {
/*延时函数 参数:延时的毫秒数*/
while(ms--){
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do{
while (--j);
} while (--i);
}
}
void Display(int position,char value){
/*显示模块 参数:字符串*/
switch (position){//位选
case 8:P2_4=0;P2_3=0;P2_2=0;break;//第一位
case 7:P2_4=0;P2_3=0;P2_2=1;break;//第二位
case 6:P2_4=0;P2_3=1;P2_2=0;break;//第三位
case 5:P2_4=0;P2_3=1;P2_2=1;break;//第四位
case 4:P2_4=1;P2_3=0;P2_2=0;break;//第五位
case 3:P2_4=1;P2_3=0;P2_2=1;break;//第六位
case 2:P2_4=1;P2_3=1;P2_2=0;break;//第七位
case 1:P2_4=1;P2_3=1;P2_2=1;break;//第八位
}
switch(value){//段选,可以用数组来代替这里的选择
case '0': P0=0x3F; break; //数值0
case '1': P0=0x06; break; //数值1
case '2': P0=0x5B; break; //数值2
case '3': P0=0x4F; break; //数值3
case '4': P0=0x66; break; //数值4
case '5': P0=0x6D; break; //数值5
case '6': P0=0x7D; break; //数值6
case '7': P0=0x07; break; //数值7
case '8': P0=0x7F; break; //数值8
case '9': P0=0x6F; break; //数值9
case'a': case 'A': P0=0x77; break; //数值a 两个case兼容大小写
case'b': case 'B': P0=0x7C; break; //数值b
case'c': case 'C': P0=0x39; break; //数值c
case'd': case 'D': P0=0x5E; break; //数值d
case'e': case 'E': P0=0x79; break; //数值e
case'f': case 'F': P0=0x71; break; //数值f
case '-': P0=0x40; break; //数值-
case '.': P0=0x80; break; //数值.
case ' ': P0=0x00; break; //无显示
}
Delay(1);P0=0x00;//消影
}
void main(){
char display[8]="--8051--";
int i,j=5,k=3,b;
int num=3;
Timer0Init();//初始化,并开启定时器
for(num=0;num<3;num++){
TR0 = 1;//启动定时器
while(flag<5){//显示5s
for(i=1;i<=8;i++){
Display(i,display[i-1]);
}
}
TR0 = 0;//关闭定时器
count=0,flag=0;//清空计数,不影响下次循环的显示时间
for(j=0;j<5;j++){ //闪烁5次
for(b=1;b<50;b++)
for(i=1;i<=8;i++)
Display(i,display[i-1]);
for(b=1;b<50;b++)
for(i=1;i<=8;i++)
Display(i,' ');
}
for(k=0;k<3;k++){ //走字显示3遍
for(i=1;i<=8;i++)
for(b=1;b<500;b++)
Display(i,display[i-1]);
}
}
while(1);//让程序停在这里
}
//定时器中断函数
void interrupt_T0()interrupt 1
{
TL0 = 0x00; //重新设置定时初值
TH0 = 0x4C; //重新设置定时初值
count++;
if(count==20){//1秒时间到了
count=0;
flag++;
}
}
只要修改main函数里面字符串数组内容就能修改数码管显示的东西了
开发板电路图
数码管部分:
扫描二维码关注公众号,回复:
15557159 查看本文章
138 译码器部分:
效果图:
汇编语言的代码有空会补上~~~~~~