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

📄 led8.lst

📁 嵌入式系统中的一个显示器的驱动程序
💻 LST
字号:
C51 COMPILER V6.12  LED8                                                                   02/24/2005 10:39:02 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE LED8
OBJECT MODULE PLACED IN .\Led8.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\Led8.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <AT89X51.h>	// use philips 89v51RD2
   2          sfr WDTC = 0xC0;	//watch dog
   3          sfr WDTD = 0x85;
   4          
   5          void initial_system();	////串口方式1,允许接收,定时器1方式2,定时器0方式1
   6          char get();			//读取串口,如超过312.5uS则置超时标志 time_overflow=0xFF
   7          void put(char);
   8          void display();		//显示disp_buffer[0~13]中的数,16bit表示一位LED,disp_buffer[1]==最左边的LED disp_buffer[0
             -].7==1表示同时显示一个小数点,其他LED以此类推
   9          void self_test();	//自测模式,依次点亮LED的每一笔段
  10          void delay(unsigned int time);	//软件延时
  11          void ModbusCrc(unsigned char x);// modbus协议CRC校验, R7为输入校验字节,CRC2为校验字
  12          void clear_dog();		// clear watch dog time
  13          
  14          unsigned char code SEG7[]={0x7D,0x0C,0xB5,0x9D,0xCC,0xD9,0xF9,0x0D,0xFD,0xDD,0xED,0xF8,0x71,0xBC,0xF1,0xE1
             -,0x80,0x70,0x00};//字符0~9,'A'~'F','-','L',' '
  15          unsigned char xdata buffer[25];
  16          unsigned char xdata disp_buffer[14];//一个是串口接收缓存,另一个是显示缓存
  17          unsigned char time_overflow;	//超时标志位
  18          unsigned int  CRC2;		//用于CRC校验函数的变量
  19          
  20          main(){
  21   1      unsigned char i;
  22   1      	initial_system();
  23   1      	while(1)
  24   1      	{
  25   2      		while(get()!= 0x01)
  26   2      			;		//wait myself address
  27   2      		buffer[0]= 0x01;
  28   2      		i= 1;
  29   2      		time_overflow=0x00;
  30   2      		while(time_overflow==0x00){
  31   3      			buffer[i]= get();
  32   3      			i++;
  33   3      			if(i>25)	i=25;
  34   3      		}
  35   2      		if(i<25){		//三个功能:06H--写一位LED, 10H--写全部7位LED, 16H--自测,依次点亮LED的每一笔段
  36   3      			switch(buffer[1]){	//select the fuction code
  37   4      				case	0x10:	//写多寄存器,格式: 01,10,00,01,00,07,0e,14Byte data,CRC_high,CRC_low
  38   4      					if(i!=24 || buffer[2]!=0x00 || buffer[3]!=0x00 || buffer[4]!=0x00 || buffer[5]!=0x07 || buffer[6]!=0x
             -0E)//一共收23位数据,加上超时出错执行一次i++,所以i=24
  39   4      						break;		//地址不是从0001开始的,写字节数不等于14 word的,都认为出错
  40   4      					for(i=0,CRC2=0xFFFF;i<21;i++)
  41   4      						ModbusCrc(buffer[i]);//计算crc
  42   4      					if((buffer[22]==CRC2/256) && (buffer[21]==CRC2%256)){
  43   5      							for(i=0;i<14;i++)
  44   5      								disp_buffer[i]= buffer[i+7];
  45   5      							display();
  46   5      							for(i=0,CRC2=0xFFFF;i<6;i++)		//计算并返回报文
  47   5      								ModbusCrc(buffer[i]);
  48   5      							buffer[6]= CRC2%256;
  49   5      							buffer[7]= CRC2/256;
  50   5      							for(i=0;i<8;i++)
  51   5      								put(buffer[i]);
  52   5      					}
C51 COMPILER V6.12  LED8                                                                   02/24/2005 10:39:02 PAGE 2   

  53   4      					break;
  54   4      				case	0x06:	//写单寄存器,格式: 01,06,address_high,address_low,data_high,data_low,CRC
  55   4      					if(i!=9 || buffer[2]!=0x00 || buffer[3]>0x06)
  56   4      						break;	//地址不是从0001开始的,都认为出错
  57   4      					for(i=0,CRC2=0xFFFF;i<6;i++)
  58   4      						ModbusCrc(buffer[i]);//计算crc
  59   4      					if((buffer[7]==CRC2/256) && (buffer[6]==CRC2%256)){
  60   5      							i= buffer[3];
  61   5      							disp_buffer[i*2]= buffer[4];
  62   5      							disp_buffer[i*2+1]= buffer[5];
  63   5      							display();
  64   5      							for(i=0;i<8;i++)
  65   5      								put(buffer[i]);		//正常处理返回报文
  66   5      					}
  67   4      					break;
  68   4      			   	case	0x16:		//附加功能自我测试,格式: 01,16,ff,ff,ff,ff,ff,ff,ff,ff,CRC
  69   4      					for(i=0,CRC2=0xFFFF;i<10;i++)
  70   4      						ModbusCrc(buffer[i]);//计算crc
  71   4      					if(buffer[2]==0xff && buffer[3]==0xff && buffer[4]==0xff && buffer[5]==0xff && buffer[6]==0xff && buf
             -fer[7]==0xff && buffer[8]==0xff && buffer[9]==0xff)
  72   4      							if((buffer[11]==CRC2/256) && (buffer[10]==CRC2%256)){
  73   5      								for(i=0;i<12;i++)
  74   5      									put(buffer[i]);
  75   5      								self_test();
  76   5      							}
  77   4      					break;
  78   4      				case	0x03:
  79   4      					for(i=0,CRC2=0xFFFF;i<6;i++)
  80   4      						ModbusCrc(buffer[i]);//计算crc
  81   4      						disp_buffer[0]=1;//---------
  82   4      						display();//------------
  83   4      					if((buffer[4]==0) && (buffer[5]==1) && (buffer[6]==CRC2%256) && (buffer[7]==CRC2/256)){//只允许读一个
             -字节
  84   5      						buffer[2]= 2;//byte of counts
  85   5      						buffer[3]= buffer[4]= 0;//response data
  86   5      						for(i=0,CRC2=0xFFFF;i<5;i++)
  87   5      							ModbusCrc(buffer[i]);//计算crc
  88   5      						buffer[5]= CRC2%256;	buffer[6]=CRC2/256;//CRC
  89   5      						for(i=0;i<7;i++)
  90   5      							put(buffer[i]);
  91   5      					 }
  92   4      					break;
  93   4      				}
  94   3      		}
  95   2      	}
  96   1      }
  97          
  98          void initial_system(){
  99   1      unsigned char i;
 100   1      	P2= 0xff;
 101   1      	P0= 0xff;	//笔段全亮
 102   1      	delay(65000);
 103   1      	delay(65000);
 104   1      	SCON = 0x50; //串口方式1,允许接收
 105   1      	TMOD = 0x21; //定时器1方式2,定时器0方式1
 106   1      	TR1 = 1; //设定时器1开始计数
 107   1      	TH1=TL1= 0xFD; //11.0592MHz 9600波特率
 108   1      	TH0=TL0= 0x00;
 109   1      	TI = 1;
 110   1      	if((WDTC & 0x04)== 0){		//是上电复位,初始化显示	
 111   2      		for(i=0;i<14;i++)
 112   2      			disp_buffer[i]= 0x10; // '-'
C51 COMPILER V6.12  LED8                                                                   02/24/2005 10:39:02 PAGE 3   

 113   2      	}
 114   1      	display();
 115   1      	WDTC= 0x0b;	// start watch_dog, about 5s overflow
 116   1      }
 117          
 118          
 119          void display(){
 120   1      unsigned char i,ch,latch;
 121   1      	i= 0;
 122   1      	latch= 0x02;
 123   1      	while(latch >0){
 124   2      		ch= disp_buffer[i+1];
 125   2      		if (disp_buffer[i] < 0x80)		//最高位为1,表示本位要显示一个小数点
 126   2      			P0= SEG7[ch];
 127   2      		else
 128   2      			P0= SEG7[ch] | 0x02;		//显示一个小数点
 129   2      		P2= latch;
 130   2      		delay(20);
 131   2      		P2= 0x00;
 132   2      		latch= latch <<1;
 133   2      		i= i+2;
 134   2      	}
 135   1      }
 136          
 137          void self_test(){
 138   1      unsigned char i;
 139   1      	P2= 0xff;
 140   1      	P0= 0x01;
 141   1      	delay(50000);
 142   1      	delay(50000);
 143   1      	for(i=0;i<7;i++){
 144   2      		P0= P0<<1;
 145   2      		clear_dog();
 146   2      		delay(50000);
 147   2      		delay(50000);
 148   2      	}
 149   1      	P2= 0xff;
 150   1      	P0= 0xff;	//笔段全亮
 151   1      	while(1);
 152   1      }
 153          
 154          void delay(unsigned int time){
 155   1      unsigned int v_delay;
 156   1      	for(v_delay=0; v_delay<time; v_delay++);
 157   1      }
 158          
 159          void ModbusCrc(unsigned char x)
 160          {
 161   1      unsigned char k,v;
 162   1      CRC2=CRC2^x;
 163   1      for(k=0;k<8;k++)
 164   1            {
 165   2            v=CRC2 %2;
 166   2            CRC2=CRC2>>1;
 167   2            if(v==1) {CRC2=CRC2^0xa001;}
 168   2            }
 169   1      }
 170          
 171          char get(){
 172   1      	time_overflow= 0x00;
 173   1      	TF0= 0;
 174   1      	TH0= 0xF0;	//about 5ms @ 12 clock
C51 COMPILER V6.12  LED8                                                                   02/24/2005 10:39:02 PAGE 4   

 175   1      	TR0=1;			//计数一次=1.085us @ 11.0592MHz / 12 colck mode 
 176   1      	while(RI==0){	
 177   2      		clear_dog();
 178   2      		if(TF0==1){
 179   3      			time_overflow=0xFF;
 180   3      			return(0);
 181   3      		}
 182   2      	}
 183   1      	RI= 0;
 184   1      	return(SBUF);
 185   1      }
 186          
 187          void put(char ch)
 188          {
 189   1      	TI= 0;
 190   1      	SBUF= ch;
 191   1      	while(!TI);
 192   1      }
 193          
 194          void clear_dog()
 195          {
 196   1      	WDTC= 0x0b;	//clear dog
 197   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1008    ----
   CONSTANT SIZE    =     19    ----
   XDATA SIZE       =     39    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       4
   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 + -