数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3019|回复: 1

[C51] 玩玩SDCC

[复制链接]
发表于 2020-10-27 22:22:31 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

// #define HH 1
// #define LL 0
#define HH 0  //HH用在位,代表使用此位。 用在段,代表此段不亮——共阳
#define LL 1
// KeilC51_901\C51\hlp     Predefined Macros
#ifdef __C51__
#include <reg51.h>
sfr AUXR=0x8E;

sbit Wei1=P2^6; // 6  P1^4
sbit Wei2=P2^0; // 8
sbit Wei3=P2^1; // 9
sbit Wei4=P2^4; // 12
sbit Dun1=P2^3; // 11  a
sbit Dun2=P3^7; // 7   b
sbit Dun3=P1^2; // 4   c
sbit Dun4=P1^0; // 2   d
sbit Dun5=P2^7; // 1   e
sbit Dun6=P2^2; // 10  f
sbit Dun7=P1^3; // 5   g
sbit Dun8=P1^1; // 3   dp
#define INTERRUPT interrupt

#else
#include "8052.h"
__sfr __at 0x8E AUXR;
#define Wei1 P2_6
#define Wei2 P2_0
#define Wei3 P2_1
#define Wei4 P2_4
#define Dun1 P2_3
#define Dun2 P3_7
#define Dun3 P1_2
#define Dun4 P1_0
#define Dun5 P2_7
#define Dun6 P2_2
#define Dun7 P1_3
#define Dun8 P1_1
#define INTERRUPT __interrupt
#endif

#define _nop_() __asm NOP __endasm
#define uint_8  unsigned char
#define uint_16 unsigned int
#define FOSC    22118400L
#define T1MS   (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式

uint_8 len = 8;
uint_16 x=0, y=0;
void delay_ms(uint_16 ms);

void dis(uint_8 wei, uint_8 n, uint_8 dp){
    switch(wei){
        case 1: Wei1=HH; Wei2=LL; Wei3=LL; Wei4=LL; break; //
        case 2: Wei1=LL; Wei2=HH; Wei3=LL; Wei4=LL; break;
        case 3: Wei1=LL; Wei2=LL; Wei3=HH; Wei4=LL; break;
        case 4: Wei1=LL; Wei2=LL; Wei3=LL; Wei4=HH; break;
    }
    switch(n){   //a        b        c        d        e        f        g        dp
        case '0':
        case  0: Dun1=LL; Dun2=LL; Dun3=LL; Dun4=LL; Dun5=LL; Dun6=LL; Dun7=HH; Dun8=(dp==1?LL:HH);  break;
        case '1':
        case  1: Dun1=HH; Dun2=LL; Dun3=LL; Dun4=HH; Dun5=HH; Dun6=HH; Dun7=HH; Dun8=(dp==1?LL:HH);  break;
        case '2':
        case  2: Dun1=LL; Dun2=LL; Dun3=HH; Dun4=LL; Dun5=LL; Dun6=HH; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case '3':
        case  3: Dun1=LL; Dun2=LL; Dun3=LL; Dun4=LL; Dun5=HH; Dun6=HH; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case '4':
        case  4: Dun1=HH; Dun2=LL; Dun3=LL; Dun4=HH; Dun5=HH; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case '5':
        case  5: Dun1=LL; Dun2=HH; Dun3=LL; Dun4=LL; Dun5=HH; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case '6':
        case  6: Dun1=LL; Dun2=HH; Dun3=LL; Dun4=LL; Dun5=LL; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case '7':
        case  7: Dun1=LL; Dun2=LL; Dun3=LL; Dun4=HH; Dun5=HH; Dun6=HH; Dun7=HH; Dun8=(dp==1?LL:HH);  break;
        case '8':
        case  8: Dun1=LL; Dun2=LL; Dun3=LL; Dun4=LL; Dun5=LL; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case '9':
        case  9: Dun1=LL; Dun2=LL; Dun3=LL; Dun4=LL; Dun5=HH; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break;
        case 'A':
        case 10: Dun1=LL; Dun2=LL; Dun3=LL; Dun4=HH; Dun5=LL; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break; //A
        case 'B':
        case 11: Dun1=HH; Dun2=HH; Dun3=LL; Dun4=LL; Dun5=LL; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break; //B
        case 'C':
        case 12: Dun1=HH; Dun2=HH; Dun3=HH; Dun4=LL; Dun5=LL; Dun6=HH; Dun7=LL; Dun8=(dp==1?LL:HH);  break; //C
        case 'D':
        case 13: Dun1=HH; Dun2=LL; Dun3=LL; Dun4=LL; Dun5=LL; Dun6=HH; Dun7=LL; Dun8=(dp==1?LL:HH);  break; //D
        case 'E':
        case 14: Dun1=LL; Dun2=HH; Dun3=HH; Dun4=LL; Dun5=LL; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break; //E
        case 'F':
        case 15: Dun1=LL; Dun2=HH; Dun3=HH; Dun4=HH; Dun5=LL; Dun6=LL; Dun7=LL; Dun8=(dp==1?LL:HH);  break; //F
    }
}

void tm0() INTERRUPT 1 {
    y++;
    if(y>500){
       y=0;
       x++;
       if(x==10000)x=0;
    }
}

void main(){
    delay_ms(100);
    dis(3, 0, 0);
   
    AUXR |= 0x80;                   //定时器0为1T模式
//  AUXR &= 0x7f;                   //定时器0为12T模式
   
    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL0  = T1MS&0xff;               //初始化计时值
    TH0  = T1MS >> 8;
    TR0  = 1;                       //定时器0开始计时
    ET0  = 1;                       //使能定时器0中断
    EA   = 1;
    while (1){
        //DEC
        //dis(4, (x/1000)%10, 0); delay_ms(5);
        //dis(3, (x/100)%10 , 1); delay_ms(5);
        //dis(2, (x/10)%10  , 0); delay_ms(5);
        //dis(1, x%10       , 0); delay_ms(5);
      
        //HEX
        dis(4, (x>>12)%16, 0); delay_ms(5);
        dis(3, (x>>8 )%16, 1); delay_ms(5);
        dis(2, (x>>4 )%16, 0); delay_ms(5);
        dis(1,  x     %16, 0); delay_ms(5);
    }
}

void delay_ms(uint_16 ms){
    uint_16 i, j;
    for (i = ms; i > 0; i--){
        for (j = 110; j > 0; j--){
            ;
        }
    }
}


/*
测试环境:
  1、Windows7 X64
  2、芯片:STC15F204EA
Target model:
  Name: STC15F204EA
  Magic: F394
  Code flash: 4.0 KB
  EEPROM flash: 1.0 KB
Target frequency: 22.070 MHz
Target BSL version: 6.7R
Target options:
  reset_pin_enabled=False
  watchdog_por_enabled=False
  watchdog_stop_idle=True
  watchdog_prescale=256
  low_voltage_reset=True
  low_voltage_threshold=4
  eeprom_lvd_inhibit=True
  eeprom_erase_enabled=False
  bsl_pindetect_enabled=False



  3、SDCC 4.0
  4、Notepad++,利用nppExec插件执行batch,一键完成编译、开启下载
  5、烧写工具 stcgal (Python 3.7)。是使用DTR控制冷启动的,原来自制的CH340要修改硬件,所以暂时是手动冷启动。
      stcgal -b 9600 -P stc15a -p COM5 SDCC_test1.hex




一、本程序是兼容SDCC和 KEIL的。



二、程序功能:
    1、利用定时器中断,做自增;
    2、并在4位数码管显示十进制、或十六进制(不规则接线的数码管)


三、可以看到SDCC  和 KEIL的区别
   1、sfr、sbit、bit等寄存器级别的区别


   2、中断定义词区别


   3、自带头文件区别
等等。


没什么结论的测试。对于这样的小程序,编译速度看不出。同样,对这样的程序,也看不出什么结果差异。

*/


 楼主| 发表于 2020-10-28 23:32:18 | 显示全部楼层
看偶很落伍了,还是搞搞代码去
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 11:25 , Processed in 0.140400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表