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

📄 51

📁 51单片机大量源码
💻
字号:
C51 COMPILER V8.02   1602SHIZHONG                                                          07/23/2009 15:22:57 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 1602SHIZHONG
OBJECT MODULE PLACED IN 1602shizhong.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602shizhong.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include"REGx52.h"
   2          #include"RICHMCU.H"
   3          sbit a0 = ACC^0;
   4          sbit a1 = ACC^1;
   5          sbit a2 = ACC^2;
   6          sbit a3 = ACC^3;
   7          sbit a4 = ACC^4;
   8          sbit a5 = ACC^5;
   9          sbit a6 = ACC^6;
  10          sbit a7 = ACC^7;
  11          sbit DQ = P3^3 ;                //18B20接口
  12          sbit speaker = P3^6 ;   //蜂鸣器
  13          sbit MODE = P1^4 ;      //模式键
  14          sbit INC = P1^5 ;       //增加键
  15          sbit DEC = P1^6 ;       //减少键
  16          sbit OK = P1^7 ;        //OK键
  17          #define LCD1602_DATA P0 //8位数据并行口
  18          #define LCD1602_RS P2_0 //指令OR数据寄存器选择
  19          #define LCD1602_RW P2_1 //读写控制
  20          #define LCD1602_EN P2_2 //使能控制
  21          #define LCD1602_CLR 0x01        //清屏
  22          #define LCD1602_MODE 0x38       //8位数据,双列显示,5*7字形
  23          #define LCD1602_ON 0x0c //开显示,关光标,光标不闪烁
  24          #define LCD1602_ADDR_MODE 0x06          //地址递增
  25          #define DS1302_SCLK P1_0        //1302时钟线    
  26          #define DS1302_IO P1_1          //1302数据线
  27          #define DS1302_RST P1_2         //1302复位线
  28          
  29          volatile uint8 data timedata[7] ;       //时间值
  30          volatile uint8 data display_buffer1[16];        //显示缓冲区1 
  31          volatile uint8 data display_buffer2[16];        //显示缓冲区2
  32          volatile uint8 data temdata[5] ;        //存放温度值
  33          volatile uint16 data tdat ;     //温度值变量
  34          volatile uint8 data tflag ;     //温度正负值标志
  35          volatile int8 self_pos = 0 ;//自定义三角形标志显示位置变量
  36          volatile uint8 OK_VALUE = 0 ; //OK键键值变量 
  37          volatile bit bdata DIS_ON = 1 ; //显示开关位 1 == on 0 == off
  38          volatile bit bdata SCAN_ON = 0 ; //按键扫描开关位,由定时器每20MS刷新
  39          volatile data MODE_ON = 0 ; //模式键按下后显示菜单的开关位
  40          volatile data INC_VALUE = 0 ;
  41          volatile data DEC_VALUE = 0 ;
  42          volatile bit bdata ALARM_VALUE = 0 ;//闹钟标志位 
  43          volatile bit bdata ALARM_ON = 1 ; //闹钟响时关闭标志位
  44          volatile uint8 data read_1 = 1,read_2 = 1,read_3 = 1,read_4 = 1;
  45          volatile uint8 data stopwatch_count = 0;
  46          volatile uint8 data stopwatch_second = 0;
  47          volatile uint8 data stopwatch_minute  = 0;
  48          volatile bit bdata STOPWATCH_START = 0;
  49          uint8 code self_table1[]={
  50                                                          0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//      年
  51                                                          0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月
  52                                                          0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,//      日
  53                                                          0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志
  54                                                          0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10 };//三角形符号                                                          
  55          
C51 COMPILER V8.02   1602SHIZHONG                                                          07/23/2009 15:22:57 PAGE 2   

  56          
  57          /**********************************************************
  58          蜂鸣器
  59          ************************************************************/
  60          void delay_ms(uint16 count)        // 延时时间count*1ms
  61          {       uint16 i;
  62   1              for(;count>0;count--)
  63   1              {
  64   2                      for(i=0;i<110;i++)
  65   2                      {
  66   3                              nop;
  67   3                      }
  68   2              }
  69   1      }
  70          void speakers(uint8 speak_count)
  71          {
  72   1              for(;speak_count>0;speak_count--)
  73   1                      {
  74   2                              speaker = 0 ;
  75   2                              delay_ms(1) ;
  76   2                              speaker = 1 ;
  77   2                              delay_ms(3) ;
  78   2                      }
  79   1      }
  80          /***********************************************************
  81          忙检测
  82          ************************************************************/
  83           void LCD1602_check_busy(void)
  84          {
  85   1              LCD1602_DATA = 0xff;
  86   1              LCD1602_RS = 0 ;        
  87   1              LCD1602_RW = 1 ;        
  88   1              LCD1602_EN = 1 ;        
  89   1              while(LCD1602_DATA & 0x80) ;    
  90   1              LCD1602_EN = 0 ;                        
  91   1      }
  92          
  93          /**********************************************************
  94          写指令
  95          ************************************************************/
  96          
  97           void LCD1602_write_cmd(uint8 cmd)
  98          {
  99   1              LCD1602_check_busy();   
 100   1              LCD1602_RS = 0 ;        
 101   1              LCD1602_RW = 0 ;        
 102   1              LCD1602_DATA = cmd ;    
 103   1              LCD1602_EN = 1 ;        
 104   1              LCD1602_EN = 0 ;
 105   1      }
 106          
 107          /***********************************************************
 108          写数据
 109          *************************************************************/
 110           void LCD1602_write_data(uint8 dat)
 111          {
 112   1              LCD1602_check_busy();   
 113   1              LCD1602_RS = 1 ;        
 114   1              LCD1602_RW = 0 ;        
 115   1              LCD1602_DATA = dat ;    
 116   1              LCD1602_EN = 1 ;        
 117   1              LCD1602_EN = 0 ;
C51 COMPILER V8.02   1602SHIZHONG                                                          07/23/2009 15:22:57 PAGE 3   

 118   1      }
 119          
 120          
 121          /***********************************************************
 122          1602初始化
 123          ************************************************************/
 124           void LCD1602_init(void)
 125          {
 126   1              uint8 i  ;
 127   1              LCD1602_write_cmd(0x40);//CGRAM起始地址
 128   1              for(i=0;i<40;i++)
 129   1                      LCD1602_write_data(self_table1[i]);//写入自定义字符
 130   1              LCD1602_write_cmd(LCD1602_MODE) ;
 131   1              LCD1602_write_cmd(LCD1602_ON) ;
 132   1              LCD1602_write_cmd(LCD1602_ADDR_MODE) ;
 133   1              LCD1602_write_cmd(LCD1602_CLR) ;
 134   1      }
 135          
 136          /************************************************************
 137          设置显示坐标
 138          ************************************************************/
 139           void LCD1602_set_postion(uint8 x , uint8 y)
 140          {
 141   1              if(y<2)
 142   1                      {
 143   2                              y &= 0x01 ;     //y值限定在0~1之间
 144   2                              x &= 0x0f ;     //x值限定在0~15之间
 145   2                              if(y == 0)
 146   2                                      x |= 0x40 ;     //如果显示是在第二行,则x的值加0x40
 147   2                              x |= 0x80 ;             //获得x的值
 148   2                              LCD1602_write_cmd(x) ;//写入坐标值到LCD
 149   2                      }
 150   1      }
 151          
 152          /************************************************************
 153          指定位置写字符
 154          *************************************************************/
 155           void LCD1602_write_char(uint8 x , uint8 y , uint8 chardata)
 156          {
 157   1              LCD1602_set_postion(x,y) ;
 158   1              LCD1602_write_data(chardata) ;
 159   1      }
 160          
 161          /************************************************************
 162          指定位置写字符串
 163          *************************************************************/
 164           void LCD1602_write_string(uint8 x , uint8 y , uint8 *string)
 165          {
 166   1              LCD1602_set_postion(x,y) ;
 167   1              while((*string) != '\0')
 168   1              {       
 169   2                      LCD1602_write_data(*string) ;
 170   2                      string++ ;
 171   2              }
 172   1      }
 173          /***************************************************************
 174          指定位置显示自定义字符
 175          **************************************************************
 176          uint8 LCD1602_display_self(uint8 count)
 177          {
 178                  switch(count)
 179                          {
C51 COMPILER V8.02   1602SHIZHONG                                                          07/23/2009 15:22:57 PAGE 4   

 180                                  case 0 : sele_count = 0 ; break ;
 181                                  case 1 : sele_count = 1 ; break ;
 182                                  case 2 : sele_count = 2 ; break ;
 183                                  case 3 : sele_count = 3 ; break ;
 184                                  default : break ;
 185                          }
 186                  return(self_count) ;
 187          }*/
 188          
 189          
 190          /****************************************************************
 191          底层驱动函数(输入)
 192          *****************************************************************/
 193           void DS1302_input(uint8 inputdata)
 194          {
 195   1              ACC = inputdata ;
 196   1              DS1302_IO = a0 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 197   1              DS1302_IO = a1 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 198   1              DS1302_IO = a2 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 199   1              DS1302_IO = a3 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 200   1              DS1302_IO = a4 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 201   1              DS1302_IO = a5 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 202   1              DS1302_IO = a6 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 203   1              DS1302_IO = a7 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
 204   1      }
 205          
 206          /****************************************************************
 207          底层驱动函数(输出)控制位的第七位必须为1
 208          *****************************************************************/
 209           uint8 DS1302_output(void)
 210          {
 211   1              DS1302_IO = 1 ;
 212   1              a0 = DS1302_IO ;
 213   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a1 = DS1302_IO ;
 214   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a2 = DS1302_IO ;
 215   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a3 = DS1302_IO ;
 216   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a4 = DS1302_IO ;
 217   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a5 = DS1302_IO ;
 218   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a6 = DS1302_IO ;
 219   1              DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a7 = DS1302_IO ;
 220   1              return(ACC);
 221   1      }
 222          
 223          /****************************************************************
 224          底层驱动函数(指定地址写一个字节的数据)
 225          *****************************************************************/
 226           void DS1302_write_byte(uint8 cmd , uint8 dat)
 227          {
 228   1              DS1302_SCLK = 0 ;
 229   1              DS1302_RST = 0 ;
 230   1              DS1302_RST = 1 ;
 231   1              DS1302_input(cmd) ;
 232   1              DS1302_input(dat) ;
 233   1              DS1302_RST = 0 ;
 234   1              DS1302_SCLK = 1 ;
 235   1      }
 236          
 237          /****************************************************************
 238          底层驱动函数(指定地址读取一字节的数据)
 239          *****************************************************************/
 240           uint8 DS1302_read_byte(uint8 cmd)
 241          {
C51 COMPILER V8.02   1602SHIZHONG                                                          07/23/2009 15:22:57 PAGE 5   

 242   1              uint8 receivedata = 0 ;
 243   1              DS1302_SCLK = 0 ;
 244   1              DS1302_RST = 0 ;
 245   1              DS1302_RST = 1 ;
 246   1              DS1302_input(cmd) ;
 247   1              receivedata = DS1302_output() ;
 248   1              DS1302_RST = 0 ;
 249   1              DS1302_SCLK = 1 ;
 250   1              return(receivedata) ;
 251   1      }
 252          
 253          /********************************************************
 254          设置1302的初始时间
 255          *********************************************************/
 256           void DS1302_init()
 257          {       
 258   1                      if(DS1302_read_byte(0xc9) != 0xf0) 
 259   1                      {
 260   2                              DS1302_write_byte(0x8e,0x00) ;//允许写操作
 261   2                              DS1302_write_byte(0xc8,0xf0) ; //写入初始化标志 ,系统上电后检测此标志,即此子函数只会在第一次初始化一

⌨️ 快捷键说明

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