芯片:应广 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.3
- word 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;
- }
复制代码 以上代码下载:
T0510 1个按键、8位数码管秒表计时.7z
(13.84 KB, 下载次数: 53)
|