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

📄 12.lst

📁 很精简的LCD12864程序!!!对大家绝对有用
💻 LST
字号:
C51 COMPILER V6.12  12                                                                     09/10/2008 07:48:40 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE 12
OBJECT MODULE PLACED IN .\12.OBJ
COMPILER INVOKED BY: D:\Program Files\keil2\C51\BIN\C51.EXE .\12.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg52.h>
   2          #include <math.h>
   3          #define timer0_count 0xfc18   //64536   65536-64536=1000us=1ms
   4           int sum=0,sec=0,min=0,hour=0;
   5            int i=0;
   6          void lcd_init(void);    //LCD初如化
   7          void clr_lcd(void);    //清显示
   8          void send_com(unsigned char cmd);   //写指令
   9          void send_data(unsigned char dat);   //写数据
  10          void chek_busy(void);         //检测忙
  11          void set_xy(unsigned char xpos,unsigned char ypos);     //认定显示位置
  12          void print(unsigned char x,unsigned char y,char* str);  
  13          void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);
  14          //int m=0;
  15          char code int2charLCD[]="0123456789";
  16          //unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎
  17          //unsigned char code buf1[2] ={0x00,0x00};
  18          //unsigned char buf1[2]={0x00,1};
  19          #define DATA P0         //定义P0为DATA
  20          #define CONTROL P2    //定义P2为控制口
  21          #define E 2 //并行的使能信号 sbit E = P2^2
  22          #define RW 1 //并行的读写信号 sbit RW = P2^1
  23          #define RS 0 //并行的指令数据选择信号 sbit RS = P2^0
  24          #define PSB 3 //并/串行接口选择 sbit PSB = P2^3
  25          #define RST 5 //复位 低电平有效 sbit RST = P2^5
  26          #define SETB(x,y) (x|=(1<<y))
  27          #define CLRB(x,y) (x&=(~(1<<y)))
  28          #define CHKB(x,y) (x&(1<<y))
  29          /********定时器t0初始化**************************/
  30          void timer0_initialize(void)
  31             {
  32   1      	EA=0;
  33   1      //	timer0_tick=0;
  34   1      	TR0=0;
  35   1      	TMOD&=0xf0;
  36   1      	TMOD|=0x01;
  37   1      	TL0=(timer0_count&0xff) ;
  38   1      	TH0=(timer0_count>>8);
  39   1      	PT0=0;
  40   1      	ET0=1;
  41   1      	TR0=1;
  42   1      	EA=1;
  43   1      	}
  44          
  45          
  46          /*********定时器中断服务子程序***************************/
  47          static void time0_isr(void) interrupt 1 using 1
  48           {
  49   1       // int buf1=0;
  50   1       
  51   1        TR0=0;
  52   1        TL0=(timer0_count&0xff);   //将18H放入TL0
  53   1        TH0=(timer0_count>>8);     //右移8位,将fcH放入TH0中
  54   1        TR0=1;
  55   1        i+=1;
C51 COMPILER V6.12  12                                                                     09/10/2008 07:48:40 PAGE 2   

  56   1        if(i>=100)
  57   1          {  i=0;
  58   2      
  59   2         sum=sum+1;
  60   2      	if(sum==10)
  61   2      	  {
  62   3      	     sum=0;
  63   3      		  sec++;
  64   3      		   if(sec==60)
  65   3      			 {
  66   4      			   sec=0;
  67   4      				    min++;
  68   4      					 if(min==60)
  69   4      					   { min=0;
  70   5      					    hour++;
  71   5      						 if(hour==24)
  72   5      						   hour=0;
  73   5      					}  }
  74   3      			 }
  75   2      	  }
  76   1       //  buf1[1]=sum;
  77   1      	}
  78           // }
  79          
  80          
  81          /********************测忙碌**********************/
  82          //测忙碌子程序
  83          //RS=0,RW=1,E=H,D0-D7=状态字
  84          /************************************************/
  85          void chek_busy(void)
  86          { unsigned char temp1;//状态信息(判断是否忙)
  87   1      CLRB(CONTROL,RS); // RS = 0;
  88   1      SETB(CONTROL,RW); // RW = 1;
  89   1      SETB(CONTROL,E); // E = 1;
  90   1      do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);
  91   1      SETB(CONTROL,E); // E = 1;
  92   1      DATA=0xFF;
  93   1      }
  94          /********************写命令**********************/
  95          //写命令子程序
  96          //
  97          /************************************************/
  98          void send_com(unsigned char cmd)/*写命令*/
  99          {
 100   1      chek_busy();
 101   1      CLRB(CONTROL,RS); //RS = 0;
 102   1      CLRB(CONTROL,RW); //RW = 0;
 103   1      DATA = cmd;
 104   1      SETB(CONTROL,E); //E = 1;
 105   1      CLRB(CONTROL,E); //E = 0;
 106   1      }
 107          /********************写数据**********************/
 108          //写数据子程序
 109          //
 110          /************************************************/
 111          void send_data(unsigned char dat)
 112          {
 113   1      chek_busy();
 114   1      SETB(CONTROL,RS); //RS = 1;
 115   1      CLRB(CONTROL,RW); //RW = 0;
 116   1      DATA = dat;
 117   1      SETB(CONTROL,E); //E = 1;
C51 COMPILER V6.12  12                                                                     09/10/2008 07:48:40 PAGE 3   

 118   1      CLRB(CONTROL,E); //E = 0;
 119   1      }
 120          /********************初始化**********************/
 121          //复位、通讯方式选择
 122          /************************************************/
 123          void lcd_init(void)
 124          {
 125   1      SETB(CONTROL,RST);//复位RST=1
 126   1      SETB(CONTROL,PSB); //通讯方式为并口PSB = 1
 127   1      //send_com(0x34);//34H--扩充指令操作
 128   1      send_com(0x30);//功能设置,一次送8位数据,基本指令集
 129   1      send_com(0x0C);//0000,1100 整体显示,游标off,游标位置off
 130   1      send_com(0x01);//0000,0001 清DDRAM
 131   1      send_com(0x02);//0000,0010 DDRAM地址归位
 132   1      send_com(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
 133   1      }
 134          
 135          /*******************************************************************/
 136          // 设置显示位置 xpos(1~16),tpos(1~4)
 137          /*******************************************************************/
 138          void set_xy(unsigned char xpos,unsigned char ypos)
 139          {
 140   1      switch(ypos)
 141   1      {
 142   2      case 1:
 143   2      send_com(0X80|xpos);break;
 144   2      case 2:
 145   2      send_com(0X90|xpos);break;
 146   2      case 3:
 147   2      send_com(0X88|xpos);break;
 148   2      case 4:
 149   2      send_com(0X98|xpos);break;
 150   2      default:break;
 151   2      }
 152   1      }
 153          /*******************************************************************/
 154          // 在指定位置显示字符串
 155          /*******************************************************************/
 156          void print(unsigned char x,unsigned char y,char* str)
 157          {
 158   1      unsigned char lcd_temp;
 159   1      set_xy(x,y);
 160   1      lcd_temp=*str;
 161   1      while(lcd_temp != 0x00)
 162   1      {
 163   2      send_data(lcd_temp);
 164   2      lcd_temp=*(++str);
 165   2      }
 166   1      }
 167          
 168          /********************写字符串******************/
 169          //写字符串子程序
 170          //xpos1取0~7共八列,ypos1取0~3共四行。
 171          /**********************************************/
 172          void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)
 173          { unsigned char n;
 174   1      switch (ypos)
 175   1      { case 1: xpos |= 0x80;break; //第一行
 176   2        case 2: xpos |= 0x90;break; //第二行
 177   2        case 3: xpos |= 0x88;break; //第三行
 178   2        case 4: xpos |= 0x98;break; //第四行
 179   2        default: break;
C51 COMPILER V6.12  12                                                                     09/10/2008 07:48:40 PAGE 4   

 180   2      }
 181   1      
 182   1      send_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
 183   1      for(n=0;n < k;n++)
 184   1      {
 185   2      send_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字
 186   2      }
 187   1      }
 188          /************************************/
 189          //在指定位置显示数字
 190          /***************************************/
 191          void display_LCD_number(unsigned char xpos,unsigned char ypos,unsigned char number)
 192          {
 193   1        unsigned char x,y;
 194   1      switch (ypos)
 195   1      { case 1: xpos |= 0x80;break; //第一行
 196   2        case 2: xpos |= 0x90;break; //第二行
 197   2        case 3: xpos |= 0x88;break; //第三行
 198   2        case 4: xpos |= 0x98;break; //第四行
 199   2        default: break;
 200   2      }
 201   1        send_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
 202   1       // unsigned char ;
 203   1       // x=number/100;
 204   1      //  y=(number-x*100)/10;
 205   1       // z=number%10;
 206   1         x=number/10;
 207   1      	y=number-x*10;
 208   1        send_data(int2charLCD[x]);
 209   1         send_data(int2charLCD[y]);
 210   1      // send_data(int2charLCD[z]);
 211   1      }
 212          /********************清屏************************/
 213          //清屏
 214          /************************************************/
 215          void clr_lcd(void)
 216          {
 217   1      send_com(0x01);
 218   1      //send_com(0x34);
 219   1      //send_com(0x30);
 220   1      }
 221          
 222          /**************主函数***********************/
 223          void main ()
 224          {
 225   1      timer0_initialize();
 226   1      lcd_init();           //设定液晶工作方式
 227   1      //printstr(1,1,buf,4);
 228   1      //printstr(2,1,"数字时钟",8);
 229   1      print(3,1,"时钟");
 230   1      print(1,2,":");
 231   1      print(3,2,":");
 232   1      //printstr(6,2,buf1,1);
 233   1      //print(0,3," SEEGU百度空间");
 234   1      //print(7,2,buf1);
 235   1      while(1)
 236   1      {
 237   2      //display_LCD_number(0,2,hour);
 238   2      //display_LCD_number(2,2,min);
 239   2      display_LCD_number(4,2,sec);
 240   2      }
 241   1      }
C51 COMPILER V6.12  12                                                                     09/10/2008 07:48:40 PAGE 5   

 242          
 243          
 244          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    528    ----
   CONSTANT SIZE    =     18    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10       9
   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 + -