找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3002|回复: 2
收起左侧

我的打地鼠单片机设计(矩阵键盘和cd12864实现的)含源码

[复制链接]
ID:367969 发表于 2018-7-9 15:17 | 显示全部楼层 |阅读模式
这是我单片机设计
是用c51做的一个打地鼠的游戏
用了一个矩阵键盘和一个lcd12864来实现的
打地鼠实行的是积分过关制
20分一关,越到后面地鼠持续的速度越短
这样更会让自己感兴趣,师傅也会比较认可

单片机源程序如下:
  1. #include <stc15.h>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>

  6. sbit LCD_RS=P1^4;//定义引脚
  7. sbit LCD_RW=P1^3;
  8. sbit LCD_E=P1^2;
  9. sbit PSB =P1^1;//PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1

  10. #define LCD_Data P2
  11. #define Busy 0x80 //用于检测LCD状态字中的Busy标识

  12. //----------------------------函数声明区----------------------------//
  13. void WriteDataLCD(unsigned char WDLCD);
  14. void WriteCommandLCD(unsigned char WCLCD,BuysC);
  15. unsigned char ReadDataLCD(void);
  16. unsigned char ReadStatusLCD(void);
  17. void LCDInit(void);
  18. void LCDClear(void);
  19. void LCDFlash(void);
  20. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  21. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  22. void DisplayImage (unsigned char code *DData);
  23. void DelayMS(unsigned int ms);
  24. unsigned char KeyScan();
  25. unsigned char RandomNumber();
  26. void Position(unsigned char a);
  27. void RightPosition(unsigned char a);
  28. void WrongPosition(unsigned char a);
  29. void DisPlayMessage();

  30. //----------------------------数组定义----------------------------//
  31. code unsigned char ColumnCode[4]={0xfe,0xfd,0xfb,0xf7};//0列起使的列扫描结果
  32. code unsigned char  uctech[] = {"           |难度"};
  33. code unsigned char  net[] = {"           | 01 "};
  34. code unsigned char  mcu[] = {"           |得分"};
  35. code unsigned char  qq[] = {"           | 99 "};
  36. code unsigned char tmp[]={//128*64点阵图形数据
  37. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  38. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  39. 0X00,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  40. 0X00,0X00,0X00,0X5F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  41. 0X00,0X00,0X00,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  42. 0X00,0X00,0X01,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  43. 0X00,0X01,0XE1,0XFF,0XE0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  44. 0X00,0X0F,0XF9,0XFF,0XEF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  45. 0X00,0X1F,0XFD,0XFF,0XFF,0XF8,0X00,0X00,0X18,0X00,0X87,0X00,0X18,0X00,0X00,0XC0,
  46. 0X00,0X1F,0XFE,0XFF,0XFF,0XF8,0X00,0X00,0X18,0X01,0X8D,0X80,0X18,0X01,0XF7,0XC0,
  47. 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0X8D,0XA0,0X18,0X00,0X03,0X80,
  48. 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X27,0XFF,0XF1,0XFF,0XC0,0X06,0X00,
  49. 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X03,0XFF,0XF1,0X9D,0X01,0X08,0XC0,0X0C,0X00,
  50. 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0X7D,0X61,0X18,0XC0,0X08,0X60,
  51. 0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0XDF,0XE1,0XFF,0XC7,0XFF,0XF0,
  52. 0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X1C,0X03,0XED,0X01,0X18,0XC0,0X08,0X00,
  53. 0X00,0X1F,0XFF,0X01,0XFF,0XF8,0X00,0X00,0X16,0X02,0X8D,0X61,0X18,0XC0,0X08,0X00,
  54. 0X00,0X0F,0XFE,0X00,0XFF,0XF8,0X00,0X00,0X32,0X02,0XAD,0X81,0XFF,0XC0,0X08,0X00,
  55. 0X00,0X07,0XF8,0X00,0X3F,0XD0,0X00,0X00,0X23,0X07,0X3D,0X01,0X18,0X20,0X08,0X00,
  56. 0X00,0XFD,0XF8,0X00,0X3F,0XE0,0X00,0X00,0X61,0X85,0XFD,0X20,0X18,0X20,0X08,0X00,
  57. 0X01,0XFF,0XF0,0X00,0X1F,0X40,0X00,0X00,0X80,0XF0,0X0F,0XE0,0X18,0X20,0X78,0X00,
  58. 0X03,0XFF,0XF0,0X00,0X0F,0X80,0X00,0X03,0X00,0X60,0X0C,0X00,0X0F,0XE0,0X18,0X00,
  59. 0X03,0XFF,0XE0,0X00,0X0F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  60. 0X07,0XFF,0XE0,0X00,0X0F,0XF4,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  61. 0X07,0XFF,0XE0,0X00,0X0F,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  62. 0X07,0XFF,0XE0,0X00,0X0F,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  63. 0X03,0XFF,0XE0,0X00,0X0F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  64. 0X03,0XFF,0XE0,0X00,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  65. 0X03,0XFF,0XF0,0X00,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  66. 0X01,0XFF,0XF0,0X00,0X3F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  67. 0X01,0XFF,0XF8,0X00,0X7F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  68. 0X00,0XFF,0XFC,0X00,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  69. 0X00,0X3F,0XFF,0X87,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  70. 0X00,0X03,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  71. 0X00,0X03,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  72. 0X00,0X03,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  73. 0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  74. 0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  75. 0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  76. 0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  77. 0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  78. 0X00,0X03,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  79. 0X00,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  80. 0X00,0X00,0XFE,0X77,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  81. 0X00,0X00,0X00,0X70,0X01,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  82. 0X00,0X00,0X00,0X70,0X0F,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  83. 0X00,0X00,0X00,0X70,0X3F,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  84. 0X00,0X00,0X00,0X78,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  85. 0X00,0X1F,0XFC,0X79,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  86. 0X00,0X7F,0XFF,0X39,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  87. 0X00,0XFF,0XFF,0XFD,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  88. 0X00,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  89. 0X00,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  90. 0X00,0X7F,0XFF,0XFE,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  91. 0X00,0X3F,0XFF,0XEF,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  92. 0X00,0X0F,0XFF,0XEF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  93. 0X00,0X07,0XFF,0XC7,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  94. 0X00,0X01,0XFF,0X83,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  95. 0X00,0X00,0X1E,0X01,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  96. 0X00,0X00,0X00,0X01,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  97. 0X00,0X00,0X00,0X00,0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  98. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  99. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  100. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};

  101. //----------------------------主函数----------------------------//
  102. static unsigned char Gate=1,Score=0;

  103. void main(void)
  104. {
  105.         static unsigned char Rand=0,Counter=0,Key=16;
  106.         P0M0=1;P0M1=0;
  107.         P1M0=1;P1M1=0;
  108.         P2M0=1;P2M1=0;
  109.         P3M0=1;P3M1=0;
  110.         
  111.         DelayMS(400); //启动等待,等LCD讲入工作状态
  112.         LCDInit(); //LCM初始化
  113.         DelayMS(5); //延时片刻(可不要)
  114.         
  115.         Position(16);//初始时显示标准方框线
  116.         Rand=RandomNumber();//初始时显示一次老鼠位置
  117.         Position(Rand);//初始时显示一次老鼠位置
  118.         DisplayListChar(5,1,"  难度");//难度
  119.         DisplayListChar(5,3,"  得分");//分数
  120.         
  121.         TMOD=0x01;
  122.         TH0=0x3c;
  123.         TL0=0xb0;
  124.         IE=0x82;
  125.         TR0=1;
  126.         
  127.         while(1)
  128.         {
  129. //                LCDClear();
  130. //                DisplayImage(tmp);//显示图形
  131. //                LCDClear();
  132. //                LCDFlash();        //闪烁效果
  133.                
  134.                 Counter++;

  135.                 if(Counter==150)//1S出现一次//显示老鼠位置
  136.                 {
  137.                         if(Key==Rand)
  138.                         {
  139.                                 Score++;
  140.                                 RightPosition(Rand);
  141.                                 DelayMS(1000);
  142.                         }
  143.                         else
  144.                         {
  145.                                 WrongPosition(Rand);
  146.                                 DelayMS(1000);
  147.                         }
  148.                         
  149.                         DelayMS(500);
  150.                         
  151.                         Rand=RandomNumber();
  152.                         Position(Rand);
  153.                         Counter=0;
  154.                 }
  155.                
  156.                 Key=KeyScan();
  157.                 DisPlayMessage();//显示关卡和得分
  158.         }
  159. }

  160. void T0Isr() interrupt 1
  161. {
  162.         static unsigned char Counter1;
  163.         Counter1++;
  164.         if(Counter1==20)//定时1S
  165.         {
  166. //                if(Score>=15)
  167. //                {
  168. //                        Gate++;
  169. //                        Score=0;
  170. //                }
  171. //                DisplayListChar(0,1,"          ");
  172. //                DisplayListChar(0,2,"          ");
  173. //                DisplayListChar(0,3,"          ");
  174. //                DisplayListChar(0,4,"          ");
  175.         }
  176.         TH0=0x3c;
  177.         TL0=0xb0;
  178. }

  179. //----------------------------显示等级和得分----------------------------//
  180. void DisPlayMessage()
  181. {
  182.         unsigned char w,x,y,z;
  183.         w=(((int)((Gate%100)/10))+48);
  184.         x=((int)(Gate%10)+48);
  185. //        DisplayOneChar(6,2,32);
  186.         DisplayOneChar(7,2,w);
  187.         DisplayOneChar(8,2,x);
  188.         DelayMS(1);
  189.         y=(((int)((Score%100)/10))+48);
  190.         z=((int)(Score%10)+48);
  191. //        DisplayOneChar(6,4,32);
  192.         DisplayOneChar(7,4,y);
  193.         DisplayOneChar(8,4,z);
  194. }

  195. //----------------------------老鼠位置----------------------------//
  196. void Position(unsigned char a)
  197. {
  198.                 DisplayListChar(0,1," | | | | |");//第一排
  199.                 DisplayListChar(0,2," | | | | |");//第二排
  200.                 DisplayListChar(0,3," | | | | |");//第三排
  201.                 DisplayListChar(0,4," | | | | |");//第四排
  202.         switch(a)
  203.         {
  204.                 case 0: DisplayListChar(0,1," |*| | | |");break;
  205.                 case 1: DisplayListChar(0,1," | |*| | |");break;
  206.                 case 2: DisplayListChar(0,1," | | |*| |");break;
  207.                 case 3: DisplayListChar(0,1," | | | |*|");break;
  208.                 case 4: DisplayListChar(0,2," |*| | | |");break;
  209.                 case 5: DisplayListChar(0,2," | |*| | |");break;
  210.                 case 6: DisplayListChar(0,2," | | |*| |");break;
  211.                 case 7: DisplayListChar(0,2," | | | |*|");break;
  212.                 case 8: DisplayListChar(0,3," |*| | | |");break;
  213.                 case 9: DisplayListChar(0,3," | |*| | |");break;
  214.                 case 10:DisplayListChar(0,3," | | |*| |");break;
  215.                 case 11:DisplayListChar(0,3," | | | |*|");break;
  216.                 case 12:DisplayListChar(0,4," |*| | | |");break;
  217.                 case 13:DisplayListChar(0,4," | |*| | |");break;
  218.                 case 14:DisplayListChar(0,4," | | |*| |");break;
  219.                 case 15:DisplayListChar(0,4," | | | |*|");break;
  220.                 default:break;
  221.         }
  222. }

  223. //----------------------------打中老鼠----------------------------//
  224. void RightPosition(unsigned char a)
  225. {
  226.                 DisplayListChar(0,1," | | | | |");//第一排
  227.                 DisplayListChar(0,2," | | | | |");//第二排
  228.                 DisplayListChar(0,3," | | | | |");//第三排
  229.                 DisplayListChar(0,4," | | | | |");//第四排
  230.         switch(a)
  231.         {
  232.                 case 0: DisplayListChar(0,1," |+| | | |");break;
  233.                 case 1: DisplayListChar(0,1," | |+| | |");break;
  234.                 case 2: DisplayListChar(0,1," | | |+| |");break;
  235.                 case 3: DisplayListChar(0,1," | | | |+|");break;
  236.                 case 4: DisplayListChar(0,2," |+| | | |");break;
  237.                 case 5: DisplayListChar(0,2," | |+| | |");break;
  238.                 case 6: DisplayListChar(0,2," | | |+| |");break;
  239.                 case 7: DisplayListChar(0,2," | | | |+|");break;
  240.                 case 8: DisplayListChar(0,3," |+| | | |");break;
  241.                 case 9: DisplayListChar(0,3," | |+| | |");break;
  242.                 case 10:DisplayListChar(0,3," | | |+| |");break;
  243.                 case 11:DisplayListChar(0,3," | | | |+|");break;
  244.                 case 12:DisplayListChar(0,4," |+| | | |");break;
  245.                 case 13:DisplayListChar(0,4," | |+| | |");break;
  246.                 case 14:DisplayListChar(0,4," | | |+| |");break;
  247.                 case 15:DisplayListChar(0,4," | | | |+|");break;
  248.                 default:break;
  249.         }
  250. }

  251. //----------------------------未打中老鼠----------------------------//
  252. void WrongPosition(unsigned char a)
  253. {
  254.                 DisplayListChar(0,1," | | | | |");//第一排
  255.                 DisplayListChar(0,2," | | | | |");//第二排
  256.                 DisplayListChar(0,3," | | | | |");//第三排
  257.                 DisplayListChar(0,4," | | | | |");//第四排
  258.         switch(a)
  259.         {
  260.                 case 0: DisplayListChar(0,1," |-| | | |");break;
  261.                 case 1: DisplayListChar(0,1," | |-| | |");break;
  262.                 case 2: DisplayListChar(0,1," | | |-| |");break;
  263.                 case 3: DisplayListChar(0,1," | | | |-|");break;
  264.                 case 4: DisplayListChar(0,2," |-| | | |");break;
  265.                 case 5: DisplayListChar(0,2," | |-| | |");break;
  266.                 case 6: DisplayListChar(0,2," | | |-| |");break;
  267.                 case 7: DisplayListChar(0,2," | | | |-|");break;
  268.                 case 8: DisplayListChar(0,3," |-| | | |");break;
  269.                 case 9: DisplayListChar(0,3," | |-| | |");break;
  270.                 case 10:DisplayListChar(0,3," | | |-| |");break;
  271.                 case 11:DisplayListChar(0,3," | | | |-|");break;
  272.                 case 12:DisplayListChar(0,4," |-| | | |");break;
  273.                 case 13:DisplayListChar(0,4," | |-| | |");break;
  274.                 case 14:DisplayListChar(0,4," | | |-| |");break;
  275.                 case 15:DisplayListChar(0,4," | | | |-|");break;
  276.                 default:break;
  277.         }
  278. }

  279. //----------------------------产生随机数----------------------------//
  280. unsigned char RandomNumber()
  281. {
  282.         int number;
  283.         number = rand()%16;
  284.   return number;
  285. }

  286. //----------------------------矩阵键盘扫描----------------------------//
  287. unsigned char KeyScan()
  288. {
  289.         unsigned char temp=0,row=0,column=0,i=0;
  290.         P3=0xf0;
  291.         temp=P3&0xf0;
  292.         if(temp!=0xf0)
  293.         {
  294.                 DelayMS(10);
  295.                 temp=P3&0xf0;
  296.                 if(temp!=0xf0)
  297.                 {
  298.                         switch(temp)
  299.                         {
  300.                                 case 0x70:row=3;break;
  301.                                 case 0xb0:row=2;break;
  302.                                 case 0xd0:row=1;break;
  303.                                 case 0xe0:row=0;break;
  304.                         }
  305.                         for(i=0;i<4;i++)
  306.                         {
  307.                                 P3=ColumnCode[i];
  308.                                 temp=P3&0xf0;
  309.                                 temp=~temp;
  310.                                 if(temp!=0xf0)column=i;
  311.                         }
  312.                         return(row*4+column);
  313.                 }
  314.         }
  315.         else P3=0xff;
  316.         return(16);
  317. }

  318. //----------------------------写数据----------------------------//
  319. void WriteDataLCD(unsigned char WDLCD)
  320. {
  321.         ReadStatusLCD(); //检测忙
  322.         LCD_RS = 1;
  323.         LCD_RW = 0;
  324.         LCD_Data = WDLCD;
  325.         LCD_E = 1;
  326.         LCD_E = 1;
  327.         LCD_E = 1;
  328.         LCD_E = 0;
  329. }


  330. //----------------------------写命令----------------------------//
  331. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
  332. {
  333.         if (BuysC) ReadStatusLCD(); //根据需要检测忙
  334.         LCD_RS = 0;
  335.         LCD_RW = 0;
  336.         LCD_Data = WCLCD;
  337.         LCD_E = 1;
  338.         LCD_E = 1;
  339.         LCD_E = 1;
  340.         LCD_E = 0;  
  341. }

  342. //----------------------------读数据----------------------------//
  343. unsigned char ReadDataLCD(void)
  344. {
  345.         LCD_RS = 1;
  346.         LCD_RW = 1;
  347.         LCD_E = 0;
  348.         LCD_E = 0;
  349.         LCD_E = 1;
  350.         return(LCD_Data);
  351. }

  352. //----------------------------读状态----------------------------//
  353. unsigned char ReadStatusLCD(void)
  354. {
  355.         LCD_Data = 0xFF;
  356.         LCD_RS = 0;
  357.         LCD_RW = 1;
  358.         LCD_E = 1;
  359.         while (LCD_Data & Busy); //检测忙信号
  360.         LCD_E = 0;
  361.         return(LCD_Data);
  362. }

  363. //----------------------------LCM初始化----------------------------//
  364. void LCDInit(void)
  365. {
  366.         WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
  367.         WriteCommandLCD(0x01,1); //显示清屏
  368.         WriteCommandLCD(0x06,1); // 显示光标移动设置
  369.         WriteCommandLCD(0x0C,1); // 显示开及光标设置
  370. }

  371. //----------------------------清屏---------------------------//
  372. void LCDClear(void)
  373. {
  374.         WriteCommandLCD(0x01,1); //显示清屏
  375.         WriteCommandLCD(0x34,1); // 显示光标移动设置
  376.         WriteCommandLCD(0x30,1); // 显示开及光标设置
  377. }

  378. //----------------------------闪烁效果----------------------------//
  379. void LCDFlash(void)
  380. {
  381.         WriteCommandLCD(0x08,1); //显示清屏
  382.         DelayMS(400);
  383.         WriteCommandLCD(0x0c,1); // 显示开及光标设置
  384.         DelayMS(400);
  385.         WriteCommandLCD(0x08,1); //显示清屏
  386.         DelayMS(400);
  387.         WriteCommandLCD(0x0c,1); // 显示开及光标设置
  388.         DelayMS(400);
  389.         WriteCommandLCD(0x08,1); //显示清屏
  390.         DelayMS(400);
  391. }

  392. //----------------------------在指定位置显示一个字符----------------------------//
  393. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  394. {
  395.         if(Y<1)
  396.                 Y=1;
  397.         if(Y>4)
  398.                 Y=4;
  399.                 X &= 0x0F; //限制X不能大于16,Y不能大于1
  400.         switch(Y)
  401.         {
  402.                 case 1:X|=0X80;break;
  403.                 case 2:X|=0X90;break;
  404.                 case 3:X|=0X88;break;
  405.                 case 4:X|=0X98;break;
  406.         }
  407.         WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
  408.         WriteDataLCD(DData);
  409. }

  410. //----------------------------在指定位置显示一串字符----------------------------//
  411. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  412. {
  413.         unsigned char ListLength,X2;
  414.         ListLength = 0;
  415.         X2=X;
  416.         if(Y<1)
  417.                 Y=1;
  418.         if(Y>4)
  419.                 Y=4;
  420.                 X &= 0x0F; //限制X不能大于16,Y在1-4之内
  421.         switch(Y)
  422.                 {
  423. ……………………

  424. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
代码下载:
打地鼠20170615.zip (77.97 KB, 下载次数: 75)
回复

使用道具 举报

ID:247623 发表于 2021-1-4 15:33 | 显示全部楼层
哪位大神能根据这个画一个仿真图呢?
回复

使用道具 举报

ID:1031828 发表于 2022-6-3 12:50 | 显示全部楼层
不是C51的程序吗,怎么是C15的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表