用15单片机点亮7段数码管
7段数码管的硬件如下
实例1:在第一个数码管上显示2的代码如下
#include <STC15F2K60S2.h> void main() { P2=0XA0;P0=0X00;//关闭蜂鸣器 P2=0X80;P0=0XFF; //关闭继电器 P2=0XC0;P0=0X01; //第一个P0=0X01对应DS1第一个位置显示数字 P2=0XFF;P0=0XFF; //把所有的数码管全关闭。 while(1) { P0=0xA4; // 显示数字2; } }
实例2:在第一个数码管上显示0-9的代码如下
#include <STC15F2K60S2.h> #define uchar unsigned char uchar i; uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//??0-9 void delay(); void main() { P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; P2=0XC0;P0=0X01;P2=0XF0;P0=0XFF; while(1) { for(i=0;i<10;i++) { P0=tab[i]; delay(); } } } void delay() { int i,j; for(i=0;i<600;i++) for(j=0;j<600;j++); }
实例3:在8个位置显示任意数字,比如20211225
由数码管的工作原理可知,8个数码管必须轮着亮,所以每个位置都在闪烁,只要闪烁的够快,人眼就感觉不出。
#include <STC15F2K60S2.h> #define uchar unsigned char uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; void disp(long int dat); void DelaySMG(unsigned int time); void main() { P2=0XA0;P0=0X00; P2=0X80;P0=0XFF; P2=0; while(1) { disp(20211225); } } void disp(long int dat) { int i; uchar str[8]; //用来存储8个数 str[0]=dat/10000000%10; //2 str[1]=dat/1000000%10;//0 str[2]=dat/100000%10;//2 str[3]=dat/10000%10;//1 str[4]=dat/1000%10;//1 str[5]=dat/100%10;//2 str[6]=dat/10%10;//2 str[7]=dat/1%10;//5 for( i = 0 ;i <8;i++) { P2 = P2&0x1f|0xc0; //设置 P2前三位为110,对应数字6 P0=0X01<<i; //0x01 P2 = P2&0x1f|0xe0; P0=tab[str[i]]; P2 = P2&0x1f; DelaySMG(600); P2=P2&0x1f|0xc0;P0=0; } } void DelaySMG(unsigned int time) { while(time--); }
思考下有没有更紧凑的写法?
============================找指导老师布置任务吧==============================