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

📄 1.lst

📁 电子琴——直接用电脑键盘与单片机通讯
💻 LST
字号:
C51 COMPILER V6.12  1                                                                      09/10/2007 23:26:11 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE 1
OBJECT MODULE PLACED IN .\1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\1.C DEBUG OBJECTEXTEND

stmt level    source

   1          #include <at89x51.h>
   2          #include "scancodes.h"
   3          
   4          #define LCM_RW P2_6 //定义LCD引脚
   5          #define LCM_RS P2_7
   6          #define LCM_E P2_5
   7          #define LCM_Data P1
   8          
   9          #define Key_Data P3_4 //定义Keyboard引脚
  10          #define Key_CLK P3_3
  11          
  12          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  13          
  14          void LCMInit(void);
  15          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  16          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  17          void Delay5Ms(void);
  18          void Delay400Ms(void);
  19          void Decode(unsigned char ScanCode);
  20          void WriteDataLCM(unsigned char WDLCM);
  21          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  22          
  23          unsigned char ReadDataLCM(void);
  24          unsigned char ReadStatusLCM(void);
  25          unsigned char code cdle_net[] = {"-www.cdle.net--"};
  26          unsigned char code email[] = {"pnzwzw@cdle.net"};
  27          unsigned char code Cls[] = {" "};
  28          static unsigned char IntNum = 0; //中断次数计数
  29          static unsigned char KeyV; //键值
  30          static unsigned char DisNum = 0; //显示用指针
  31          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  32          static unsigned char BF = 0; //标识是否有字符被收到
  33          unsigned char th,tl;
  34          int n=0;
  35          
  36          void main(void)
  37          {
  38   1      unsigned char TempCyc;
  39   1      
  40   1      Delay400Ms(); //启动等待,等LCM讲入工作状态
  41   1      LCMInit(); //LCM初始化 
  42   1      Delay5Ms(); //延时片刻(可不要)
  43   1      
  44   1      DisplayListChar(0, 0, cdle_net);
  45   1      DisplayListChar(0, 1, email);
  46   1      ReadDataLCM();//测试用句无意义
  47   1      for (TempCyc=0; TempCyc<10; TempCyc++)
  48   1      Delay400Ms(); //延时
  49   1      DisplayListChar(0, 1, Cls); 
  50   1      aaa:
  51   1      P2_0=0;
  52   1      TMOD=0x10;
  53   1      ET1=1;
  54   1      
  55   1      IT1 = 0; //设外部中断1为低电平触发
C51 COMPILER V6.12  1                                                                      09/10/2007 23:26:11 PAGE 2   

  56   1      EA = 1;
  57   1      EX1 = 1; //开中断
  58   1      PT1=1;
  59   1      
  60   1      do
  61   1      {
  62   2      if (BF)
  63   2      Decode(KeyV);
  64   2      else
  65   2      {
  66   3      
  67   3      EX1= 1; //开中断
  68   3      }
  69   2      }
  70   1      while(1);
  71   1      goto aaa;
  72   1      }
  73          
  74          //写数据
  75          void WriteDataLCM(unsigned char WDLCM) 
  76          {
  77   1      ReadStatusLCM(); //检测忙
  78   1      LCM_Data = WDLCM;
  79   1      LCM_RS = 1;
  80   1      LCM_RW = 0;
  81   1      LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  82   1      LCM_E = 0; //延时
  83   1      LCM_E = 1;
  84   1      }
  85          
  86          //写指令
  87          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  88          {
  89   1      if (BuysC) ReadStatusLCM(); //根据需要检测忙
  90   1      LCM_Data = WCLCM;
  91   1      LCM_RS = 0;
  92   1      LCM_RW = 0; 
  93   1      LCM_E = 0;
  94   1      LCM_E = 0;
  95   1      LCM_E = 1; 
  96   1      }
  97          
  98          //读数据
  99          unsigned char ReadDataLCM(void)
 100          {
 101   1      LCM_RS = 1; 
 102   1      LCM_RW = 1;
 103   1      LCM_E = 0;
 104   1      LCM_E = 0;
 105   1      LCM_E = 1;
 106   1      return(LCM_Data);
 107   1      }
 108          
 109          //读状态
 110          unsigned char ReadStatusLCM(void)
 111          {
 112   1      LCM_Data = 0xFF; 
 113   1      LCM_RS = 0;
 114   1      LCM_RW = 1;
 115   1      LCM_E = 0;
 116   1      LCM_E = 0;
 117   1      LCM_E = 1;
C51 COMPILER V6.12  1                                                                      09/10/2007 23:26:11 PAGE 3   

 118   1      while (LCM_Data & Busy); //检测忙信号
 119   1      return(LCM_Data);
 120   1      }
 121          
 122          void LCMInit(void) //LCM初始化
 123          {
 124   1      LCM_Data = 0;
 125   1      WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 126   1      Delay5Ms(); 
 127   1      WriteCommandLCM(0x38,0);
 128   1      Delay5Ms(); 
 129   1      WriteCommandLCM(0x38,0);
 130   1      Delay5Ms(); 
 131   1      
 132   1      WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 133   1      WriteCommandLCM(0x08,1); //关闭显示
 134   1      WriteCommandLCM(0x01,1); //显示清屏 
 135   1      WriteCommandLCM(0x06,1); // 显示光标移动设置
 136   1      WriteCommandLCM(0x0F,1); // 显示开及光标设置
 137   1      }
 138          
 139          //按指定位置显示一个字符
 140          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 141          {
 142   1      Y &= 0x1;
 143   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 144   1      if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 145   1      X |= 0x80; //算出指令码
 146   1      WriteCommandLCM(X, 1); //发命令字
 147   1      WriteDataLCM(DData); //发数据
 148   1      }
 149          
 150          //按指定位置显示一串字符
 151          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 152          {
 153   1      unsigned char ListLength;
 154   1      
 155   1      ListLength = 0;
 156   1      Y &= 0x1;
 157   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 158   1      while (DData[ListLength]>0x19) //若到达字串尾则退出
 159   1      {
 160   2      if (X <= 0xF) //X坐标应小于0xF
 161   2      {
 162   3      DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 163   3      ListLength++;
 164   3      X++;
 165   3      }
 166   2      }
 167   1      }
 168          
 169          //5ms延时
 170          void Delay5Ms(void)
 171          {
 172   1      unsigned int TempCyc = 5552;
 173   1      while(TempCyc--);
 174   1      }
 175          
 176          //400ms延时
 177          void Delay400Ms(void)
 178          {
 179   1      unsigned char TempCycA = 5;
C51 COMPILER V6.12  1                                                                      09/10/2007 23:26:11 PAGE 4   

 180   1      unsigned int TempCycB;
 181   1      while(TempCycA--)
 182   1      {
 183   2      TempCycB=7269;
 184   2      while(TempCycB--);
 185   2      };
 186   1      }
 187          
 188          void timer1(void) interrupt 3 using 0
 189          {
 190   1       P2_0=!P2_0;
 191   1       TH1=th;
 192   1       TL1=tl;
 193   1       n++;
 194   1       if(n>500)TR1=0;
 195   1       }
 196          
 197          void Keyboard_out(void) interrupt 2
 198          {
 199   1      if ((IntNum > 0) && (IntNum < 9))
 200   1      { 
 201   2      KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 202   2      if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 203   2      }
 204   1      IntNum++;
 205   1      while (!Key_CLK); //等待PS/2CLK拉高
 206   1      
 207   1      if (IntNum > 10)
 208   1      {
 209   2      IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 210   2      BF = 1; //标识有字符输入完了
 211   2      EX1 = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要

⌨️ 快捷键说明

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