芯片:应广 PMS154C
一个按键,一个8位数码管
1位天/2位小时/2位分钟/2位秒/1位0.1秒
我发现论坛上关于 应广单片机 的资料少的可怜,应该是没多少人用过吧。我发一个我以前写的8数码管计时器秒表程序。
因为我直接用的仿真器,所以没有实物,直接拍的开发板照片。如果有其他的需要,我还可以发发其他的应广单片机程序。比如,流水灯,数码管,PWM之类的。
制作出来的实物图如下:
单片机源程序如下:/*秒表计时显示程序?1个按键、8位数码管 数码管显示: 1位天/2位小时/2位分钟/2位秒/1位0.1秒 请用T16计时 按键按第一次:开始计数显示 按键按第二次:暂停计数显示 长按按键1秒:定时器清零,并停止计数。*/#include "extern.h"#define data PB#define wei_A PA.6//位#define duan_B PA.7//段#define key pa.3word time,b,n;byte duan,wei,keysignal,keysignal2,type;byte second_01,second,second_10,minute,minute_10,hour,hour_10,day,hour_24;// 0.1s /1s /10s 1分 10分 1小时 /10小时/天/小时word reload_T16;void weiTable(void){ _Pcadd { ret 0xfe;//第一位 1111 1110 ret 0xfd;//第二位 1111 1101 ret 0xfb;//3 1111 1011 ret 0xf7;//4 1111 0111 ret 0xef;//5 1110 1111 ret 0xdf;//6 1101 1111 ret 0xbf;//7 1011 1111 ret 0x7f;//8 0111 1111 }}void duanTable(void)//8位共阴极数码管 段码{ _Pcadd { ret 0x3f;//0 //无小数点 ret 0x06;//1 ret 0x5b;//2 ret 0x4f;//3 ret 0x66;//4 ret 0x6d;//5 ret 0x7d;//6 ret 0x07;//7 ret 0x7f;//8 ret 0x6f;//9 ret 0xbf;//0 //带小数点 ret 0x86;//1 ret 0xdb;//2 ret 0xcf;//3 ret 0xe6;//4 ret 0xed;//5 ret 0xfd;//6 ret 0x87;//7 ret 0xff;//8 ret 0xef;//9 }}void T16_Init(void) //t16中断{ // $ T16M IHRC,/16,bit10; // reload_T16 = 1024-1000; //每次进中断为1ms; //计算公式为 [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(16M/16)]*(24)=0.001s $ T16M IHRC,/16,bit15; reload_T16 = 32768-1000; //每次进中断为1ms; // 设定INTEN、INTRQ的初始值 INTEN.T16 = 1; //开T16中断 INTRQ.T16 = 0; //清零INTRQ寄存器。 ENGINT; //打开全局中断}void leddis(void) //查表显示{ data = 0x00; //去重影 duan_B = 1; duan_B = 0; A = wei; //取位码 weiTable(); data = A; wei_A = 1; wei_A = 0; A = duan; //取段码 duanTable(); data = A; duan_B = 1; duan_B = 0;}void keyscan(void) //按键扫描{ if(pa.3==0) { .delay 10000 if(pa.3==0) { if(pa.3==0) { while(pa.3==0) { n++; .delay 1000; if(n>=1000) //长按1s清零 { n=0; keysignal2=1; break; } } keysignal++; if(keysignal>2) { keysignal=1; } } } } if(keysignal==1) //按键1开始 { type=1; n=0; } if(keysignal==2) //按键2暂停 { type=0; n=0; } if(keysignal2==1) //长按清零 { keysignal=2; time=0; second_01=1; //0.1秒 second=1; //秒 second_10=1; //10秒 minute=1; //分 minute_10=1; //10分 hour=1; //小时 hour_10=1; //10时 day=1; //天 hour_24=1; //24小时 keysignal2=0; type=0; while(pa.3==0){nop;} }}void FPPA0 (void){ .ADJUST_IC SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V; T16_Init(); paph=0b1111_1111; //启用Pa端口的,上拉电阻 pac=0b1110_0110; //开启pa.0,pa.3,pa.4输入功能 pbc=0xff; //设置Pb口为输出功能 pb=0xff; //设置Pb口全部输出高电平 time=0; wei=8; second_01=1; //0.1秒 second=1; //秒 second_10=6; //10秒 minute=10; //分 minute_10=6; //10分 hour=4; //小时 hour_10=3; //10时 day=9; //天 hour_24=23; //24小时 duan=1; keysignal=0; keysignal2=0; n=0; type=0; while (1) { keyscan(); }}void Interrupt (void)//T16{ pushaf; if (Intrq.T16) { stt16 reload_T16; //设定计数器初始值reload_T16 if(type==1) //按键控制计时启停 { time++; } leddis(); b++; if(b>8) {b=0;} if(time>=100)//0.1s { time=0; second_01++; if(second_01>10) //1s { second_01=1;second++; //秒归零,进10s if(second>10)//10s { second=1;second_10++; //10秒归零,进分钟 if(second_10>6)//1M { second_10=1;minute++; //分钟归零,进10分 if(minute>10)//10m { minute=1;minute_10++; //10分归零,进1h if(minute_10>6)//1h { minute_10=1; hour++; hour_24++; //1h归零,进10h if(hour>10)//10h { hour=1; hour_10++; //10h>20h } if(hour_24>=24)//1day //24小时归零,进天 { hour_10=1; //10小时清零 hour_24=1; //24小时清零 hour=1; //小时清零 day++; //天加 if(day>10) //10天清零 {day=1;second_01=1;}//天归零 } } } } } } } switch(b) { case 0: duan=second_01; //0.1秒 wei=8; break; case 1: duan=second+10; //1s wei=7; break; case 2: duan=second_10; //10s wei=6; break; case 3: duan=minute+10; //分 wei=5; break; case 4: duan=minute_10; //10分 wei=4; break; case 5: duan=hour+10; //时 wei=3; break; case 6: duan=hour_10; //10小时 wei=2; break; case 7: duan=day+10; //天 wei=1; break; default:break; } Intrq.T16 = 0; } popaf;}复制代码