功能描述: 此数码管显示模块是基于,STC15W408AS单片机为核心的,可编程数码管显示模块,可以通过对单片机编程,实现数码管任意显示,有四位数码管和四个LED指示灯,均可以编程使用,四路输入IO口和LED共用输入口。数码管也可以通过TTL通讯实现任意显示。我们提供基本例程。 【简要说明】 一、板子尺寸:长69mmX宽37mmX高12mm
二、主要器件:STC15W408AS 三、工作电压:3.3V至5V
四、板子功耗:小于50mA
五、特点:
1、具有四路输入信号和LED灯指示功能。
2、四位数码管显示,支持共阴或共阳数码管。
3、可单独工作,也可以通讯控制显示
4、TTL电平输入控制。
5、2.54mm 管脚距。
6、接受定制或者编程服务
7、工作温度-40度至 +70度
8、工作湿度 40% ~ 80%RH
【声明】此程序仅用于学习与参考!
*********************************************************************/ #include<STC15W408AS.h> #include<math.h> //计算小数点的头文件 #include <intrins.h> //用nop函数延时的头文件 #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /*数据类型定义*/ typedef signed char int8; typedef signed int int16; typedef signed long int32; typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32;
#define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值 #define CMD_IDLE 0 #define CMD_READ 1 #define CMD_PROGRAM 2 #define CMD_ERASE 3 #define ENABLE_IAP 0x83//SYSCLK<12MH #define IAP_ADDRESS 0x0000 //存储地址 #define FOSC 11059200L #define BAUD 9600 uint8 sendBuf[10]; //发送缓冲区 uint8 receBuf[10]; //接收缓冲区 sbit IN1 = P3^2; /*单片机1.2引脚检测IN1是否动作*/ sbit IN2 = P3^3; /*单片机1.3引脚检测IN2是否动作*/ sbit IN3 = P5^4; /*单片机1.4引脚检测IN3是否动作*/ sbit IN4 = P5^5; /*单片机1.5引脚检测IN4是否动作*/ sbit COM1 = P3^4; /*单片机3.7引脚控制继电器COM1*/ sbit COM2 = P3^5; /*单片机3.6引脚控制继电器COM2*/ sbit COM3 = P3^6; /*单片机3.5引脚控制继电器COM3*/ sbit COM4 = P3^7; /*单片机3.4引脚控制继电器COM4*/ code uchar seg7code[10]={0x3F,0x05,0x5B,0x4F,0x65,0x6E,0x7E,0x07,0x7F,0x6F}; //显示段码 uchar dat=0x00; bit bz1=0; bit bz2=0; bit bz3=0; bit bz4=0; bit write=0; uint sec=0; uint tcnt=0; uchar sj1; uchar sj2; uchar A1,B1,C1,D1; uchar r; bit flag_zx=0; /******************************************************************** 定义 ISP/IAP/EEPROM 命令 *********************************************************************/
void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态 uint8 IapReadByte(uint16 addr);//读数据 void IapProgramByte(uint16 addr, uint8 dat);//写数据 void IapEraseSector(uint16 addr);//擦除数据 /******************************************************************** 延时函数 *********************************************************************/ void delay(uchar dat)//延时程序 { uchar m,n,s; for(m=dat;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } /****************发送函数*********************/ void senduart1() { SBUF='R';while(!TI);TI=0; SBUF='E';while(!TI);TI=0; SBUF='A';while(!TI);TI=0; SBUF='D';while(!TI);TI=0; } /******************************************************************** 定时中断服务函数 *********************************************************************/ void t0(void) interrupt 1 using 0 //定时中断服务函数 { tcnt++; //每过250ust tcnt 加一 if(tcnt==400) //计满400 次(1/10 秒)时 { tcnt=0; //重新再计 sec++; if(sec==10){sec=0;}
} } /******************************************************************** 按键函数 *********************************************************************/ void key() { if((IN1==0)&&(bz1==0)){delay(10);if(IN1==0){bz1=1;A1++;if(A1>9)A1=0;}}if((IN1==1)&&(bz1==1)){bz1=0;write=1;}//按键控制数码管0~9显示 if((IN2==0)&&(bz2==0)){delay(10);if(IN2==0){bz2=1;B1++;if(B1>9)B1=0;}}if((IN2==1)&&(bz2==1)){bz2=0;write=1;}//按键控制数码管0~9显示 if((IN3==0)&&(bz3==0)){delay(10);if(IN3==0){bz3=1;C1++;if(C1>9)C1=0;}}if((IN3==1)&&(bz3==1)){bz3=0;write=1;}//按键控制数码管0~9显示 if((IN4==0)&&(bz4==0)){delay(10);if(IN4==0){bz4=1;D1++;if(D1>9)D1=0;}}if((IN4==1)&&(bz4==1)){bz4=0;write=1;}//按键控制数码管0~9显示 } /******************************************************************** 显示函数 *********************************************************************/ void xianshi() { COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[A1];COM1=0;COM2=1;COM3=1;COM4=1;delay(1);//千位显示 COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[B1];COM1=1;COM2=0;COM3=1;COM4=1;delay(1);//百位显示 COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[C1];COM1=1;COM2=1;COM3=0;COM4=1;delay(1);//十位显示 COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[D1];COM1=1;COM2=1;COM3=1;COM4=0;delay(1);//个位显示 } /*****************清空发送缓冲区*************************/ void clear_receBuf() { uchar i; for(i=0;i<5;i++) { receBuf=0; } } /******************************************************************** 主函数 *********************************************************************/ void main() { SCON = 0x50; T2L = (65536 - (FOSC/4/BAUD)); T2H = (65536 - (FOSC/4/BAUD))>>8; AUXR = 0x14; AUXR |= 0x01; ES = 1; EA = 1; sj1= IapReadByte(0x01);//读取存储的值 sj2= IapReadByte(0x02);//读取存储的值
A1= IapReadByte(0x03);//读取存储的值 B1= IapReadByte(0x04);//读取存储的值 C1= IapReadByte(0x05);//读取存储的值 D1= IapReadByte(0x06);//读取存储的值
IN1=sj1; IN2=sj2; TMOD=0x02; //定时器工作在方式2 TH0=0x06; //对TH0 TL0 赋值 TL0=0x06; TR0=1; //开始定时 ET0=1; EA=1; sec=0; COM1=1;COM2=1;COM3=1;COM4=1; P1M0=0Xff;P1M1=0X00; while(1) {
key();//调用按键函数 xianshi();//调用显示函数 if(write==1) //存储数据 { // sj1=IN1;sj2=IN2; write=0; IapEraseSector(0); //擦除扇区 IapProgramByte(0x01,sj1);//写入新的地址 IapProgramByte(0x02,sj2);//写入新的地址 IapProgramByte(0x03,A1);//写入新的地址 IapProgramByte(0x04,B1);//写入新的地址 IapProgramByte(0x05,C1);//写入新的地址 IapProgramByte(0x06,D1);//写入新的地址 } } } /******************************************************************** 串口中断函数 *********************************************************************/ void Uart() interrupt 4 using 1 { if (RI) { RI=0; //接收标志清零 receBuf[r++&0x0F]=SBUF; //把接受的数据存储到BUT数组中 if(receBuf[0]!=0xaa){r=0;} if(r>=5) { r=0;
flag_zx=1; } } if(flag_zx==1) {
flag_zx=0; //0 1 2 3 4 //起始位 千位 百位 十位 个位 if(receBuf[0]==0xaa) //如果开始位和结束位,还有地址都正确,进行下一步判断 { A1=receBuf[1]; B1=receBuf[2]; C1=receBuf[3]; D1=receBuf[4]; write=1; clear_receBuf(); } }
}
/******************************************************************** 结束 *********************************************************************/ void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态 IAP_CONTR = 0; // IAP_CMD = 0; // IAP_TRIG = 0; // IAP_ADDRH = 0x80; // IAP_ADDRL = 0; // } uint8 IapReadByte(uint16 addr){//读数据 uint8 dat; IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_READ; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; _nop_(); dat = IAP_DATA; IapIdle(); return dat; } void IapProgramByte(uint16 addr, uint8 dat){//写数据 IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_PROGRAM; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_DATA = dat; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; _nop_(); IapIdle(); } void IapEraseSector(uint16 addr){//擦除数据 IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_ERASE; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; _nop_(); IapIdle(); } /******************************************************************** 结束 *********************************************************************/
|