本文共 3172 字,大约阅读时间需要 10 分钟。
设计背景
单片机老师要求在520当天,利用手上的单片机,实现一个专属计算机专业的浪漫。设计基础目的
动态数码管显示520模块使用
8位动态数码管、8*8led点阵、独立按键辅助工具
Keil C51编程软件、烧写软件(STC-ISP-15xx)、取字模软件功能演示
stc89c52做个基础表白
代码实现
#include#include typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit SRCLK=P3^6;sbit RCLK=P3^5;sbit SER=P3^4;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit k1=P3^1; //定义P31口是k1sbit k4=P3^3;u8 ledduan1[]={ 0xC0,0x9C,0x22,0x32,0x0B,0x32,0x22,0x1C,};u8 ledduan2[]={ 0x97,0xB5,0xD2,0x90,0x07,0xA8,0x47,0xA8,}; u8 ledduan3[]={ 0xE8,0xA8,0xB8,0x07,0x07,0xB8,0xA8,0xE8,};u8 ledwei[]={ 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};u8 code smgduan[18]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0xff};//显示0~F的值/******************************************************************************** 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*******************************************************************************/void delay(u16 i){ while(i--); }/******************************************************************************** 函 数 名 : DigDisplay* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示*******************************************************************************/void DigDisplay(int t1,int t2){ u8 g[8]; u8 p; u8 i; for(p=3;p>0;p--) { g[p]=t1%10; t1=t1/10; } g[4]=16; for(p=7;p>=5;p--) { g[p]=t2%10; t2=t2/10; } for(i=0;i<9;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=1;LSB=1;LSC=1; break;//显示第0位 case(1): LSA=0;LSB=1;LSC=1; break;//显示第1位 case(2): LSA=1;LSB=0;LSC=1; break;//显示第2位 case(3): LSA=0;LSB=0;LSC=1; break;//显示第3位 case(4): LSA=1;LSB=1;LSC=0; break;//显示第4位 case(5): LSA=0;LSB=1;LSC=0; break;//显示第5位 case(6): LSA=1;LSB=0;LSC=0; break;//显示第6位 case(7): LSA=0;LSB=0;LSC=0; break;//显示第7位 case(8): LSA=1;LSB=1;LSC=1; break;//显示第7位,将点阵屏影响放到第一位数码管 } P0=smgduan[g[i]];//发送段码 delay(100); //间隔一段时间扫描 P0=0x00;//消隐 }} void Hc595SendByte(u8 dat){ u8 a; SRCLK=0; RCLK=0; for(a=0;a<8;a++) { SER=dat>>7; dat<<=1; SRCLK=1; _nop_(); _nop_(); SRCLK=0; } RCLK=1; _nop_(); _nop_(); RCLK=0;}int keypros(){ if(k1==0) //检测按键K1是否按下 { return 3; } if(k4==0) //检测按键K4是否按下 { return 5; } return 0; }/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ u8 i; u8 get; while(1) { P0=0x7f; get=keypros(); if(get==3) { for(i=0;i<8;i++) { P0=ledwei[i]; //位选 Hc595SendByte(ledduan1[i]); //发送段选数据 delay(100); //延时 Hc595SendByte(0x00); //消隐 } } else if(get==5) { for(i=0;i<8;i++) { P0=ledwei[i]; //位选 Hc595SendByte(ledduan2[i]); //发送段选数据 delay(100); //延时 Hc595SendByte(0x00); //消隐 } } else if(get==0) { for(i=0;i<8;i++) { P0=ledwei[i]; //位选 Hc595SendByte(ledduan3[i]); //发送段选数据 delay(100); //延时 Hc595SendByte(0x00); //消隐 } } DigDisplay(520,521); //数码管显示函数 } }
小白一名,如有错误,请及时告知,谢谢
转载地址:http://porwi.baihongyu.com/