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

📄 text1.lst

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.20   TEXT1                                                                 07/24/2007 21:33:14 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg51.h>
   2          #include<intrins.h>
   3          #define uint unsigned int
   4          #define uchar unsigned char
   5          #define ulong  unsigned long
   6          //数据口定义
   7          #define lcd1602_bus P3  
   8          #define data P1   //the data interface between 51 and DDS(ad9850)
   9          sbit W_CLK= P2^1;
  10          sbit PQ_UD= P2^2;
  11                   
  12          
  13          //引脚定义
  14          sbit rs_1602=P2^5;           
  15          sbit rw_1602=P2^6;
  16          sbit e_1602=P2^7;
  17          sbit alarm=P0^0;
  18          
  19          
  20          /*********延时子程序**********/
  21          void delay_1ms(uint t)
  22          {
  23   1         uint i,j;
  24   1         for(i=0;i<t;i++)
  25   1           for(j=0;j<120;j++);              
  26   1      }
  27          
  28          void delay(uchar t)
  29          {
  30   1              uchar i;
  31   1              while(t--)
  32   1              {
  33   2                      /* 对于11.0592M时钟,约延时1ms */
  34   2                      for (i=0;i<125;i++)
  35   2                      {}
  36   2              }
  37   1      } 
  38          
  39          
  40          
  41          
  42          
  43          
  44          
  45          /***********忙判断标志,返回一个位BF********************/
  46          bit lcd1602_busy(void)
  47          {
  48   1              uchar busy_flag;
  49   1              rs_1602=0;
  50   1              rw_1602=1;
  51   1              _nop_();
  52   1              e_1602=1;
  53   1              _nop_();
  54   1              lcd1602_bus=0xff;
  55   1              busy_flag=lcd1602_bus;   //e在高电平时读 
C51 COMPILER V7.20   TEXT1                                                                 07/24/2007 21:33:14 PAGE 2   

  56   1              e_1602=0;
  57   1              return (bit)(busy_flag&0x80);    //BF=1; BUSY  返回一个位
  58   1      }
  59          
  60          
  61          /********写命令,有两个参数,一个是要写的命令控制字,
  62          第二个是用来控制是否进行忙标志的判断。
  63          busyflag=1;
  64          判断: 为0 
  65          ***************/
  66          void lcd1602_wrcmd(unsigned char lcdcmd)
  67          {
  68   1              while(lcd1602_busy());     //等待空闲
  69   1              lcd1602_bus=lcdcmd;
  70   1              rs_1602=0;
  71   1              rw_1602=0;
  72   1              _nop_();
  73   1              e_1602=1;
  74   1              _nop_();
  75   1              _nop_();
  76   1              e_1602=0;      //产生一个下沿     
  77   1      }
  78          
  79          
  80          
  81          /***************向液晶写数据******************/
  82          void lcd1602_wrdata(uchar lcddata)
  83          {
  84   1       while(lcd1602_busy());       //等待空闲
  85   1       lcd1602_bus=lcddata;             //在下沿的时候写数据
  86   1       rs_1602=1;
  87   1       rw_1602=0;
  88   1       _nop_();
  89   1       e_1602=1;
  90   1       _nop_();
  91   1       _nop_();
  92   1       e_1602=0;
  93   1       //lcd_bus=0xff;
  94   1      }
  95          
  96          
  97          /************液晶的清屏************/
  98          void lcd1602_clear(void)
  99          {
 100   1        lcd1602_wrcmd(0x01);     //液晶清屏控制字     并延时>40us
 101   1        delay(1);
 102   1      }
 103          
 104          /***********1602液晶的初始化***************/
 105          void lcd1602_init(void)
 106          {
 107   1        lcd1602_wrcmd(0x38);          //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
 108   1        delay(1);
 109   1        lcd1602_wrcmd(0x0e);         //显示开关控制----显示开关开,光标开关关,闪烁开关关
 110   1        delay(1);
 111   1        lcd1602_wrcmd(0x06);         //输入方式设置,AC自增1, S=0;
 112   1        delay(1);                
 113   1        lcd1602_wrcmd(0x01);         //清屏
 114   1        delay(1);
 115   1      }
 116          
 117          
C51 COMPILER V7.20   TEXT1                                                                 07/24/2007 21:33:14 PAGE 3   

 118          /**********4*4矩阵键盘****************/
 119          /************
 120           矩阵键盘
 121          D---------P1.0
 122          C---------P1.1
 123          B---------P1.2
 124          A---------P1.3
 125          1---------P1.4
 126          2---------P1.5
 127          3---------P1.6
 128          4---------P1.7
 129          按键值的分布
 130             D   C  B  A
 131          1〔15 14 13 12〕
 132          2〔11 10  9  8〕
 133          3〔 7  6  5  4〕
 134          4〔 3  2  1  0〕
 135          利用已有的那个按键程序  */
 136          
 137          
 138          
 139          
 140          
 141          
 142          uchar getkey_ii()
 143          
 144          {
 145   1          unsigned char keycode=0xff,temp,i;
 146   1          P1=0x0f;
 147   1          temp=P1&0x0f;
 148   1          if(temp!=0x0f)        //判是否有键按下
 149   1          {
 150   2             // beep=0;
 151   2              P1=0xef;          //自第0行开始扫描输出,自列读入键值
 152   2              for(i=0;i<4;i++)
 153   2              {
 154   3                  temp=P1&0x0f;
 155   3                  if(temp==0x07)     //判断第0列是否有键按下
 156   3                  {    
 157   4                      keycode=i*4+0;
 158   4                      break;
 159   4                  }
 160   3                  else if(temp==0x0b)//判断第1列是否有键按下
 161   3                  {
 162   4                      keycode=i*4+1;
 163   4                      break;                                                                                    
 164   4                  }
 165   3                  else if(temp==0x0d)//判断第2列是否有键按下
 166   3                  {
 167   4                      keycode=i*4+2;
 168   4                      break;
 169   4                  }
 170   3                  else if(temp==0x0e)//判断第3列是否有键按下
 171   3                  {
 172   4                      keycode=i*4+3;
 173   4                      break;
 174   4                  }
 175   3                  P1=(P1<<1)|0x1;
 176   3              }
 177   2      
 178   2               while((P1&0x0f)!=0x0f)   //等待释放
 179   2               {
C51 COMPILER V7.20   TEXT1                                                                 07/24/2007 21:33:14 PAGE 4   

 180   3                   P1=0x0f;
 181   3               }
 182   2          //   beep=1;                                             
 183   2              
 184   2           }
 185   1           return keycode;
 186   1      }
 187          
 188          
 189          
 190          void xianshu(unsigned long a)
 191          {          unsigned long c,p=0;
 192   1                                      if (a!=0) 
 193   1                              {       
 194   2                      
 195   2                                      c=a/1000000000;
 196   2                                      if(c!=0)
 197   2                      {lcd1602_wrdata(c+0x30);
 198   3                                   p=1;
 199   3                                       }
 200   2                       c=(a%1000000000)/100000000;
 201   2                       if(c!=0 || p==1)
 202   2                       {lcd1602_wrdata(c+0x30);
 203   3                                    }
 204   2                       c=(a%100000000)/10000000;
 205   2                       if(c!=0 || p==1)
 206   2                       {lcd1602_wrdata(c+0x30);
 207   3                                    }
 208   2      
 209   2                       c=(a%10000000)/1000000;
 210   2                       if(c!=0 || p==1)
 211   2                       {lcd1602_wrdata(c+0x30);
 212   3                                    }
 213   2                        c=(a%1000000)/100000;
 214   2                      if(c!=0 || p==1)
 215   2                       {lcd1602_wrdata(c+0x30);
 216   3                                    }
 217   2                       c=(a%100000)/10000;
 218   2                      if(c!=0 || p==1)
 219   2                       {lcd1602_wrdata(c+0x30);
 220   3                                    }               
 221   2                      c=(a%10000)/1000;
 222   2                      if(c!=0 || p==1)
 223   2                       {lcd1602_wrdata(c+0x30);
 224   3                                    }
 225   2                      
 226   2                                      c=(a%1000)/100;
 227   2                      if(c!=0 || p==1)

⌨️ 快捷键说明

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