⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4_bit_digital_clock.lst

📁 《爱上单片机》配书光盘
💻 LST
字号:
C51 COMPILER V6.12  4_BIT_DIGITAL_CLOCK                                                    06/26/2009 03:18:36 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE 4_BIT_DIGITAL_CLOCK
OBJECT MODULE PLACED IN 4_Bit_Digital_Clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 4_Bit_Digital_Clock.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          	   /*********************************************************************************************/
   2          
   3          #include <STC12C2052AD.H> //STC头文件
   4          
   5          /**********************************************************************************************/
   6          //“程序开发调试设置项”
   7          #define DY_LI			9	 //设置LED显示的亮度(值域:1~9)
   8          #define DY_DELAY		12 	//设置每一个点显示的时间长度(1~20)
   9          /**********************************************************************************************/
  10          sbit	DY_LED1_H1	=P3 ^ 0; //设置LED点阵屏连接的I/O口
  11          sbit	DY_LED1_H2	=P3 ^ 1; //设置LED点阵屏连接的I/O口
  12          sbit	DY_LED1_H3	=P3 ^ 2; //设置LED点阵屏连接的I/O口
  13          sbit	DY_LED1_H4	=P3 ^ 3; //设置LED点阵屏连接的I/O口
  14          
  15          sbit	DY_LED1_L1	=P1 ^ 0; //设置LED点阵屏连接的I/O口
  16          sbit	DY_LED1_L2	=P1 ^ 1; //设置LED点阵屏连接的I/O口
  17          sbit	DY_LED1_L3	=P1 ^ 2; //设置LED点阵屏连接的I/O口
  18          sbit	DY_LED1_L4	=P1 ^ 3; //设置LED点阵屏连接的I/O口
  19          sbit	DY_LED1_L5	=P1 ^ 4; //设置LED点阵屏连接的I/O口
  20          sbit	DY_LED1_L6	=P1 ^ 5; //设置LED点阵屏连接的I/O口
  21          sbit	DY_LED1_L7	=P1 ^ 6; //设置LED点阵屏连接的I/O口
  22          sbit	DY_LED1_L8	=P1 ^ 7; //设置LED点阵屏连接的I/O口
  23          
  24          //sbit	DY_BEEP		=P2 ^ 2; //扬声器
  25          //sbit	DY_KEY1		=P0 ^ 2; //按键1(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)
  26          //sbit	DY_KEY2		=P3 ^ 0; //按键2(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)
  27          //sbit	DY_KEY3		=P3 ^ 6; //按键3(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)
  28          
  29          #define DY_P1M0SET		0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
  30          #define DY_P1M1SET		0x00 //设置I/O口工作方式//00101000
  31          #define DY_P3M0SET		0x00 //设置I/O口工作方式//00000000
  32          #define DY_P3M1SET		0xff //设置I/O口工作方式//10010100
  33          data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分
             -、秒和温度存放区
  34          data unsigned char cou  = 0;     // 软计数器,对10ms时基信号累加到1s 
  35          data unsigned char bn;//扫描映射全局变量
  36          data unsigned char KEY_BIT = 0;//按键值
  37          data unsigned char DY_PWM;//显示亮度
  38          data unsigned char DY_PWM2;//显示暂存
  39          
  40          
  41          unsigned char code disdata[]={
  42          0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9) 
  43          };
  44          /*********************************************************************************************/
  45          void delay (unsigned int a){ // 用于点扫描的延时
  46   1      	unsigned int i;
  47   1      	while( --a != 0){
  48   2      		for(i = 0; i < DY_DELAY; i++); 
  49   2      	}   				   
  50   1      }
  51          /*********************************************************************************************/
  52          void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
  53   1      	unsigned int i;
  54   1      	while( --a != 0){
C51 COMPILER V6.12  4_BIT_DIGITAL_CLOCK                                                    06/26/2009 03:18:36 PAGE 2   

  55   2      		for(i = 0; i < 600; i++); 
  56   2      	}   				   
  57   1      }
  58          /*********************************************************************************************/
  59          void dis_off (void){
  60   1      	P1 = ~DY_P1M1SET; //关所有显示
  61   1      	P3 = ~DY_P3M1SET;
  62   1      	delay(10-DY_PWM); 
  63   1      }
  64          /*********************************************************************************************/
  65          void displayHH1 (unsigned char d){ //第1列横向显示程序
  66   1      	unsigned char i;
  67   1      	i = d & 0x01;
  68   1      	if(i == 0x01){
  69   2      		DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
  70   1      	i = d & 0x02;
  71   1      	if(i == 0x02){
  72   2      		DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
  73   1      	i = d & 0x04;
  74   1      	if(i == 0x04){
  75   2      		DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
  76   1      	i = d & 0x08;
  77   1      	if(i == 0x08){
  78   2      		DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
  79   1      	i = d & 0x10;
  80   1      	if(i == 0x10){
  81   2      		DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
  82   1      	i = d & 0x20;
  83   1      	if(i == 0x20){
  84   2      		DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
  85   1      	i = d & 0x40;
  86   1      	if(i == 0x40){
  87   2      		DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
  88   1      	i = d & 0x80;
  89   1      	if(i == 0x80){
  90   2      		DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
  91   1      } 
  92          /*********************************************************************************************/
  93          void displayHH2 (unsigned char d){ //第2列横向显示程序
  94   1      	unsigned char i;
  95   1      	i = d & 0x01;
  96   1      	if(i == 0x01){
  97   2      		DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
  98   1      	i = d & 0x02;
  99   1      	if(i == 0x02){
 100   2      		DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
 101   1      	i = d & 0x04;
 102   1      	if(i == 0x04){
 103   2      		DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
 104   1      	i = d & 0x08;
 105   1      	if(i == 0x08){
 106   2      		DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
 107   1      	i = d & 0x10;
 108   1      	if(i == 0x10){
 109   2      		DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
 110   1      	i = d & 0x20;
 111   1      	if(i == 0x20){
 112   2      		DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
 113   1      	i = d & 0x40;
 114   1      	if(i == 0x40){
 115   2      		DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
 116   1      	i = d & 0x80;
C51 COMPILER V6.12  4_BIT_DIGITAL_CLOCK                                                    06/26/2009 03:18:36 PAGE 3   

 117   1      	if(i == 0x80){
 118   2      		DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
 119   1      
 120   1      } 
 121          /*********************************************************************************************/
 122          void displayHH3 (unsigned char d){ //第3列横向显示程序
 123   1      	unsigned char i;
 124   1      	i = d & 0x01;
 125   1      	if(i == 0x01){
 126   2      		DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
 127   1      	i = d & 0x02;
 128   1      	if(i == 0x02){
 129   2      		DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
 130   1      	i = d & 0x04;
 131   1      	if(i == 0x04){
 132   2      		DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
 133   1      	i = d & 0x08;
 134   1      	if(i == 0x08){
 135   2      		DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
 136   1      	i = d & 0x10;
 137   1      	if(i == 0x10){
 138   2      		DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
 139   1      	i = d & 0x20;
 140   1      	if(i == 0x20){
 141   2      		DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
 142   1      	i = d & 0x40;
 143   1      	if(i == 0x40){
 144   2      		DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
 145   1      	i = d & 0x80;
 146   1      	if(i == 0x80){
 147   2      		DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
 148   1      
 149   1      } 
 150          /*********************************************************************************************/
 151          void displayHH4 (unsigned char d){ //第4列横向显示程序
 152   1      	unsigned char i;
 153   1      	i = d & 0x01;
 154   1      	if(i == 0x01){
 155   2      		DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
 156   1      	i = d & 0x02;
 157   1      	if(i == 0x02){
 158   2      		DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
 159   1      	i = d & 0x04;
 160   1      	if(i == 0x04){
 161   2      		DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
 162   1      	i = d & 0x08;
 163   1      	if(i == 0x08){
 164   2      		DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
 165   1      	i = d & 0x10;
 166   1      	if(i == 0x10){
 167   2      		DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
 168   1      	i = d & 0x20;
 169   1      	if(i == 0x20){
 170   2      		DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
 171   1      	i = d & 0x40;
 172   1      	if(i == 0x40){
 173   2      		DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
 174   1      	i = d & 0x80;
 175   1      	if(i == 0x80){
 176   2      		DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
 177   1      } 
 178          /*********************************************************************************************/
C51 COMPILER V6.12  4_BIT_DIGITAL_CLOCK                                                    06/26/2009 03:18:36 PAGE 4   

 179          void diplay_data (unsigned char l,unsigned char d){
 180   1      		switch (l){//显示的列位置		
 181   2      				case 1://			
 182   2      					displayHH1(d); //将显示数据送入		
 183   2      					break;//		
 184   2      				case 2://			
 185   2      					displayHH2(d); //将显示数据送入		
 186   2      					break;//		
 187   2      				case 3://			
 188   2      					displayHH3(d); //将显示数据送入		
 189   2      					break;//		
 190   2      				case 4://			
 191   2      					displayHH4(d); //将显示数据送入		
 192   2      					break;//		
 193   2      		}
 194   1      }
 195          /*********************************************************************************************/
 196          void init (void){ //上电初始化
 197   1      	P1M0 = DY_P1M0SET;
 198   1      	P1M1 = DY_P1M1SET;
 199   1      	P3M0 = DY_P3M0SET;
 200   1      	P3M1 = DY_P3M1SET;
 201   1      ////
 202   1      	dis_off(); 
 203   1      	DY_PWM = DY_LI;
 204   1      ////
 205   1      	TMOD = 0x11;         // 定时/计数器0,1工作于方式1   
 206   1          TH0 = 0x3c;          // 预置产生50ms时基信号   
 207   1          TL0 = 0xb0;   
 208   1          EA = 1;              // 开总中断   
 209   1          ET0 = 1;             // 定时/计数器0允许中断   
 210   1          TR0 = 1;             // 开闭定时/计数器0   
 211   1      ////
 212   1      	//TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值
 213   1      	//TIME_MO	= 5; //初始时间:2009年5月18日周一,20时13分40秒
 214   1      	//TIME_YY = 9;
 215   1      	//TIME_WW = 1;
 216   1      	//TIME_HH	= 22;
 217   1      	//TIME_MM = 13;
 218   1      	//TIME_SS = 40;
 219   1      }
 220          /*********************************************************************************************/
 221          void main (void){ //主程序 
 222   1      	init();
 223   1      	while (1){
 224   2      				diplay_data (1,disdata[TIME_MM/10]);
 225   2      				diplay_data (2,disdata[TIME_MM%10]);
 226   2      				diplay_data (3,disdata[TIME_SS/10]+0x80);
 227   2      				diplay_data (4,disdata[TIME_SS%10]+0x80);
 228   2      
 229   2      	}
 230   1      }
 231          /**********************************************************************************************/	
 232          void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   
 233   1          cou++;                      // 软计数器加1   
 234   1          if(cou > 19){                 // 计数值到100(1s)   
 235   2              cou = 0;               // 软计数器清零   
 236   2              TIME_SS++;                 // 秒计数器加1(进位10ms*100=1s)   
 237   2              if(TIME_SS > 59){          // 秒计数值到60   
 238   3                 
 239   3                  TIME_SS = 0;           // 秒计数器清零   
 240   3                  TIME_MM++;             // 分计数器加1(进位60s=1m)  
C51 COMPILER V6.12  4_BIT_DIGITAL_CLOCK                                                    06/26/2009 03:18:36 PAGE 5   

 241   3                  if(TIME_MM > 59){      // 分计数到60   
 242   4                      TIME_MM = 0;       // 分计数器清零   
 243   4                      TIME_HH++;         // 时计数器加1(进位60m=1h)   
 244   4                      if(TIME_HH > 23){  // 时计数到23   
 245   5                          TIME_HH = 0;   // 时计数器清零
 246   5      				}  
 247   4                  }   
 248   3              }   
 249   2          }   
 250   1          TH0 = 0x3c;                // 重置定时常数   
 251   1          TL0 = 0xb0;   
 252   1      }
 253          /**********************************************************************************************/	


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    743    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -