芯片:应广 PMS154C
一个按键,一个8位数码管
1位天/2位小时/2位分钟/2位秒/1位0.1秒
我发现论坛上关于 应广单片机 的资料少的可怜,应该是没多少人用过吧。我发一个我以前写的8数码管计时器秒表程序。
因为我直接用的仿真器,所以没有实物,直接拍的开发板照片。如果有其他的需要,我还可以发发其他的应广单片机程序。比如,流水灯,数码管,PWM之类的。

制作出来的实物图如下:
image.png

image.png
单片机源程序如下:
  • /*秒表计时显示程序?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;
  • }
  • 复制代码