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

📄 1602print.lst

📁 《爱上单片机》配书光盘
💻 LST
字号:
C51 COMPILER V6.12  1602PRINT                                                              07/12/2009 07:10:08 PAGE 1   


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

stmt level    source

   1          /********************************************************************************************
   2          程序名:    1602液晶屏时钟程序
   3          编写人:    杜洋 
   4          编写时间:  2009年7月6日
   5          硬件支持:  LCD1602液晶屏  STC12C2052 外部12MHZ晶振 
   6          说明备注:    使用2402液晶屏程序,与1602液晶屏程序完全兼容
   7          /********************************************************************************************/
   8          #include <STC12C2052AD.h>						// 包含头文件 //
   9          /********************************************************************************************/
  10          typedef unsigned char      uint8;          // 无符号8位整型变量 //
  11          
  12          /********************************************************************************************
  13          // 引脚定义 // (使用者根据实际更改)
  14          /********************************************************************************************/
  15          #define		LCM2402_DB0_DB7		P1			// 定义LCM2402的数据总线
  16          sbit LCM2402_RS   = P3 ^ 2;					// 定义LCM2402的RS控制线
  17          sbit LCM2402_RW   = P3 ^ 3;					// 定义LCM2402的RW控制线
  18          sbit LCM2402_E    = P3 ^ 4;					// 定义LCM2402的E控制线
  19          sbit LCM2402_Busy = P1 ^ 7;					// 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)
  20          /********************************************************************************************
  21          // 定义LCM2402指令集 // (详细请见技术手册)
  22          /********************************************************************************************/
  23          #define			CMD_clear		0x01             // 清除屏幕
  24          #define			CMD_back		0x02             // DDRAM回零位
  25          #define			CMD_dec1		0x04             // 读入后AC(指针)减1,向左写
  26          #define			CMD_add1		0x06             // 读入后AC(指针)加1,向右写
  27          #define			CMD_dis_gb1		0x0f             // 开显示_开光标_开光标闪烁
  28          #define			CMD_dis_gb2		0x0e             // 开显示_开光标_关光标闪烁
  29          #define			CMD_dis_gb3		0x0c             // 开显示_关光标_关光标闪烁
  30          #define			CMD_OFF_dis		0x08             // 关显示_关光标_关光标闪烁
  31          #define			CMD_set82		0x38             // 8位总线_2行显示
  32          #define			CMD_set81		0x30             // 8位总线_1行显示(上边行)
  33          #define			CMD_set42		0x28             // 4位总线_2行显示
  34          #define			CMD_set41		0x20             // 4位总线_1行显示(上边行)
  35          #define			lin_1			0x80             // 4位总线_1行显示(上边行)
  36          #define			lin_2			0xc0             // 4位总线_1行显示(上边行)
  37          
  38          /********************************************************************************************
  39          // 读LCM忙程序 [底层协议] // (所有底层协议都无需关注)
  40          // LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 //
  41          /********************************************************************************************/
  42          void LCM2402_TestBusy(void){
  43   1         	LCM2402_DB0_DB7 = 0xff;		//设备读状态
  44   1         	LCM2402_RS = 0;
  45   1         	LCM2402_RW = 1;
  46   1         	LCM2402_E = 1;
  47   1         	while(LCM2402_Busy);		//等待LCM不忙
  48   1         	LCM2402_E = 0;				//
  49   1      }
  50          /********************************************************************************************
  51          // 写指令程序 //
  52          // 向LCM2402写命令 本函数需要1个指令集的入口参数 //
  53          /********************************************************************************************/
  54          void LCM2402_WriteCMD(uint8 LCM2402_command) { 
  55   1        	LCM2402_TestBusy();
C51 COMPILER V6.12  1602PRINT                                                              07/12/2009 07:10:08 PAGE 2   

  56   1        	LCM2402_DB0_DB7 = LCM2402_command;
  57   1        	LCM2402_RS = 0;
  58   1        	LCM2402_RW = 0;
  59   1        	LCM2402_E = 1;
  60   1        	LCM2402_E = 0;
  61   1      }
  62          /********************************************************************************************
  63          // 写数据程序 //
  64          // 向LCM2402写数据 //
  65          /********************************************************************************************/
  66          void LCM2402_WriteData(uint8 LCM2402_data){ 
  67   1          LCM2402_TestBusy();
  68   1      	LCM2402_DB0_DB7 = LCM2402_data;
  69   1        	LCM2402_RS = 1;
  70   1        	LCM2402_RW = 0;
  71   1        	LCM2402_E = 1;
  72   1        	LCM2402_E = 0;
  73   1      }
  74          /********************************************************************************************
  75          // 打印字符串程序 // (本函数调用指针函数)
  76          // 向LCM发送一个字符串,长度48字符之内 
  77          // 第一行位置 0x00~0x17  第二行位置 0x40~0x57 
  78          // 应用举例:print(0x80,"doyoung.net"); //在第一行第一位处从左向右打印doyoung.net字符串
  79          /********************************************************************************************/
  80          void print(uint8 a,uint8 *str){
  81   1      	LCM2402_WriteCMD(a | 0x80);
  82   1      	while(*str != '\0'){
  83   2      		LCM2402_WriteData(*str++);
  84   2      	}
  85   1      	*str = 0;
  86   1      }
  87          /********************************************************************************************
  88          // 打印单字符程序 // 
  89          // 第一行位置 0x00~0x17  第二行位置 0x40~0x57 
  90          // 向LCM发送一个字符,以十六进制(0x00)表示 
  91          // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0”
  92          /********************************************************************************************/
  93          void print2(uint8 a,uint8 t){
  94   1      		LCM2402_WriteCMD(a | 0x80);
  95   1      		LCM2402_WriteData(t);
  96   1      }
  97          /********************************************************************************************
  98          // LCM2402初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改)
  99          /********************************************************************************************/
 100          void LCM2402_Init(void){
 101   1        	LCM2402_WriteCMD(CMD_set82);	//* 显示模式设置:显示2行,每个字符为5*7个像素
 102   1        	LCM2402_WriteCMD(CMD_clear);	//  显示清屏
 103   1        	LCM2402_WriteCMD(CMD_back);		//* 数据指针指向第1行第1个字符位置
 104   1        	LCM2402_WriteCMD(CMD_add1);		//  显示光标移动设置:文字不动,光标右移
 105   1        	LCM2402_WriteCMD(CMD_dis_gb3); 	//  显示开及光标设置:显示开,光标开,闪烁开
 106   1      }
 107          /********************************************************************************************/
 108          //			以上是LCM2402驱动程序			//
 109          /*********************************************************************************************/
 110          
 111          /********************************************************************************************
 112          串口初始化程序:波特率4800,(终端设置:4800,8,无,1,无)
 113          /********************************************************************************************/
 114          void _12(void){
 115   1      	TMOD = 0x20;	//定时器工作方式设置,定时器1方式2
 116   1      	SCON = 0x50;	//串口工作方式1,允许串口接收   
 117   1      	TH1 = 0xF3;		//定时器初值高8位设置
C51 COMPILER V6.12  1602PRINT                                                              07/12/2009 07:10:08 PAGE 3   

 118   1      	TL1 = 0xF3;		//定时器初值低8位设置
 119   1      	PCON = 0x80;	//波特率倍频
 120   1      	TR1 = 1;		//定时器启动    
 121   1      }
 122          
 123          /********************************************************************************************
 124          主程序:实现接收数据并把接收到的数据发送出去
 125          /********************************************************************************************/
 126          void main(){
 127   1         unsigned char dat,li=0x80;
 128   1         _12();		//串口初始化
 129   1         LCM2402_Init();	//LCM2402初始化
 130   1         print(0x80," DoYoung Studio "); //在第一行打印LOGO字符
 131   1         print(0x40,"Input your words"); //在第二行打印LOGO字符
 132   1         while(1){
 133   2             if (RI == 1){		//接收中断标志位为1时
 134   3      			dat = SBUF;		//接收数据 SBUF 为单片机的接收发送缓冲寄存器
 135   3                  RI = 0;			//令接收中断标志位为0(软件清零)
 136   3      		    SBUF = dat;		//将接收的数据发送回PC
 137   3      			while(TI == 0);
 138   3      			TI = 0;
 139   3      			print2(li,dat); //在第一行显示串口字符串
 140   3      			li++;
 141   3      			if(li > 0x8f){
 142   4      				li = 0x40;
 143   4      			}
 144   3      			if(li > 0x4f && li < 0x80){
 145   4      				li = 0x80;
 146   4      			}
 147   3      		}
 148   2         }
 149   1      }
 150          /********************************************************************************************/
 151          
 152          /*************************************************************
 153          * 杜洋工作室 DoYoung Studio
 154          * 分享创意电子 Share ideas of electronic
 155          * www.DoYoung.net
 156          /*************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    223    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       3
   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 + -