├── images ├── pro1.png ├── pro10.png ├── pro2.png ├── pro3.png ├── pro4.png ├── pro5.png ├── pro6.png ├── pro7.png ├── pro8.png └── pro9.png ├── AT89C52+LCD12864 实现贪吃蛇游戏 ├── code │ ├── init.h │ ├── readme.txt │ ├── Objects │ │ ├── exam3 │ │ ├── main.obj │ │ ├── snake.obj │ │ ├── lcd12864.obj │ │ ├── exam3.build_log.htm │ │ ├── exam3.lnp │ │ └── exam3.hex │ ├── Listings │ │ ├── game.lst │ │ ├── lcd12864.lst │ │ ├── main.lst │ │ ├── snake.lst │ │ └── exam3.m51 │ ├── main.c │ ├── lcd12864.h │ ├── snake.h │ ├── snake.c │ ├── lcd12864.c │ ├── exam3.uvproj │ └── game.h ├── pics │ ├── EDA.jpg │ ├── DDRAM.png │ └── GDRAM.png └── README.md ├── code ├── pro5 │ └── pro5.c ├── pro7 │ └── pro7.c ├── pro6 │ └── pro6.c ├── pro3 │ └── pro3.c ├── pro8 │ └── pro8.c ├── pro4 │ └── pro4.c ├── pro1 │ └── pro1.c ├── pro9 │ └── pro9.c ├── pro2 │ └── pro2.c └── pro10 │ ├── zh-hans.h │ └── pro10.c └── README.md /images/pro1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro1.png -------------------------------------------------------------------------------- /images/pro10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro10.png -------------------------------------------------------------------------------- /images/pro2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro2.png -------------------------------------------------------------------------------- /images/pro3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro3.png -------------------------------------------------------------------------------- /images/pro4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro4.png -------------------------------------------------------------------------------- /images/pro5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro5.png -------------------------------------------------------------------------------- /images/pro6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro6.png -------------------------------------------------------------------------------- /images/pro7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro7.png -------------------------------------------------------------------------------- /images/pro8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro8.png -------------------------------------------------------------------------------- /images/pro9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/images/pro9.png -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/init.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/init.h -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/pics/EDA.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/pics/EDA.jpg -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/readme.txt -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/pics/DDRAM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/pics/DDRAM.png -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/pics/GDRAM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/pics/GDRAM.png -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/exam3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/exam3 -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/main.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/main.obj -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/game.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/game.lst -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/snake.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/snake.obj -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/lcd12864.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/lcd12864.lst -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/lcd12864.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/lcd12864.obj -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/exam3.build_log.htm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fmw666/C51/HEAD/AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/exam3.build_log.htm -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/exam3.lnp: -------------------------------------------------------------------------------- 1 | ".\Objects\lcd12864.obj", 2 | ".\Objects\main.obj", 3 | ".\Objects\snake.obj" 4 | TO ".\Objects\exam3" 5 | PRINT(".\Listings\exam3.m51") RAMSIZE(256) 6 | -------------------------------------------------------------------------------- /code/pro5/pro5.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | sbit P1_0 = P1^0; 4 | sbit P1_1 = P1^1; 5 | 6 | void main() 7 | { 8 | while(1){ 9 | if(P1_0==0 && P1_1==0){ 10 | P0 = 0xFF; 11 | } 12 | if(P1_0==0 && P1_1==1){ 13 | P0 = 0xF0; 14 | } 15 | if(P1_0==1 && P1_1==0){ 16 | P0 = 0xCC; 17 | } 18 | if(P1_0==1 && P1_1==1){ 19 | P0 = 0x00; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/main.c: -------------------------------------------------------------------------------- 1 | #include "game.h" 2 | 3 | void main(){ 4 | // 初始化 5 | init(); 6 | 7 | while(1){ 8 | unsigned char ch = Game_Menu(); // 画出初始游戏界面 9 | if(ch == SYS_EASY) 10 | Sys_Easy(); 11 | if(ch == SYS_HARD) 12 | Sys_Hard(); 13 | if(ch == SYS_TIPS) 14 | Sys_Tips(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /code/pro7/pro7.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | sbit P1_0 = P1^0; 4 | 5 | void T1Proc() interrupt 3 6 | { 7 | P1_0 = ~P1_0; //每隔半个周期250ms波形翻转 8 | } 9 | 10 | 11 | void main() 12 | { 13 | TMOD = 0x20; //定时器方式控制寄存器 10方式8位自装填 14 | /* 15 | 输出频率为1KHz,周期为500ms 16 | 所以每隔半个周期波形250ms就进行翻转 17 | */ 18 | TH1 = 256-250; //T1 高八位赋值6 (有250ms时间) 19 | TL1 = 256-250; //T1 低八位赋值6 (有250ms时间) 20 | TR1 = 1; 21 | EA = ET1 = 1; //中断源允许和中断总允许打开 22 | 23 | P1_0 = 1; 24 | while(1); 25 | } -------------------------------------------------------------------------------- /code/pro6/pro6.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | char hello[5]={0x89,0x86,0xc7,0xc7,0xc0}; 4 | char index=0; 5 | char cnt=0; 6 | 7 | int Timer0() interrupt 1 8 | { 9 | TH0 = (65536-50000)/256; //T0定时器复位 10 | TL0 = (65536-50000)%256; 11 | cnt++; 12 | if(cnt == 20){ //1s到达,数码管显一个数 13 | cnt = 0; //计数复原 14 | P0 = hello[index]; 15 | index++; //数码管数字增加1 16 | if(index == 5){ //数码管数字跑完 17 | index = 0; //数码管下标复位0 18 | } 19 | } 20 | } 21 | 22 | void main() 23 | { 24 | EA = EX0 = ET0 = 1; 25 | TMOD = 0x01; //定时器方式控制寄存器 01方式16位 26 | TH0 = (65536-50000)/256; //T0定时器每次中断50ms 27 | TL0 = (65536-50000)%256; 28 | TR0 = 1; 29 | P0 = hello[index++]; //在1s进入中断功能前先赋值 30 | while(1); 31 | } -------------------------------------------------------------------------------- /code/pro3/pro3.c: -------------------------------------------------------------------------------- 1 | #include 2 | sbit P1_0 = P1^0; 3 | sbit P1_1 = P1^1; 4 | char cnt = 0; //记录中断次数,每40次为1s 5 | char index = 0; //控制LED灯亮2s,灭2s 6 | 7 | int Timer0() interrupt 1 8 | { 9 | TH0 = (65536-50000)/256; //T0定时器复位 10 | TL0 = (65536-50000)%256; 11 | if(++cnt == 10){ //1s到达,数码管显一个数 12 | cnt = 0; //计数复原 13 | index++; 14 | if(1<=index && index<=2){ //亮2s 15 | P1_1 = 0; 16 | } 17 | if(3<=index && index<=4){ 18 | P1_1 = 1; 19 | if(index == 4){ //数码管数字跑完 20 | index = 0; //数码管下标复位0 21 | } 22 | } 23 | 24 | } 25 | } 26 | 27 | 28 | void main() 29 | { 30 | EA = EX0 = ET0 = 1; 31 | TMOD = 0x01; //定时器方式控制寄存器 01方式16位 32 | TH0 = (65536-50000)/256; //T0定时器每次中断50ms 33 | TL0 = (65536-50000)%256; 34 | TR0 = 1; 35 | while(1); 36 | } -------------------------------------------------------------------------------- /code/pro8/pro8.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | char table[3]={0xfa,0xf9,0xfc}; 4 | char index=0; 5 | char cnt=0; //记录20次中断 6 | 7 | int Timer0() interrupt 1 8 | { 9 | TH0 = (65536-50000)/256; //T0定时器复位 10 | TL0 = (65536-50000)%256; 11 | cnt++; 12 | if(cnt == 20){ //1s到达,数码管显一个数 13 | cnt = 0; //计数复原 14 | index++; //数码管数字增加1,1次1s 15 | if(index == 1 || index==2){ 16 | P1 = table[1]; 17 | } 18 | else if(index == 3 || index==4 || index==5){ 19 | P1 = table[2]; 20 | } 21 | else if(index == 6){ //数码管数字跑完 22 | index = 0; //数码管下标复位0 23 | P1 = table[0]; 24 | } 25 | } 26 | } 27 | 28 | void main() 29 | { 30 | EA = EX0 = ET0 = 1; 31 | TMOD = 0x01; //定时器方式控制寄存器 01方式16位 32 | TH0 = (65536-50000)/256; //T0定时器每次中断50ms 33 | TL0 = (65536-50000)%256; 34 | TR0 = 1; 35 | P1 = table[0]; //在1s进入中断功能前先赋值,index=0 36 | while(1); 37 | } -------------------------------------------------------------------------------- /code/pro4/pro4.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | sbit P3_2 = P3^2; 4 | char table[9] = {0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //小灯亮方式 5 | char index=0; 6 | char i = 0; 7 | char flag = 1; //第一下按下会执行 8 | 9 | /*按键消抖*/ 10 | void delay(long time) 11 | { 12 | int i=0; 13 | while(time--) 14 | for(i=0;i<125;i++); 15 | } 16 | 17 | void pressbutton() interrupt 0 18 | { 19 | if(flag){ 20 | index++; 21 | P0 = table[index]; 22 | P1 = ~table[index]; 23 | if(index == 9){ 24 | index = 0; 25 | P0 = table[index]; //复原P0全灭 26 | P1 = ~table[index]; //复原P1全亮 27 | } 28 | flag=0; 29 | } 30 | } 31 | 32 | void main() 33 | { 34 | P1 = 0x00; //默认P1全亮 35 | P0 = 0xFF; //默认P0全灭 36 | IT0 = 0; //INT0下降沿有效 37 | EX0 = EA = 1; //中断允许位 38 | while(1){ 39 | if(P3_2 == 0){ //按钮按下,触发中断INT0,这是按键消抖方式 40 | delay(1); 41 | if(P3_2==0){ 42 | for(i=0;i<10;i++){ 43 | if(P3_2==0){ 44 | i=0; 45 | } 46 | } 47 | flag = 1; //消抖后使flag=1表示在中断中可以执行功能 48 | } 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /code/pro1/pro1.c: -------------------------------------------------------------------------------- 1 | #include 2 | sbit P1_0 = P1^0; 3 | sbit P1_1 = P1^1; 4 | char numbers[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 5 | char index = 0; 6 | char cnt = 0; //记录中断次数,每20次为1s 7 | 8 | int Timer0() interrupt 1 9 | { 10 | TH0 = (65536-50000)/256; //T0定时器复位 11 | TL0 = (65536-50000)%256; 12 | cnt++; 13 | if(cnt == 20){ //1s到达,数码管显一个数 14 | cnt = 0; //计数复原 15 | index++; //数码管数字增加1 16 | if(index == 10){ //数码管数字跑完 17 | TR0 = 0; //关闭定时器T0 18 | index = 0; //数码管下标复位0 19 | } 20 | } 21 | } 22 | 23 | 24 | void main() 25 | { 26 | EA = EX0 = ET0 = 1; 27 | TMOD = 0x01; //定时器方式控制寄存器 01方式16位 28 | TH0 = (65536-50000)/256; //T0定时器每次中断50ms 29 | TL0 = (65536-50000)%256; 30 | while(1){ 31 | if(P1_0 == 0){ //k1按下 32 | TR0 = 1; //开启T0计时器 33 | while(TR0){ 34 | P0 = numbers[index]; 35 | } 36 | P0 = 0xFF; 37 | } 38 | if(P1_1 == 0){ //k2按下 39 | TR0 = 1; //开启T0计时器 40 | while(TR0){ 41 | P0 = numbers[9-index]; 42 | } 43 | P0 = 0xFF; 44 | } 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /code/pro9/pro9.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | char table[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; 4 | char index = 0; 5 | char cnt = 0; //记录中断次数,每20次为1s 6 | 7 | int Timer0() interrupt 1 8 | { 9 | TH0 = (65536-50000)/256; //T0定时器复位 10 | TL0 = (65536-50000)%256; 11 | cnt++; 12 | if(cnt == 10){ //0.5s到达 13 | cnt = 0; //计数复原 14 | index++; //数码管数字增加1 15 | switch(index){ 16 | case 4:P0=table[0];break; 17 | case 8:P0=table[1];break; 18 | case 12:P0=table[2];break; 19 | case 16:P0=table[3];break; 20 | case 20:P0=table[4];break; 21 | case 24:P0=table[5];break; 22 | case 28:P0=table[6];break; 23 | case 32:P0=table[7];break; 24 | 25 | case 35:P0=table[6];break; 26 | case 38:P0=table[5];break; 27 | case 41:P0=table[4];break; 28 | case 44:P0=table[3];break; 29 | case 47:P0=table[2];break; 30 | case 50:P0=table[1];break; 31 | case 53:P0=table[0];break; 32 | } 33 | if(index == 53){ //数码管数字跑完 34 | index = 2; //数码管下标复位0 35 | } 36 | } 37 | } 38 | 39 | 40 | void main() 41 | { 42 | EA = EX0 = ET0 = 1; 43 | TMOD = 0x01; //定时器方式控制寄存器 01方式16位 44 | TH0 = (65536-50000)/256; //T0定时器每次中断50ms 45 | TL0 = (65536-50000)%256; 46 | P0 = 0xff; //小灯初始化全灭 47 | TR0 = 1; 48 | while(1); 49 | //经过1s进入中断,所以开始时要等待1s 50 | } -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/lcd12864.h: -------------------------------------------------------------------------------- 1 | #ifndef _LCD12864_H_ 2 | #define _LCD12864_H_ 3 | 4 | //---包含头文件---// 5 | #include 6 | 7 | 8 | //---数据传输口定义: P1口作为数据传输口---// 9 | #define LCD_DATA P1 10 | 11 | //---寄存器位声明---// 12 | sbit LCD_RS = P3^7; //并行数据/命令选择端(串行片选信号) 13 | sbit LCD_RW = P3^6; //并行读/写控制端(串行数据口) 14 | sbit LCD_EN = P3^5; //并行使能控制端(串行时钟信号端) 15 | 16 | //---LCD_Write写入模式---// 17 | #define MODE_DATA 1 //1是写入数据 18 | #define MODE_CMD 0 //0是写入命令 19 | 20 | //---函数声明---// 21 | void Delay_1ms(unsigned int time); //在51单片机12MHZ时钟下的延时函数 22 | void LCD_Check_Busy(); //等待忙标志函数 23 | void LCD_Init(); //初始化子函数 24 | void LCD_Write(unsigned char Write_Mode, unsigned char Data_Command); 25 | unsigned char LCD_Read(unsigned char Read_Mode); 26 | void LCD_Write_Strs(unsigned char addr, unsigned char *str, unsigned char count); 27 | 28 | //---绘图模式声明---// 29 | void LCD_Clear_DDRAM(); //清空DDRAM显示 30 | void LCD_Draw_Clear(); //清空绘图RAM的函数 31 | void LCD_Draw_Point(unsigned char location_x, unsigned char location_y, unsigned char DrawOrClear); //画一个点 32 | void LCD_Draw_Square(unsigned char location_x, unsigned char location_y, unsigned char DrawOrClear); //画一个2X2的正方形 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/main.lst: -------------------------------------------------------------------------------- 1 | C51 COMPILER V9.59.0.0 MAIN 12/09/2019 23:55:14 PAGE 1 2 | 3 | 4 | C51 COMPILER V9.59.0.0, COMPILATION OF MODULE MAIN 5 | OBJECT MODULE PLACED IN .\Objects\main.obj 6 | COMPILER INVOKED BY: D:\Keil C51\C51\BIN\C51.EXE main.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\mai 7 | -n.lst) OBJECT(.\Objects\main.obj) 8 | 9 | line level source 10 | 11 | 1 #include "game.h" 12 | 2 13 | 3 void main(){ 14 | 4 1 //初始化 15 | 5 1 init(); 16 | 6 1 17 | 7 1 while(1){ 18 | 8 2 unsigned char ch = Game_Menu();//画出初始游戏界面 19 | 9 2 if(ch == SYS_EASY) 20 | 10 2 Sys_Easy(); 21 | 11 2 if(ch == SYS_HARD) 22 | 12 2 Sys_Hard(); 23 | 13 2 if(ch == SYS_TIPS) 24 | 14 2 Sys_Tips(); 25 | 15 2 } 26 | 16 1 } 27 | 17 28 | 29 | 30 | MODULE INFORMATION: STATIC OVERLAYABLE 31 | CODE SIZE = 2360 ---- 32 | CONSTANT SIZE = 186 ---- 33 | XDATA SIZE = ---- 100 34 | PDATA SIZE = ---- ---- 35 | DATA SIZE = 16 45 36 | IDATA SIZE = ---- ---- 37 | BIT SIZE = 2 3 38 | END OF MODULE INFORMATION. 39 | 40 | 41 | C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S) 42 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/snake.h: -------------------------------------------------------------------------------- 1 | /******************************************** 2 | * snake.h 宏定义常量 3 | ********************************************/ 4 | #define OK 1 5 | #define ERROR 0 6 | #define true 1 7 | #define false 0 8 | #define OVERFLOW -1 9 | 10 | /******************************************** 11 | * snake.h 变量申明 12 | * 用于蛇头插入结点结果返回 13 | * 返回状态有两种:OK=1、ERROR=0 14 | ********************************************/ 15 | typedef bit Status; 16 | 17 | 18 | /******************************************** 19 | * 这里的数据域的元素类型是两个坐标 20 | * 坐标点Point(X,Y) 21 | * 用于小蛇数据域和食物坐标点 22 | ********************************************/ 23 | typedef struct Point{ 24 | unsigned char X; 25 | unsigned char Y; 26 | }Point; 27 | 28 | /******************************************** 29 | * 蛇结点声明 30 | * 数据域:结点坐标点Location->Point(X,Y) 31 | * 指针域:下一个结点SnakeNode地址 32 | ********************************************/ 33 | typedef struct SnakeNode{ 34 | Point Location; 35 | struct SnakeNode *next; 36 | }SnakeNode, *SnakePtr; 37 | 38 | /******************************************** 39 | * 蛇声明 40 | * 蛇头指针:front->指向下一个结点地址 41 | * 蛇尾指针:rear->指向下一个结点地址(NULL) 42 | * 蛇的长度:length 43 | ********************************************/ 44 | typedef struct Snake{ 45 | SnakePtr front; 46 | SnakePtr rear; 47 | unsigned char length; 48 | }Snake; 49 | 50 | /******************************************** 51 | * 有关小蛇操作的函数声明 52 | ********************************************/ 53 | // 初始化一条蛇 54 | void Snake_Init(Snake *snake); 55 | // 销毁一条蛇 56 | void Snake_Destroy(Snake *snake); 57 | // 在蛇头处插入一个结点 58 | Status Insert_At_Snake_Front(Snake *snake, Point *elem); 59 | // 在蛇尾处释放一个结点,返回擦除位置的坐标 60 | Point Remove_At_Snake_Rear(Snake *snake); 61 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/README.md: -------------------------------------------------------------------------------- 1 | ### 项目代码规范 2 | 3 | + 缩进:4个空格 4 | + 备注:备注符与内容中间添加 1 个空格 5 | 6 | ### 项目命令规范 7 | 8 | + 生存期内(临时)变量: 全部小写,'_'连接。 如 snake_towds 9 | + 静态定义(全局)变量: 全部小写,'_'连接。 如 snake_towds 10 | + 常量: 全部大写,'_'连接。 如 #define SYS_EASY 1 11 | + 宏定义: 全部大写,'_'连接。 如 #define LCD_DATA P1 12 | + 函数: 开头字母大写,'_'连接。 如 void LCD_Draw_Clear(); 13 | + 结构体: 开头字母大写,紧挨连接。 如 typedef struct SnakeNode{}SnakeNode; 14 | + 类型声明: 开头字母大写,'_'连接。 如 typedef unsigned char Status; 15 | 16 | ### 项目注意事项 17 | 18 | + 本项目基于52单片机 19 | - 52内部 ROM存储器:8k 、 RAM :256B 20 | 21 | + 存储类型与存储区关系 22 | - data ---> 可寻址片内ram 23 | - bdata ---> 可位寻址的片内ram 24 | - idata ---> 可寻址片内ram,允许访问全部内部ram 25 | - pdata ---> 分页寻址片外ram (MOVX @R0) (256 BYTE/页) 26 | - xdata ---> 可寻址片外ram (64k 地址范围FFFFH) 27 | - code ---> 程序存储区 (64k 地址范围),对应MOVC @DPTR 28 | 29 | + 本项目基于带中文字库的LCD12864(ST7920)显示屏 30 | - ⭐具体请参考 ST7920 中文手册,下述总结仅作个人归纳使用 31 | - 此显示屏采用上下分屏 32 | - 写入CMD 0x30:表示开启基本指令集 33 | - 写入CMD 0x34:表示开启扩展指令集 34 | - 写入CMD 0x01:表示清除DDRAM屏幕 35 | - 写入CMD 0x36:表示开启GDRAM显示,即显示绘图RAM,不显示字符RAM 36 | - 都是基于先选择纵坐标,再选择横坐标 37 | 38 | - 字符RAM地址空间: 39 | 40 | |地位地址|||||||高位地址| 41 | |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| 42 | |0x80|0x81|0x82|0x83|0x84|0x85|0x86|0x87| 43 | |0x90|0x91|0x92|0x93|0x94|0x95|0x96|0x97| 44 | |0x88|0x89|0x8A|0x8B|0x8C|0x8D|0x8E|0x8F| 45 | |0x98|0x99|0x9A|0x9B|0x9C|0x9D|0x9E|0x9F| 46 | 47 |
48 | 49 |
50 | 51 | - P0:8位并行数据线 52 | - R/S:指令和数据寄存器的选择控制线 53 | - R/W:读写控制线 54 | - E:使能线 55 | 56 | - GDRAM:对于屏幕上面任意一个点,如果我们想要点亮它,必须先 57 | 读出此点的状态,然后再修改该点,最后送出去。即 读--修改--写 58 | 59 |
60 | 61 |
62 | 63 | ### 项目使用手册 64 | 65 |
66 | 67 |
68 | 69 | > 立创 EDA 示意图 70 | -------------------------------------------------------------------------------- /code/pro2/pro2.c: -------------------------------------------------------------------------------- 1 | #include 2 | sbit P0_0 = P0^0; 3 | sbit P0_1 = P0^1; 4 | sbit P0_2 = P0^2; 5 | sbit P0_3 = P0^3; 6 | sbit P0_4 = P0^4; 7 | sbit P0_5 = P0^5; 8 | 9 | char numbers[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 10 | char index = 0; 11 | char i = 0; 12 | char cnt = 0; //记录中断次数,每20次为1s 13 | 14 | void green(){ 15 | P0_0 = 0; //绿灯亮 16 | P0_1 = P0_2 = 1; 17 | } 18 | 19 | void yellow(){ 20 | P0_2 = 0; //黄灯亮 21 | P0_0 = P0_1 = 1; 22 | } 23 | 24 | void red(){ 25 | P0_1 = 0; 26 | P0_0 = P0_2 = 1; 27 | } 28 | 29 | void clear(){ 30 | P0_0 = P0_1 = P0_2 = 1; 31 | } 32 | 33 | int Timer0() interrupt 1 34 | { 35 | TH0 = (65536-50000)/256; //T0定时器复位 36 | TL0 = (65536-50000)%256; 37 | cnt++; 38 | if(cnt == 20){ //1s到达,数码管显一个数 39 | cnt = 0; //计数复原 40 | index++; //数码管数字增加1 41 | if(1<=index && index<=9){ //前9s绿灯亮 42 | i = 9-index; 43 | green(); 44 | } 45 | if(10<=index && index<=12){ //中间3s黄灯亮 46 | i = 3-(index-9); 47 | yellow(); 48 | } 49 | if(13<=index && index<=21){ //后面9s红灯亮 50 | i = 9-(index-12); 51 | red(); 52 | } 53 | P1 = numbers[i]; //数码管置数 54 | if(index == 22){ //数码管数字跑完一共需要9+3+9=21s 55 | clear(); 56 | TR0 = 0; //关闭定时器T0 57 | index = 0; //数码管下标复位0 58 | } 59 | } 60 | } 61 | 62 | int Timer1() interrupt 3 63 | { 64 | TH1 = (65536-50000)/256; //T0定时器复位 65 | TL1 = (65536-50000)%256; 66 | cnt++; 67 | if(cnt == 20){ //1s到达,数码管显一个数 68 | cnt = 0; //计数复原 69 | index++; //数码管数字增加1 70 | if(index == 10){ //数码管数字跑完 71 | TR1 = 0; //关闭定时器T0 72 | index = 0; //数码管下标复位0 73 | } 74 | } 75 | } 76 | 77 | void main() 78 | { 79 | EA = EX0 = EX1 = ET0 = ET1 = 1; 80 | TMOD = 0x01; //定时器方式控制寄存器 T0、T1为01方式16位 81 | TH0 = (65536-50000)/256; //T0定时器每次中断50ms 82 | TL0 = (65536-50000)%256; 83 | TH1 = (65536-50000)/256; 84 | TL1 = (65536-50000)%256; 85 | TR0 = 1; 86 | TR1 = 1; //打开T0、T1计数器 87 | P1 = numbers[0]; 88 | while(1); 89 | } -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/snake.c: -------------------------------------------------------------------------------- 1 | #include "snake.h" 2 | #include 3 | #include 4 | 5 | // 初始化一条蛇 6 | void Snake_Init(Snake *snake){ 7 | // 初始化的蛇有两个结点 8 | SnakeNode *pNew; 9 | 10 | pNew = (SnakeNode*)malloc(sizeof(SnakeNode)); 11 | snake->front = snake->rear = pNew; 12 | snake->length = 1; 13 | 14 | pNew->next = NULL; 15 | pNew->Location.X = 2; 16 | pNew->Location.Y = 0; 17 | 18 | pNew = (SnakeNode*)malloc(sizeof(SnakeNode)); 19 | pNew->next = NULL; 20 | pNew->Location.X = 0; 21 | pNew->Location.Y = 0; 22 | 23 | snake->front->next = pNew; 24 | snake->rear = pNew; 25 | snake->length = 2; 26 | } 27 | 28 | // 销毁一条蛇 29 | void Snake_Destroy(Snake *snake){ 30 | // 释放掉所有的结点 31 | SnakeNode *p = snake->front; 32 | SnakeNode *q; 33 | 34 | while(p){ 35 | q = p->next; 36 | free(p); 37 | p = q; 38 | } 39 | 40 | snake->rear = snake->front = NULL; 41 | snake->length = 0; 42 | } 43 | 44 | // 在蛇头处插入一个结点 45 | Status Insert_At_Snake_Front(Snake *snake, Point *elem){ 46 | SnakeNode *pNew; 47 | 48 | pNew = (SnakeNode*)malloc(sizeof(SnakeNode)); // 新开辟一个结点 49 | pNew->next = NULL; 50 | pNew->Location.X = elem->X; 51 | pNew->Location.Y = elem->Y; 52 | 53 | // 之后将新结点插入到蛇头处 54 | pNew->next = snake->front; 55 | // 调整蛇头指针 56 | snake->front = pNew; 57 | // 调整蛇身的长度 58 | ++(snake->length); //长度加一 59 | 60 | return OK; 61 | } 62 | 63 | // 在蛇尾处释放一个结点 64 | Point Remove_At_Snake_Rear(Snake *snake){ 65 | Point ClearLocation; // 保存擦除的结点的坐标 66 | SnakeNode *p = snake->front; // p最开始指向第一个结点 67 | 68 | while(p->next != snake->rear){ 69 | p = p->next; 70 | } 71 | 72 | ClearLocation.X = snake->rear->Location.X; 73 | ClearLocation.Y = snake->rear->Location.Y; 74 | 75 | free(snake->rear); 76 | p->next = NULL; 77 | snake->rear = p; 78 | --(snake->length); 79 | 80 | return ClearLocation; 81 | } 82 | 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 📟 AT89C51 系列单片机 2 |   *🏷 单片机(Single-Chip Microcomputer)又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了 I/O 设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。* 3 | 4 |
5 | 6 |
7 |
8 |
9 | 10 | #### 1. 数码管数字显示控制程序设计。控制要求:用按键K1和K2分别控制数码管显示数字0~9的顺序,当按下K1键时按从0到9的顺序显示,当按下K2时按从9到0的顺序显示。时间间隔均为1秒。硬件电路如图所示。 11 |
12 | 点击展开 Proteus仿真实验图 13 | 14 |
15 | 18 |
---
19 | 20 | #### 2. 交通控制系统,如下图所示,是交叉路口,要求:绿灯亮9秒后,黄灯闪3秒,后红灯亮9秒,两个数码管分别显视各种灯所剩余时间。 21 |
22 | 点击展开 Proteus仿真实验图 23 | 24 |
25 | 28 |
---
29 | 30 | #### 3. LED灯要求亮2秒钟,灭2秒钟,要求使用定时计数器,要求写主程序与中断程序,fosc = 6MHz 31 |
32 | 点击展开 Proteus仿真实验图 33 | 34 |
35 | 38 |
---
39 | 40 | #### 4. 利用外部中断0,每申请一次中断使P0口连接的发光二极管点亮一个,从低位到高位,同时使P1口连接的发光二极管熄灭一个,从高位到低位。 41 |
42 | 点击展开 Proteus仿真实验图 43 | 44 |
45 | 48 |
---
49 | 50 | #### 5. 完成下面电路所示的功能,K1,K2对应两个开关按键。P1口对应发光二极管的状态 51 | | |P1.0|P1.1|P1.2|P1.3|P1.4|P1.5|P1.6|P1.7| 52 | |:--:|:---|:---|:---|:---|:---|:---|:---|:---| 53 | |K1=0,K2=0|○|○|○|○|○|○|○|○| 54 | |K1=0,K2=1|●|●|●|●|○|○|○|○| 55 | |K1=1,K2=0|●|●|○|○|●|●|○|○| 56 | |K1=1,K2=1|●|●|●|●|●|●|●|●| 57 | 58 |
59 | 点击展开 Proteus仿真实验图 60 | 61 |
62 | 65 |
---
66 | 67 | #### 6. 在一个数码管上循环显示“H”“E” “L” “L” “O” ,循环的时间为1s。 68 |
69 | 点击展开 Proteus仿真实验图 70 | 71 |
72 | 75 |
---
76 | 77 | #### 7. 试采用定时方式2,在P1.0引脚上输出频率为1KHz的方波。 78 |
79 | 点击展开 Proteus仿真实验图 80 | 81 |
82 | 85 |
---
86 | 87 | #### 8. 完成下面电路的功能,P1口对应发光二极管的状态,状态1显示的时间为1s,状态2显示的时间为2s,状态3显示的时间为3s,如此循环。 88 | |状态|P1.0|P1.1|P1.2| 89 | |:--:|:---|:---|:---| 90 | |状态1|●|○|●| 91 | |状态2|○|●|●| 92 | |状态3|●|●|○| 93 | 94 |
95 | 点击展开 Proteus仿真实验图 96 | 97 |
98 | 101 |
---
102 | 103 | #### 9. 彩灯系统,实现8个发光二极管从左到右点亮,每个发光二极管点亮的时间为2s,然后从右到左亮,每个发光二极管点亮的时间为1.5s。 104 | 105 |
106 | 点击展开 Proteus仿真实验图 107 | 108 |
109 | 112 |
---
113 | 114 | #### 10. 采用51单片机设计门禁系统,4X4键盘用户输入密码,错误蜂鸣器叫一声,正确LED闪烁,12864作为用户界面,初始显示“欢迎光临”,正确与错误时12864有相应的提示。 115 | 116 |
117 | 点击展开 Proteus仿真实验图 118 | 119 |
120 | 123 |
---
124 | 125 |
126 | - 完 - 127 |
128 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/snake.lst: -------------------------------------------------------------------------------- 1 | C51 COMPILER V9.59.0.0 SNAKE 12/09/2019 23:55:14 PAGE 1 2 | 3 | 4 | C51 COMPILER V9.59.0.0, COMPILATION OF MODULE SNAKE 5 | OBJECT MODULE PLACED IN .\Objects\snake.obj 6 | COMPILER INVOKED BY: D:\Keil C51\C51\BIN\C51.EXE snake.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\sn 7 | -ake.lst) OBJECT(.\Objects\snake.obj) 8 | 9 | line level source 10 | 11 | 1 #include "snake.h" 12 | 2 #include 13 | 3 #include 14 | 4 15 | 5 //初始化一条蛇 16 | 6 void Snake_Init(Snake *snake){ 17 | 7 1 //初始化的蛇有两个结点 18 | 8 1 SnakeNode *pNew; 19 | 9 1 20 | 10 1 pNew = (SnakeNode*)malloc(sizeof(SnakeNode)); 21 | 11 1 snake->front = snake->rear = pNew; 22 | 12 1 snake->length = 1; 23 | 13 1 24 | 14 1 pNew->next = NULL; 25 | 15 1 pNew->Location.X = 2; 26 | 16 1 pNew->Location.Y = 0; 27 | 17 1 28 | 18 1 pNew = (SnakeNode*)malloc(sizeof(SnakeNode)); 29 | 19 1 pNew->next = NULL; 30 | 20 1 pNew->Location.X = 0; 31 | 21 1 pNew->Location.Y = 0; 32 | 22 1 33 | 23 1 snake->front->next = pNew; 34 | 24 1 snake->rear = pNew; 35 | 25 1 snake->length = 2; 36 | 26 1 } 37 | 27 38 | 28 //销毁一条蛇 39 | 29 void Snake_Destroy(Snake *snake){ 40 | 30 1 //释放掉所有的结点 41 | 31 1 SnakeNode *p = snake->front; 42 | 32 1 SnakeNode *q; 43 | 33 1 44 | 34 1 while(p){ 45 | 35 2 q = p->next; 46 | 36 2 free(p); 47 | 37 2 p = q; 48 | 38 2 } 49 | 39 1 50 | 40 1 snake->rear = snake->front = NULL; 51 | 41 1 snake->length = 0; 52 | 42 1 } 53 | 43 54 | 44 //在蛇头处插入一个结点 55 | 45 Status Insert_At_Snake_Front(Snake *snake, Point *elem){ 56 | 46 1 SnakeNode *pNew; 57 | 47 1 58 | 48 1 pNew = (SnakeNode*)malloc(sizeof(SnakeNode));//新开辟一个结点 59 | 49 1 60 | 50 1 //对这个新结点进行赋值 61 | 51 1 pNew->next = NULL;//指针域赋值为空 62 | 52 1 pNew->Location.X = elem->X;//数据域赋值为结点坐标 63 | 53 1 pNew->Location.Y = elem->Y; 64 | 54 1 65 | C51 COMPILER V9.59.0.0 SNAKE 12/09/2019 23:55:14 PAGE 2 66 | 67 | 55 1 //之后将新结点插入到蛇头处 68 | 56 1 pNew->next = snake->front; 69 | 57 1 //调整蛇头指针 70 | 58 1 snake->front = pNew; 71 | 59 1 //调整蛇身的长度 72 | 60 1 ++(snake->length);//长度加一 73 | 61 1 74 | 62 1 return OK; 75 | 63 1 } 76 | 64 77 | 65 //在蛇尾处释放一个结点 78 | 66 Point Remove_At_Snake_Rear(Snake *snake){ 79 | 67 1 Point ClearLocation; //保存擦除的结点的坐标 80 | 68 1 SnakeNode *p = snake->front; //p最开始指向第一个结点 81 | 69 1 82 | 70 1 //首先遍历找到蛇尾结点前的一个结点,由于游戏设定,蛇身长度不可能小于2 83 | 71 1 while(p->next != snake->rear){ 84 | 72 2 p = p->next; 85 | 73 2 } 86 | 74 1 87 | 75 1 //退出上面的循环的时候,此时p指向尾结点的前一个结点 88 | 76 1 //释放结点之前,取出要被释放的结点的数据 89 | 77 1 ClearLocation.X = snake->rear->Location.X; 90 | 78 1 ClearLocation.Y = snake->rear->Location.Y; 91 | 79 1 92 | 80 1 //现在释放蛇的尾结点 93 | 81 1 free(snake->rear);//释放蛇的尾结点 94 | 82 1 95 | 83 1 //之后修改尾节点之前的那个结点的数据 96 | 84 1 p->next = NULL; 97 | 85 1 98 | 86 1 //然后更新尾结点 99 | 87 1 snake->rear = p; 100 | 88 1 101 | 89 1 //然后修改蛇身长度 102 | 90 1 --(snake->length); 103 | 91 1 104 | 92 1 return ClearLocation; 105 | 93 1 } 106 | 94 107 | 108 | 109 | MODULE INFORMATION: STATIC OVERLAYABLE 110 | CODE SIZE = 714 ---- 111 | CONSTANT SIZE = ---- ---- 112 | XDATA SIZE = ---- ---- 113 | PDATA SIZE = ---- ---- 114 | DATA SIZE = ---- 32 115 | IDATA SIZE = ---- ---- 116 | BIT SIZE = ---- ---- 117 | END OF MODULE INFORMATION. 118 | 119 | 120 | C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S) 121 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/lcd12864.c: -------------------------------------------------------------------------------- 1 | #include "lcd12864.h" 2 | #include "intrins.h" 3 | 4 | void Delay_1ms(unsigned int n){ 5 | unsigned char i; 6 | unsigned char cnt = 0; 7 | for(i=1; i<=n; i++) 8 | while(cnt < 250) 9 | cnt++; 10 | } 11 | 12 | // 等待忙标志函数 13 | void LCD_Check_Busy(){ 14 | LCD_DATA = 0xff; 15 | LCD_EN = 0; // 确保使能端为低电平 16 | LCD_RS = 0; // 1为数据,0为命令 17 | LCD_RW = 1; // 1为从12864读取,0为向12864写入 18 | LCD_EN = 1; 19 | 20 | while(LCD_DATA & 0x80); // 忙状态检测 21 | LCD_EN = 0; 22 | } 23 | 24 | // 并口模式初始化函数 25 | void LCD_Init(){ 26 | LCD_Write(MODE_CMD, 0x30); // 基本指令集,8位并行 27 | LCD_Write(MODE_CMD, 0x01); // 清除显示DDRAM 28 | LCD_Write(MODE_CMD, 0x06); // 启始点设定:光标右移 29 | LCD_Write(MODE_CMD, 0x0C); // 显示状态开关:整体显示开,光标显示关,光标显示反白关 30 | LCD_Write(MODE_CMD, 0x02); // 地址归零 31 | } 32 | 33 | // 并口写入函数 34 | void LCD_Write(unsigned char Write_Mode, unsigned char Data_Command){ 35 | /* 36 | LCD_Check_Busy(); 37 | LCD_EN = 0; // 确保使能端为低电平 38 | LCD_RS = Write_Mode; // 1为写入数据,0为写入命令 39 | LCD_RW = 0; // 1为从12864读取,0为向12864写入 40 | 41 | LCD_DATA = Data_Command; 42 | LCD_EN = 1; 43 | Delay_1ms(1); 44 | LCD_EN = 0; 45 | */ 46 | LCD_Check_Busy(); 47 | LCD_RS = Write_Mode; 48 | LCD_RW = 0; 49 | LCD_EN = 0; 50 | LCD_DATA = Data_Command; 51 | _nop_(); 52 | _nop_(); 53 | LCD_EN = 1; 54 | _nop_(); 55 | _nop_(); 56 | LCD_EN = 0; 57 | LCD_RW = 1; 58 | LCD_RS = 1; 59 | } 60 | 61 | // 读取RAM中相应数据,1为读取数据,0为读取命令(即忙标志) 62 | unsigned char LCD_Read(unsigned char Read_Mode){ 63 | unsigned char Data_Command; 64 | LCD_Check_Busy(); // 等待忙标志函数 65 | LCD_DATA = 0xff; // 由于IO口是准双向,所以读取之前先写入高电平 66 | LCD_RS = Read_Mode; // 1为读取数据,0为读取命令,读命令读的是忙标志和此时光标的位置 67 | LCD_RW = 1; // 1为从12864读取,0为向12864写入 68 | LCD_EN = 0; 69 | LCD_EN = 1; 70 | Data_Command = LCD_DATA; 71 | LCD_EN = 0; 72 | 73 | return Data_Command; 74 | } 75 | 76 | void LCD_Write_Strs(unsigned char addr, unsigned char *str, unsigned char count){ 77 | unsigned char i; 78 | LCD_Write(MODE_CMD, 0x30); 79 | LCD_Write(MODE_CMD, addr); // 设定DDRAM地址 80 | for(i=0; i 31){ 142 | location_y %= 32; // location_y 要对32取余 143 | } 144 | 145 | // 再计算显示区域的横坐标(0-127) 146 | location_x_port = location_x / 16; //先计算要写入第几块 147 | 148 | LCD_Write(MODE_CMD, 0x80 + location_y); // 显示区域的纵坐标,即第几行 149 | LCD_Write(MODE_CMD, 0x88 + location_x_port); // 横坐标:选择横坐标的第几块 150 | 151 | // 有了坐标之后,取出此坐标处的旧图片数据 152 | //Point_data_old_H = LCD_Read(1); // 假读 153 | LCD_Read(1); // 假读 154 | Point_data_old_H = LCD_Read(1); 155 | Point_data_old_L = LCD_Read(1); 156 | 157 | LCD_Write(MODE_CMD, 0x80 + location_y); // 显示区域的纵坐标,即第几行 158 | LCD_Write(MODE_CMD, 0x88 + location_x_port); // 横坐标:选择横坐标的第几块 159 | 160 | // 上面之所有要再写入一遍地址,是因为第一次写入的是要读取的数据的地址 161 | // 现在第二次写入的是要绘制的点的地址 162 | 163 | 164 | // 下面计算出要向已经选好的显示区域写入的数据 165 | location_x %= 16; // 首先 location_x 要对16取余 166 | 167 | if(location_x >= 8){ 168 | location_x %= 8; 169 | } 170 | // 这里要判断是擦除点还是画一个点 171 | if(DrawOrClear == 1){ 172 | LCD_Write(MODE_DATA, Point_data_old_H); 173 | LCD_Write(MODE_DATA, (Point_data_old_L) | (0X80>>location_x)); // ||:这个是逻辑或 |:这个才是按位或运算 174 | }else{ 175 | LCD_Write(MODE_DATA, Point_data_old_H); 176 | LCD_Write(MODE_DATA, (Point_data_old_L) & (~(0X80>>location_x))); 177 | } 178 | 179 | LCD_Write(MODE_CMD, 0x30); // 关闭扩充指令集 180 | } 181 | 182 | // 画一个2X2的正方形函数 183 | void LCD_Draw_Square(unsigned char location_x, unsigned char location_y, unsigned char DrawOrClear){ 184 | LCD_Draw_Point(location_x, location_y, DrawOrClear); 185 | LCD_Draw_Point(location_x + 1, location_y, DrawOrClear); 186 | LCD_Draw_Point(location_x, location_y + 1, DrawOrClear); 187 | LCD_Draw_Point(location_x + 1, location_y + 1, DrawOrClear); 188 | } 189 | 190 | -------------------------------------------------------------------------------- /code/pro10/zh-hans.h: -------------------------------------------------------------------------------- 1 | char code mi[] = { 2 | //-- 密 -- 3 | 0x10,0x4C,0x24,0x04,0xF4,0x84,0x4D,0x56,0x24,0x24,0x14,0x84,0x24,0x54,0x0C,0x00,//16字节 4 | 0x00,0x01,0xFD,0x41,0x40,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0xFC,0x00,0x00,0x00 5 | }; 6 | char code ma[] = 00000000000000000000000000000000000000000000000000000000 7 | //-- 码 -- 8 | 0x02,0x82,0xF2,0x4E,0x43,0xE2,0x42,0xFA,0x02,0x02,0x02,0xFF,0x02,0x80,0x00,0x00, 9 | 0x01,0x00,0x7F,0x20,0x20,0x7F,0x08,0x09,0x09,0x09,0x0D,0x49,0x81,0x7F,0x01,0x00 10 | }; 11 | char code zheng[] = { 12 | //-- 正 -- 13 | 0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0xC2,0x83,0x02,0x00,0x00, 14 | 0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x60,0x40,0x00 15 | }; 16 | char code que[] = { 17 | //-- 确 -- 18 | 0x04,0x84,0xE4,0x9C,0x84,0xC6,0x24,0xF0,0x28,0x27,0xF4,0x2C,0x24,0xF0,0x20,0x00, 19 | 0x01,0x00,0x7F,0x20,0x20,0xBF,0x40,0x3F,0x09,0x09,0x7F,0x09,0x89,0xFF,0x00,0x00 20 | }; 21 | char code cuo[] = { 22 | //-- 错 -- 23 | 0x40,0x30,0xef,0x24,0x64,0x48,0x48,0x7f,0x48,0x48,0x48,0x7f,0x48,0x48,0x40,0x00, 24 | 0x01,0x01,0x7f,0x21,0x11,0x00,0xff,0x49,0x49,0x49,0x49,0x49,0xff,0x00,0x00,0x00 25 | }; 26 | char code wu[] = { 27 | //-- 误 -- 28 | 0x40,0x42,0xcc,0x00,0x00,0x80,0x9e,0x92,0x92,0x92,0x92,0x92,0x9e,0x80,0x00,0x00, 29 | 0x00,0x00,0x7f,0x20,0x94,0x84,0x44,0x24,0x14,0x0f,0x14,0x24,0x44,0x84,0x84,0x00 30 | }; 31 | /* 32 | 128x64 33 | 34 | 16x16 35 | 36 | 8 4 37 | ...................................... 38 | ...................................... 39 | ...................................... 40 | ...................................... 41 | ...................................... 42 | ...................................... 43 | ...................................... 44 | ...................................... 45 | ...................................... 46 | */ 47 | char code huan[] = { 48 | //-- 欢 -- 49 | 0x04, 0x34, 0xC4, 0x04, 0xC4, 0x3C, 0x20, 0x10, 0x0F, 0xE8, 0x08, 0x08, 0x28, 0x18, 0x00, 0x00, 50 | 0x10, 0x08, 0x06, 0x01, 0x82, 0x8C, 0x40, 0x30, 0x0C, 0x03, 0x0C, 0x10, 0x60, 0xC0, 0x40, 0x00 51 | }; 52 | char code ying[] = { 53 | //-- 迎 -- 54 | 0x40, 0x42, 0x44, 0xC8, 0x00, 0xFC, 0x04, 0x02, 0x82, 0xFC, 0x04, 0x04, 0x04, 0xFE, 0x04, 0x00, 55 | 0x00, 0x40, 0x20, 0x1F, 0x20, 0x47, 0x42, 0x41, 0x40, 0x7F, 0x40, 0x42, 0x44, 0x63, 0x20, 0x00 56 | }; 57 | char code guang[] = { 58 | //-- 光 -- 59 | 0x40, 0x40, 0x42, 0x44, 0x58, 0xC0, 0x40, 0x7F, 0x40, 0xC0, 0x50, 0x48, 0x46, 0x64, 0x40, 0x00, 60 | 0x00, 0x80, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x40, 0x70, 0x00 61 | }; 62 | char code lin[] = { 63 | //-- 临 -- 64 | 0x00, 0xFC, 0x00, 0xFF, 0x40, 0x20, 0x10, 0x0C, 0x2B, 0x48, 0xC8, 0x08, 0x08, 0x8C, 0x08, 0x00, 65 | 0x00, 0x1F, 0x00, 0xFF, 0x00, 0xFF, 0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x41, 0xFF, 0x01, 0x00 66 | }; 67 | char code qing[] = { 68 | //-- 请 -- 69 | 0x40,0x42,0xcc,0x00,0x00,0x44,0x54,0x54,0x54,0x7f,0x54,0x54,0x54,0x44,0x40,0x00,0x00,0x00,0x7f, 70 | 0x20,0x10,0x00,0xff,0x15,0x15,0x15,0x55,0x95,0x7f,0x00,0x00,0x00 71 | }; 72 | char code shu[] = { 73 | //-- 输 -- 74 | 0x88,0x68,0x1f,0xc8,0x08,0x10,0xc8,0x54,0x52,0xd1,0x12,0x94,0x08,0xd0,0x10,0x00,0x09,0x19,0x09, 75 | 0xff,0x05,0x00,0xff,0x12,0x92,0xff,0x00,0x5f,0x80,0x7f,0x00,0x00 76 | }; 77 | char code ru[] = { 78 | //-- 入 -- 79 | 0x00,0x00,0x00,0x00,0x00,0x01,0xe2,0x1c,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20, 80 | 0x10,0x0c,0x03,0x00,0x00,0x00,0x03,0x0c,0x30,0x40,0x80,0x80,0x00 81 | }; 82 | char code si[] = { 83 | //-- 四 -- 84 | 0x00,0xfc,0x04,0x04,0x04,0xfc,0x04,0x04,0x04,0xfc,0x04,0x04,0x04,0xfc,0x00,0x00,0x00,0x7f,0x28, 85 | 0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7f,0x00,0x00 86 | }; 87 | char code wei[] = { 88 | //-- 位 -- 89 | 0x00,0x80,0x60,0xf8,0x07,0x10,0x90,0x10,0x11,0x16,0x10,0x10,0xd0,0x10,0x00,0x00,0x01,0x00,0x00, 90 | 0xff,0x40,0x40,0x41,0x5e,0x40,0x40,0x70,0x4e,0x41,0x40,0x40,0x00 91 | }; 92 | char code yi[] = { 93 | //-- 一 -- 94 | 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00, 95 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 96 | }; 97 | char code er[] = { 98 | //-- 二 -- 99 | 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x10,0x10,0x10, 100 | 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00 101 | }; 102 | char code san[] = { 103 | //-- 三 -- 104 | 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x20,0x20,0x20, 105 | 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00 106 | }; 107 | char code wu1[] = { 108 | //-- 五 -- 109 | 0x00,0x02,0x42,0x42,0x42,0xc2,0x7e,0x42,0x42,0x42,0x42,0xc2,0x02,0x02,0x00,0x00,0x40,0x40,0x40, 110 | 0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7f,0x40,0x40,0x40,0x00 111 | }; 112 | char code liu[] = { 113 | //-- 六 -- 114 | 0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x40,0x20, 115 | 0x10,0x0c,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00 116 | }; 117 | char code qi[] = { 118 | //-- 七 -- 119 | 0x80,0x80,0x80,0x80,0x80,0x40,0xff,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00, 120 | 0x00,0x00,0x00,0x3f,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00 121 | }; 122 | char code ba[] = { 123 | //-- 八 -- 124 | 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x7e,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60, 125 | 0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0c,0x30,0x40,0x80,0x00 126 | }; 127 | char code jiu[] = { 128 | //-- 九 -- 129 | 0x00,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x10,0x10,0xf0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20, 130 | 0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3f,0x40,0x40,0x40,0x78,0x00 131 | }; 132 | char code ling[] = { 133 | //-- 零 -- 134 | 0x10,0x0c,0x05,0x55,0x55,0x55,0x85,0x7f,0x85,0x55,0x55,0x55,0x05,0x14,0x0c,0x00,0x04,0x04,0x02, 135 | 0x0a,0x09,0x29,0x2a,0x4c,0x48,0xa9,0x19,0x02,0x02,0x04,0x04,0x00 136 | }; 137 | char code maohao[] = { 138 | //-- : -- 139 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36, 140 | 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 141 | }; 142 | char code shuxian[] = { 143 | //-- | -- 144 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 145 | 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 146 | }; 147 | char code kongbai[] = { 148 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 149 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 150 | }; 151 | char code zuokuohao[] = { 152 | //-- ( -- 153 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 154 | 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,0x00,0x00 155 | }; 156 | char code youkuohao[] = { 157 | //-- ) -- 158 | 0x00,0x00,0x02,0x04,0x18,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40, 159 | 0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 160 | }; 161 | char code chao[] = { 162 | //-- 超 -- 163 | 0x40,0x48,0x48,0x48,0xff,0x48,0x48,0x42,0xa2,0x9e,0x82,0xa2,0xc2,0xbe,0x00,0x00,0x80,0x60,0x1f, 164 | 0x20,0x7f,0x44,0x44,0x40,0x4f,0x48,0x48,0x48,0x48,0x4f,0x40,0x00 165 | }; 166 | char code chu[] = { 167 | //-- 出 -- 168 | 0x00,0x00,0x7c,0x40,0x40,0x40,0x40,0xff,0x40,0x40,0x40,0x40,0xfc,0x00,0x00,0x00,0x00,0x7c,0x40, 169 | 0x40,0x40,0x40,0x40,0x7f,0x40,0x40,0x40,0x40,0x40,0xfc,0x00,0x00 170 | }; 171 | char code chang[] = { 172 | //-- 长 -- 173 | 0x80,0x80,0x80,0x80,0xff,0x80,0x80,0xa0,0x90,0x88,0x84,0x82,0x80,0x80,0x80,0x00,0x00,0x00,0x00, 174 | 0x00,0xff,0x40,0x21,0x12,0x04,0x08,0x10,0x20,0x20,0x40,0x40,0x00 175 | }; 176 | char code du[] = { 177 | //-- 度 -- 178 | 0x00,0x00,0xfc,0x24,0x24,0x24,0xfc,0x25,0x26,0x24,0xfc,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8f, 179 | 0x80,0x84,0x4c,0x55,0x25,0x25,0x25,0x55,0x4c,0x80,0x80,0x80,0x00 180 | }; -------------------------------------------------------------------------------- /code/pro10/pro10.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include //引入_nop_();函数 3 | /* 4 | _nop_();指令需要的只是一个机械周期 5 | 也就是12个时钟周期(震荡周期) 6 | _nop_(); 指令的延迟时间为 1us。 7 | 可以较为精确得控制延迟时间。 8 | */ 9 | 10 | #include "zh-hans.h" //导入我们自己写的中文编码库 11 | 12 | #define LCD_databus P1 //LCD8位数据口 13 | 14 | sbit INT = P3^2; 15 | sbit CS1 = P3^3; //片选1,1有效,控制左半屏 16 | sbit CS2 = P3^4; //片选2,1有效,控制右半屏 17 | sbit E = P3^5; //使能信号 18 | sbit RW = P3^6; //读/写,1为读、0为写 19 | sbit RS = P3^7; //代码/数据,1为数据、0为代码 20 | 21 | sbit BU = P3^1; //蜂鸣器,1为响 22 | sbit LED = P3^0; //小灯,1为亮 23 | 24 | unsigned char key = 0x77; //按键值 25 | char key_press = 0; //按键是否按下 26 | 27 | /* 28 | AMPIRE12864的组成:可以看成是两个64*64的屏幕 29 | 通过CS1、CS2两个片选信号来控制,低电平选通 30 | RST复位信号,我们这里置为高电平表示不用复位 31 | 32 | DBx是并行输入端 33 | 34 | E是使能信号,置1可以设置DBx,置0表示交换结束 35 | RW为低电平表示写入数据,高电平表示读出数据 36 | 37 | RS为低电平表示指令操作,高电平表示数据操作 38 | */ 39 | 40 | /* 41 | 键盘4x4 42 | 1 2 3 返回 43 | 4 5 6 清空 44 | 7 8 9 退位 45 | # 0 * 确定 46 | */ 47 | 48 | /*************************函数声明***************************/ 49 | void delay(int z); 50 | void read_busy(); 51 | void write_LCD_cmd(char value); 52 | void write_LCD_data(char value); 53 | void set_page(char page); 54 | void set_line(char startline); 55 | void set_column(char column); 56 | void set_on_or_off(char choose); 57 | void select_screen(char screen); 58 | void clear_screen(char screen); 59 | void clear_bottom_screen(); 60 | void init_LCD(); 61 | void display(char screen,char page,char column,char *p); 62 | void display_charactars(char screen,char page,char column,char datacode); 63 | void init_sys(); 64 | void tip_overlength(); 65 | void tip_lesslength(); 66 | void tip_pwderror(); 67 | void input_passwd(); 68 | void enter_sys(); 69 | /**************************************************************/ 70 | 71 | 72 | // 延时 73 | void delay(int z) 74 | { 75 | int x,y; 76 | for(x=z;x>0;x--) 77 | for(y=114;y>0;y--); 78 | } 79 | 80 | //读“忙”函数——数据线最高位DB7=1则busy 81 | void read_busy() 82 | { 83 | P1 = 0x00; //DB送数 84 | RS = 0; //代码 85 | RW = 1; //读 86 | E = 1; //1可设置DB 87 | while(P1 & 0x80); 88 | E = 0; 89 | } 90 | 91 | /***************************写入LCD***************************/ 92 | //向LCD中写入命令 93 | void write_LCD_cmd(char value) 94 | { 95 | read_busy(); //每次读写都要进行忙判断 96 | RS = 0; //选择命令 97 | RW = 0; //写操作 98 | LCD_databus = value; 99 | E = 1; //E由1->0锁存有效数据 100 | _nop_(); //空操作,用作延时一个机械周期1us 101 | _nop_(); //同上 102 | E = 0; 103 | } 104 | 105 | /*可以写成一个函数简便一点, 106 | 但是为了让大家好理解就先这样吧*/ 107 | 108 | //向LCD中写入数据 109 | void write_LCD_data(char value) 110 | { 111 | read_busy(); //每次读写都要进行忙判断 112 | RS = 1; //选择数据 113 | RW = 0; //写操作 114 | LCD_databus = value; 115 | E = 1; //E由1->0锁存有效数据 116 | _nop_(); //空操作,用作延时一个机械周期1us 117 | _nop_(); //同上 118 | E = 0; 119 | } 120 | /**************************************************************/ 121 | 122 | /***************************设置*******************************/ 123 | //设置“页”,LCD12864共8页,一页是8行 124 | void set_page(char page) 125 | { 126 | page = 0xB8|page; //页的首地址0xB8 127 | write_LCD_cmd(page); 128 | } 129 | 130 | //设置显示的起始行 131 | void set_line(char startline) 132 | { 133 | startline = 0xC0|startline; //起始地址0xC0 134 | write_LCD_cmd(startline); 135 | //设置从哪行开始:共0-63;一般从0行开始显示 136 | } 137 | 138 | //设置显示的列 139 | void set_column(char column) 140 | { 141 | column = column & 0x3F; //列的最大值为64 142 | column = 0x40|column; //列的首地址0x40 143 | write_LCD_cmd(column); //列位置 144 | } 145 | 146 | //显示开、关函数,0x3E是关闭显示,0x3F是开启显示 147 | void set_on_or_off(char choose) 148 | { 149 | choose = 0x3E|choose; //0011 111x, choose只能为0或者1 150 | write_LCD_cmd(choose); 151 | } 152 | /**************************************************************/ 153 | 154 | /**************************屏幕选择***************************/ 155 | //选屏 156 | void select_screen(char screen) 157 | { 158 | switch(screen){ 159 | case 0: CS1=0;CS2=0;break; //全屏 160 | case 1: CS1=0;CS2=1;break; //左半屏 161 | case 2: CS1=1;CS2=0;break; //右半屏 162 | default:break; 163 | } 164 | } 165 | 166 | //清屏 167 | void clear_screen(char screen) 168 | { 169 | char i,j; 170 | select_screen(screen); 171 | for(i=0;i<8;i++){ //控制页数0-7,共8页 172 | set_page(i); 173 | set_column(0); 174 | for(j=0;j<64;j++){ //控制列数0-63,共64列 175 | write_LCD_data(0x00); //写入0,地址指针自加1 176 | } 177 | } 178 | } 179 | 180 | //清最后一行屏 181 | void clear_bottom_screen() 182 | { 183 | char i; 184 | select_screen(0); 185 | 186 | set_page(6); //最后一行 187 | set_column(0); //从第一列开始 188 | for(i=0;i<64;i++){ //控制列数0-63,共64列 189 | write_LCD_data(0x00); //写入0,地址指针自加1 190 | } 191 | set_page(7); 192 | set_column(0); //从第一列开始 193 | for(i=0;i<64;i++){ //控制列数0-63,共64列 194 | write_LCD_data(0x00); //写入0,地址指针自加1 195 | } 196 | } 197 | /**************************************************************/ 198 | 199 | //LCD的初始化 200 | void init_LCD() 201 | { 202 | read_busy(); 203 | select_screen(0); //全屏 204 | set_on_or_off(0); //关闭显示 205 | select_screen(0); //全屏 206 | set_on_or_off(1); //开显示 207 | select_screen(0); //全屏 208 | clear_screen(0); //清屏 209 | set_line(0); //开始行:0 210 | } 211 | 212 | //显示汉字 213 | void display(char screen,char page,char column,char *p) 214 | { 215 | char i; 216 | select_screen(screen); //选屏 217 | set_page(page); //控制页 218 | set_column(column); //控制列 219 | for(i=0;i<16;i++){ //控制16列的数据输出 220 | write_LCD_data(p[i]); 221 | //汉字的上半部分 222 | } 223 | set_page(page+1); //写下半页 224 | set_column(column); 225 | for(i=0;i<16;i++){ 226 | write_LCD_data(p[i+16]); 227 | //汉字的下半部分 228 | } 229 | } 230 | 231 | //显示字符 232 | void display_charactars(char screen,char page,char column,char datacode) 233 | { 234 | char i; 235 | select_screen(screen); //选屏 236 | set_page(page); //控制页 237 | set_column(column); //控制列 238 | for(i=0;i<16;i++){ //控制16列的数据输出 239 | write_LCD_data(datacode); 240 | } 241 | } 242 | 243 | /**************************************************************/ 244 | //初始化屏幕显示 245 | void init_sys() 246 | { 247 | clear_screen(0); //清屏 248 | display(1,3,2*16,huan); 249 | display(1,3,3*16,ying); 250 | display(2,3,0*16,guang); 251 | display(2,3,1*16,lin); 252 | 253 | while(1){ 254 | if(key_press){ //有按键按下 255 | if(key == 0x77){ //按下确认键 256 | key_press = 0; 257 | break; 258 | } 259 | } 260 | } 261 | input_passwd(); 262 | } 263 | 264 | //提示语:超出长度 265 | void tip_overlength() 266 | { 267 | clear_bottom_screen(); 268 | display(1,6,2*16,zuokuohao); 269 | display(1,6,3*16,chao); 270 | display(2,6,0*16,chu); 271 | display(2,6,1*16,chang); 272 | display(2,6,2*16,du); 273 | display(2,6,3*16,youkuohao); 274 | } 275 | 276 | //提示语:请输入四位 277 | void tip_lesslength() 278 | { 279 | clear_bottom_screen(); 280 | display(1,6,1*16,zuokuohao); 281 | display(1,6,2*16,qing); 282 | display(1,6,3*16,shu); 283 | display(2,6,0*16,ru); 284 | display(2,6,1*16,si); 285 | display(2,6,2*16,wei); 286 | display(2,6,3*16,youkuohao); 287 | } 288 | 289 | //提示语:密码错误 290 | void tip_pwderror() 291 | { 292 | clear_bottom_screen(); 293 | display(1,6,2*16,zuokuohao); 294 | display(1,6,3*16,mi); 295 | display(2,6,0*16,ma); 296 | display(2,6,1*16,cuo); 297 | display(2,6,2*16,wu); 298 | display(2,6,3*16,youkuohao); 299 | } 300 | 301 | //输入密码界面 302 | void input_passwd() 303 | { 304 | //竖线每个半秒闪烁 305 | char flag=0; 306 | //四位密码 307 | char pwd[4] = {0}; 308 | //当前输入密码的长度 309 | char pwd_length = 0; 310 | 311 | clear_screen(0); //清屏 312 | display(1,0,0*16,qing); 313 | display(1,0,1*16,shu); 314 | display(1,0,2*16,ru); 315 | display(1,0,3*16,si); 316 | display(2,0,0*16,wei); 317 | display(2,0,1*16,mi); 318 | display(2,0,2*16,ma); 319 | display(2,0,3*16,maohao); 320 | 321 | while(1){ 322 | if(key_press){ //有按键按下 323 | if(key == 0xEE){ //当按下1 324 | //已输入4位密码 325 | if(pwd_length >= 4){ 326 | //清底部屏幕,显示提示语 327 | tip_overlength(); 328 | } 329 | else{ 330 | clear_bottom_screen(); 331 | display(1,2,pwd_length*16,yi); 332 | pwd[pwd_length] = 1; 333 | pwd_length++; 334 | } 335 | } 336 | else if(key == 0xDE){ //当按下2 337 | //已输入4位密码 338 | if(pwd_length >= 4){ 339 | //清底部屏幕,显示提示语 340 | tip_overlength(); 341 | } 342 | else{ 343 | clear_bottom_screen(); 344 | display(1,2,pwd_length*16,er); 345 | pwd[pwd_length] = 2; 346 | pwd_length++; 347 | } 348 | } 349 | else if(key == 0xBE){ //当按下3 350 | //已输入4位密码 351 | if(pwd_length >= 4){ 352 | //清底部屏幕,显示提示语 353 | tip_overlength(); 354 | } 355 | else{ 356 | clear_bottom_screen(); 357 | display(1,2,pwd_length*16,san); 358 | pwd[pwd_length] = 3; 359 | pwd_length++; 360 | } 361 | } 362 | else if(key == 0xED){ //当按下4 363 | //已输入4位密码 364 | if(pwd_length >= 4){ 365 | //清底部屏幕,显示提示语 366 | tip_overlength(); 367 | } 368 | else{ 369 | clear_bottom_screen(); 370 | display(1,2,pwd_length*16,si); 371 | pwd[pwd_length] = 4; 372 | pwd_length++; 373 | } 374 | } 375 | else if(key == 0xDD){ //当按下5 376 | //已输入4位密码 377 | if(pwd_length >= 4){ 378 | //清底部屏幕,显示提示语 379 | tip_overlength(); 380 | } 381 | else{ 382 | clear_bottom_screen(); 383 | display(1,2,pwd_length*16,wu1); 384 | pwd[pwd_length] = 5; 385 | pwd_length++; 386 | } 387 | } 388 | else if(key == 0xBD){ //当按下6 389 | //已输入4位密码 390 | if(pwd_length >= 4){ 391 | //清底部屏幕,显示提示语 392 | tip_overlength(); 393 | } 394 | else{ 395 | clear_bottom_screen(); 396 | display(1,2,pwd_length*16,liu); 397 | pwd[pwd_length] = 6; 398 | pwd_length++; 399 | } 400 | } 401 | else if(key == 0xEB){ //当按下7 402 | //已输入4位密码 403 | if(pwd_length >= 4){ 404 | //清底部屏幕,显示提示语 405 | tip_overlength(); 406 | } 407 | else{ 408 | clear_bottom_screen(); 409 | display(1,2,pwd_length*16,qi); 410 | pwd[pwd_length] = 7; 411 | pwd_length++; 412 | } 413 | } 414 | else if(key == 0xDB){ //当按下8 415 | //已输入4位密码 416 | if(pwd_length >= 4){ 417 | //清底部屏幕,显示提示语 418 | tip_overlength(); 419 | } 420 | else{ 421 | clear_bottom_screen(); 422 | display(1,2,pwd_length*16,ba); 423 | pwd[pwd_length] = 8; 424 | pwd_length++; 425 | } 426 | } 427 | else if(key == 0xBB){ //当按下9 428 | //已输入4位密码 429 | if(pwd_length >= 4){ 430 | //清底部屏幕,显示提示语 431 | tip_overlength(); 432 | } 433 | else{ 434 | clear_bottom_screen(); 435 | display(1,2,pwd_length*16,jiu); 436 | pwd[pwd_length] = 9; 437 | pwd_length++; 438 | } 439 | } 440 | else if(key == 0xD7){ //当按下0 441 | //已输入4位密码 442 | if(pwd_length >= 4){ 443 | //清底部屏幕,显示提示语 444 | tip_overlength(); 445 | } 446 | else{ 447 | clear_bottom_screen(); 448 | display(1,2,pwd_length*16,ling); 449 | pwd[pwd_length] = 0; 450 | pwd_length++; 451 | } 452 | } 453 | else if(key == 0xE7){ //当按下# 454 | 455 | } 456 | else if(key == 0xB7){ //当按下* 457 | 458 | } 459 | else if(key == 0x7E){ //当按下返回 460 | init_sys(); 461 | } 462 | else if(key == 0x7D){ //当按下清空 463 | clear_bottom_screen(); 464 | display(1,2,0*16,kongbai); 465 | display(1,2,1*16,kongbai); 466 | display(1,2,2*16,kongbai); 467 | display(1,2,3*16,kongbai); 468 | display(2,2,0*16,kongbai); 469 | pwd_length = 0; 470 | } 471 | else if(key == 0x7B){ //当按下退位 472 | clear_bottom_screen(); 473 | if(pwd_length > 0){ 474 | if(pwd_length == 4){ 475 | display(2,2,(pwd_length-4)*16,kongbai); 476 | } 477 | else if(pwd_length < 4){ 478 | display(1,2,pwd_length*16,kongbai); 479 | } 480 | pwd_length--; 481 | } 482 | } 483 | else if(key == 0x77){ //当按下确定 484 | //已输入4位密码 485 | if(pwd_length < 4){ 486 | //清底部屏幕,显示提示语 487 | tip_lesslength(); 488 | } 489 | else if(pwd_length == 4){ 490 | if(pwd[0]==0&&pwd[1]==7&&pwd[2]==1&&pwd[3]==8){ 491 | enter_sys(); 492 | } 493 | else{ 494 | tip_pwderror(); 495 | BU = 1; 496 | delay(50); 497 | BU = 0; 498 | } 499 | } 500 | } 501 | 502 | key_press = 0; //按下状态还原 503 | } 504 | 505 | 506 | //闪烁竖线 507 | if(flag <= 50){ 508 | if(pwd_length >= 4){ 509 | //右半屏 510 | display(2,2,(pwd_length-4)*16,shuxian); 511 | } 512 | else{ 513 | //左半屏 514 | display(1,2,pwd_length*16,shuxian); 515 | } 516 | flag++; 517 | } 518 | else if(flag < 200){ 519 | if(pwd_length >= 4){ 520 | //右半屏 521 | display(2,2,(pwd_length-4)*16,kongbai); 522 | } 523 | else{ 524 | //左半屏 525 | display(1,2,pwd_length*16,kongbai); 526 | } 527 | flag++; 528 | if(flag == 200){ 529 | flag = 0; 530 | } 531 | } 532 | } 533 | } 534 | 535 | //密码正确进入系统 536 | void enter_sys() 537 | { 538 | LED = 1; 539 | clear_screen(0); //清屏 540 | display(1,3,2*16,mi); 541 | display(1,3,3*16,ma); 542 | display(2,3,0*16,zheng); 543 | display(2,3,1*16,que); 544 | while(1){ 545 | if(key_press){ //有按键按下 546 | if(key == 0x7E){ //按下返回键 547 | LED = 0; 548 | key_press = 0; 549 | break; 550 | } 551 | } 552 | } 553 | init_sys(); 554 | } 555 | /**************************************************************/ 556 | 557 | //键盘扫描 558 | void key_scan() interrupt 0 559 | { 560 | char value_h,value_l; 561 | 562 | P2 = 0xF0; 563 | if(P2 != 0xF0){ 564 | P2 = 0xF0; 565 | value_l = P2; 566 | delay(10); //按键消抖 567 | P2 = 0x0F; 568 | value_h = P2; 569 | 570 | key = value_l+value_h; //得到键值 571 | } 572 | P2 = 0xF0; 573 | 574 | key_press = 1; 575 | } 576 | 577 | void main() 578 | { 579 | LED = BU = 0; // 小灯和蜂鸣器处于不工作状态 580 | P1 = 0xF0; 581 | P2 = 0xF0; 582 | 583 | EA = 1; // 中断总允许 584 | EX0 = 1; // 外部中断0 585 | IT0 = 1; // 下降沿触发 586 | 587 | /* 588 | 一个汉字16x16大小 589 | 2页表示32行开始,8页共128行 590 | 每个半屏(64/2=32列)只能显示四个汉字 591 | 32/16=2 592 | */ 593 | init_sys(); 594 | 595 | while(1); 596 | } -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Objects/exam3.hex: -------------------------------------------------------------------------------- 1 | :1013C300E4FD7C01ECD39FE49E5010EDC394FA74CA 2 | :0B13D30080948050030D80F30C80E933 3 | :0113DE0022EC 4 | :10143D007590FFC2B5C2B7D2B6D2B5E59020E7FB25 5 | :03144D00C2B52203 6 | :101383007D30E4FF1213447D01E4FF1213447D0614 7 | :10139300E4FF1213447D0CE4FF1213447D02E4FFC7 8 | :0313A300021344EE 9 | :0D133700EC2480FDE4FF121344EB2488FD3C 10 | :1013440012143DEF24FF92B7C2B6C2B58D900000CF 11 | :0B135400D2B50000C2B5D2B6D2B7225D 12 | :1014270012143D7590FFEF24FF92B7D2B6C2B5D222 13 | :05143700B5AF90C2B545 14 | :01143C00228D 15 | :0812D7008B148A158916AE077D 16 | :1012DF007D30E4FF121344AD06121344E4FEEEC357 17 | :1012EF0095175017AB14AA15A9168E827583001285 18 | :0B12FF00011DFD7F011213440E80E36F 19 | :01130A0022C0 20 | :070003007D01E4FF0213443C 21 | :1010F900E4FEFCFB7D34FF1213447D36121344EEEB 22 | :10110900C3940274809480503FE4FCECC39420742F 23 | :101119008094805030EC2480FDE4FF121344EE707B 24 | :10112900047D8080047D88E4FF121344E4FBEBC353 25 | :10113900941074809480500AE4FD7F011213440BCB 26 | :0F11490080EC0C80C60E80B77D30E4FF021344AB 27 | :060EC1008B15AE07AC0525 28 | :100EC7007D34E4FF1213447D36121344ECD3941F90 29 | :100ED70074809480400353041FEEC4540FFB121315 30 | :100EE700370F1214277F01121427AA077F01121444 31 | :100EF70027A90712133753060FEEC394087480947B 32 | :100F0700804003530607E51564017015AD027F01A4 33 | :100F1700121344A8067480088002C313D8FC4980C2 34 | :100F270016AD027F01121344AF06A807748008802C 35 | :100F370002C313D8FCF459FD7F011213447D30E43A 36 | :040F4700FF0213444E 37 | :10130B008F128D138B14120EC1E51204FFAB14ADAB 38 | :10131B0013120EC1E51304FDAB14AF12120EC1E58F 39 | :0C132B001204FFE51304FDAB14020EC118 40 | :100A720050726573732074686520506175736500E8 41 | :100A8200666F7220436F6E74696E75652E2E2E002E 42 | :100A920020506C6561736520776169742E2E2E007B 43 | :100AA2007C2D2D2D2D2D546970732D2D2D2D2D7CEA 44 | :100AB200007C20666D772D6C79782D7A6774202002 45 | :100AC2007C007C2D2D2D2D2D2D2D2D2D2D2D2D2DE3 46 | :100AD2002D7C0020202020202D3E6F6B00205468AA 47 | :100AE200652D4F64442D536E414B656500202020D7 48 | :100AF20020202065617379002020202D3E2068612E 49 | :100B020072640020202020202074697073004761E5 50 | :100B12006D654F7665720073636F72653A002020CF 51 | :0A0B2200202D3E002020202020009E 52 | :1013A600012E0202227530012B00012100C101C16C 53 | :0113B6000036 54 | :0F145000D2AFD2A9758901E4F58CF58AD28C222E 55 | :03000B0002145F7D 56 | :09145F00758C00758A00052B3222 57 | :1013F9008E098F0AE50A150A700215091445096054 58 | :0714090005120B2C80EE22FE 59 | :100B2C002080137F017E001213C3208009E52E6400 60 | :100B3C00016003E4F52E2081117F017E001213C3A6 61 | :100B4C00208107E52E6003752E012082137F017E24 62 | :100B5C00001213C3208209E52E64026003752E0374 63 | :100B6C002083137F017E001213C3208309E52E64BA 64 | :100B7C00036003752E02208602D2012084447F1468 65 | :100B8C007E001213C320843A20002F7BFF7A0A794F 66 | :100B9C007275170F7F901212D77BFF7A0A798275C4 67 | :100BAC00170F7F891212D73084FDD2003000082035 68 | :100BBC000105120B2C80F5C201221200033084FDBA 69 | :030BCC00C2002242 70 | :100BCF002080117F017E001213C3208007E52E6065 71 | :100BDF0003752E012081137F017E001213C3208124 72 | :100BEF0009E52E64016003E4F52E2082137F017E58 73 | :100BFF00001213C3208209E52E64036003752E02D1 74 | :100C0F002083137F017E001213C3208309E52E6416 75 | :100C1F00026003752E03208602D2012084447F14C4 76 | :100C2F007E001213C320843A20002F7BFF7A0A79AB 77 | :100C3F007275170F7F901212D77BFF7A0A79827520 78 | :100C4F00170F7F891212D73084FDD2003000082091 79 | :100C5F000105120B2C80F5C201221200033084FD16 80 | :030C6F00C200229E 81 | :101410001200037BFF7A0A799275170F7F881212E8 82 | :07142000D71210F9020003CE 83 | :1013DF007E007F007D647C0012129B121383121417 84 | :0A13EF00507B007A0079240207F811 85 | :101032007B007A0079241207F8121410200154AFB1 86 | :1010420023AE221213F9120301782C7C007D007E5C 87 | :10105200007F021200DEAF307E00EF64647005751F 88 | :10106200306380D8EF64C84E700EF52174D4252306 89 | :10107200F52374FE3522F522E5217012F50C750D6B 90 | :1010820000750E24FB7A00792F1209B380AE12107C 91 | :061092009880A9C20122B2 92 | :100FC0007B007A0079241207F8121410200160AF18 93 | :100FD00023AE221213F9120301782C7C007D007ECF 94 | :100FE000007F021200DEAF307E00EF646470057592 95 | :100FF000306380D8EF64C84E700EF52174D4252379 96 | :10100000F52374FE3522F522E521701A120BCF75F7 97 | :101010000C00750D00750E247B007A00792F1209E3 98 | :10102000B3120BCF80A6120BCF121098020FCCC2B6 99 | :0210300001229B 100 | :1011B5001200037BFF7A0A79A27517107F8012123D 101 | :1011C500D77BFF7A0A79B37517107F901212D77BF8 102 | :1011D500FF7A0A79C47517107F881212D77BFF7AB8 103 | :1011E5000A79D57517097F981212D730860320859D 104 | :1011F500FA7F147E001213C33086032085ED3086F6 105 | :07120500FD20850280F822A4 106 | :0F109800750C00750D00750E2C7B007A00792405 107 | :1010A7001201B1802AE5114510450F602AAB0FAA3E 108 | :1010B70010A911120104FF90000112011DFD7B010F 109 | :1010C70012130BAB0FAA10A9119000021202208B6A 110 | :1010D7000F8A10891180CEE5216016AB0CAA0DA9E5 111 | :1010E7000E120104FF90000112011DFDE4FB121313 112 | :0110F7000BED 113 | :0110F80022D5 114 | :1005C600E4F509750A021214107BFF7A0A79DF75C1 115 | :1005D600170E7F801212D77BFF7A0A79EF75170AFA 116 | :1005E6007F901212D77BFF7A0A79FA75170A7F88ED 117 | :1005F6001212D77BFF7A0B790575170A7F981212AC 118 | :10060600D7E50A6401702E20812B7F05FE1213C3E5 119 | :10061600208122750A027BFF7A0B79267517057FE2 120 | :10062600901212D77BFF7A0B79207517057F8812F7 121 | :1006360012D73081FDE50A6402705D20802B7F05AC 122 | :10064600FE1213C3208022750A017BFF7A0B7926DE 123 | :100656007517057F881212D77BFF7A0B79207517DD 124 | :10066600057F901212D73080FD20812C7F057E00F9 125 | :100676001213C3208122750A037BFF7A0B79267534 126 | :1006860017057F881212D77BFF7A0B79207517051D 127 | :100696007F981212D73081FDE50A6403702E208000 128 | :1006A6002B7F14FE1213C3208022750A027BFF7A69 129 | :1006B6000B79267517057F981212D77BFF7A0B796F 130 | :1006C600207517057F881212D73080FD308503020A 131 | :1006D60006077F057E001213C3308503020607AFA7 132 | :0D06E6002B7E0012124EC28C3085FDAF0A33 133 | :0106F30022E4 134 | :10115800E4F511F5121200037BFF7A0B791075176D 135 | :10116800087F921212D77BFF7A0B79197517067FC1 136 | :101178008A1212D7AF2A1212593085032086FA7FB5 137 | :101188000A7E001213C33085032086ED7B007A00A7 138 | :101198007924120F4B7B007A0079241207F8E4F5C2 139 | :0C11A80021752E023085FD3086FAD20140 140 | :0111B4002218 141 | :090DA80075140075150075160F95 142 | :060DB1008B118A12891368 143 | :100DB7001201B19000021202209000021202208B51 144 | :100DC700178A188919AB11AA12A9139000061201E4 145 | :100DD7001DC39404748094805002C322E5194518FA 146 | :100DE70045176048AB17AA18A919120104FFAB14DD 147 | :100DF700AA15A916120104B5071EAB17AA18A91937 148 | :100E070090000112011DFFAB14AA15A9169000014D 149 | :100E170012011DB50702D322AB17AA18A919900012 150 | :0D0E2700021202208B178A18891980B0C3AF 151 | :010E3400229B 152 | :101259008F1315131513C3E513940A7480948050E2 153 | :0C1269000B7D307F01121344E513801D43 154 | :10127500E51375F00A84F514E51375F00A8485F015 155 | :1012850015E5142430FD7F01121344E5152430FDC6 156 | :051295007F011213446B 157 | :01129A002231 158 | :0609B3008B098A0A890B82 159 | :1009B900D202200203020A5812120C8F2BE52B7562 160 | :1009C900F03F84E5F025E0AB09AA0AA90B12017DE5 161 | :1009D900E52B75F01F84E5F025E0AB09AA0AA90B00 162 | :1009E90090000112018FAB0CAA0DA90E1201B18062 163 | :1009F90046E5114510450F6046AB09AA0AA90B1235 164 | :100A09000104FFAB0FAA10A911120104B5071CAB11 165 | :100A190009AA0AA90B90000112011DFFAB0FAA1028 166 | :100A2900A91190000112011D6F6014AB0FAA10A942 167 | :100A3900119000021202208B0F8A10891180B2E5F1 168 | :100A4900114510450F60030209BBC2020209BBAB85 169 | :100A590009AA0AA90B120104FF90000112011DFD48 170 | :080A69007B0112130B75210142 171 | :010A71002262 172 | :0F030100750C00750D00750E2F7B007A007924A6 173 | :060310008B098A0A890B2B 174 | :10031600C202C203E52E1470030203CE1470030258 175 | :1003260004F31470030204592403600302057BAB33 176 | :1003360009AA0AA90B1201B190000112011D70034E 177 | :10034600020576120B2CAB09AA0AA90B1201B19071 178 | :10035600000112011DFF7E00AB0CAA0DA90E900034 179 | :100366000112011D2402FDE433FCEDB5071FEEB5B5 180 | :10037600041BAB09AA0AA90B1201B1120104FFABB7 181 | :100386000CAA0DA90E120104B50702D202AB09AAE6 182 | :100396000AA90B1201B1120104F50F900001120116 183 | :1003A6001D24FEF510AB09AA0AA90B90000612013E 184 | :1003B6001DC3940474809480500302057B120DA81B 185 | :1003C600400302057B020576AB09AA0AA90B1201B6 186 | :1003D600B190000112011D643E7003020576120BF6 187 | :1003E6002CAB09AA0AA90B1201B190000112011D3A 188 | :1003F600FFAB0CAA0DA90E90000112011D24FEB53B 189 | :10040600071BAB09AA0AA90B1201B1120104FEAB24 190 | :100416000CAA0DA90E120104B50602D202AB09AA56 191 | :100426000AA90B1201B1120104F50FEF2402F5100F 192 | :10043600AB09AA0AA90B90000612011DC394047405 193 | :10044600809480500302057B120DA8400302057BB1 194 | :10045600020576AB09AA0AA90B1201B112010460C2 195 | :100466000464807003020576120B2CAB09AA0AA954 196 | :100476000B1201B190000112011DFFAB0CAA0DA9D0 197 | :100486000E90000112011DB50728AB09AA0AA90B97 198 | :100496001201B1120104FF7E00AB0CAA0DA90E12C7 199 | :1004A60001042402FDE433FCEDB50706EEB50402B3 200 | :1004B600D202AB09AA0AA90B1201B112010424FE49 201 | :1004C600F50F90000112011DF510AB09AA0AA90B40 202 | :1004D60090000612011DC394047480948050030298 203 | :1004E600057B120DA8400302057B020576AB09AA1F 204 | :1004F6000AA90B1201B1120104FF647E6005EF64C4 205 | :10050600FE7002806B120B2CAB09AA0AA90B120112 206 | :10051600B190000112011DFFAB0CAA0DA90E9000AF 207 | :100526000112011DB5071DAB09AA0AA90B1201B1DB 208 | :10053600120104FEAB0CAA0DA90E12010424FEB58D 209 | :100546000602D202AB09AA0AA90B1201B1120104D2 210 | :100556002402F50F8F10AB09AA0AA90B9000061208 211 | :10056600011DC3940474809480400A120DA850059E 212 | :10057600D20312115830030DAB0CAA0DA90E900030 213 | :100586000174648023120B2C751400751500751602 214 | :100596000FAB09AA0AA90B120D0E300219AB0CAA51 215 | :1005A6000DA90E90000174C812018FE4F510F50F25 216 | :0F05B600FB7A00790F22AB09AA0AA90B1208F2EF 217 | :0105C5002213 218 | :03135F001213DF87 219 | :101362001205C68F08EF64017003121032E508649B 220 | :0F137200027003120FC0E508640370E41211B596 221 | :0213810080DF0B 222 | :0607F8008B138A14891521 223 | :1007FE007F057E00120C72AA06A9077516018A17CC 224 | :10080E008918AB16C003C002C001AB13AA14A915F8 225 | :10081E00900003120250C003C002C001AB13AA1411 226 | :10082E00A9151201D1AB13AA14A9159000067401D3 227 | :10083E0012018F7B007A007900C003C002C001ABA9 228 | :10084E0016AA17A918900002120250AB16AA17A9E1 229 | :10085E0018740212017DAB16AA17A918900001E4B4 230 | :10086E0012018F7F057E00120C72AA06A90775165B 231 | :10087E00018A1789187B007A007900C003C002C074 232 | :10088E0001AB16AA17A918900002120250AB16AAB5 233 | :10089E0017A918E412017DAB16AA17A9189000012A 234 | :1008AE0012018FAB16AA17A918C003C002C001AB64 235 | :1008BE0013AA14A9151201B1900002120250AB1620 236 | :1008CE00AA17A918C003C002C001AB13AA14A91518 237 | :1008DE00900003120250AB13AA14A91590000674CF 238 | :0408EE000202018F72 239 | :060F4B008B138A148915C6 240 | :100F51001201B18B168A178918E5174518451660D5 241 | :100F610024AB16AA17A9189000021202208B198A25 242 | :100F71001A891BAE17AF181206F4851916851A17B0 243 | :100F8100851B1880D47B007A007900C003C002C0A1 244 | :100F910001AB13AA14A9151201D17B007A007900C3 245 | :100FA100C003C002C001AB13AA14A915900003121B 246 | :0F0FB1000250AB13AA14A915900006E402018F99 247 | :060D0E008B118A1289130B 248 | :100D14007F057E00120C72AA06A9077517018A18AE 249 | :100D240089197B007A007900C003C002C001AB17A7 250 | :100D3400AA18A919900002120250AB14AA15A916F8 251 | :100D4400120104AB17AA18A91912017DAB14AA1534 252 | :100D5400A91690000112011DAB17AA18A919900039 253 | :100D64000112018FAB11AA12A9131201B1C003C061 254 | :100D740002C001AB17AA18A919900002120250ABC5 255 | :100D840017AA18A919C003C002C001AB11AA12A95D 256 | :100D9400131201D1AB11AA12A91390000674011207 257 | :030DA400014AD32E 258 | :010DA7002229 259 | :0608F2008B118A1289132C 260 | :1008F8001201B1803DAB11AA12A913900003120294 261 | :1009080020C003C002C001AB16AA17A918900002A4 262 | :10091800120220D082D083D0E06B7008E965827023 263 | :1009280003EA65836014AB16AA17A918900002128F 264 | :1009380002208B168A17891880BBAB11AA12A9133B 265 | :10094800900003120220120104F514AB11AA12A997 266 | :100958001390000312022090000112011DF515AE3C 267 | :1009680002AF011206F47B007A007900C003C002CE 268 | :10097800C001AB16AA17A918900002120250AB16B4 269 | :10098800AA17A918C003C002C001AB11AA12A91363 270 | :10099800900003120250AB11AA12A913900006741A 271 | :0A09A800FF12014A7B007A00791467 272 | :0109B2002222 273 | :03000000020E35B8 274 | :0C0E3500787FE4F6D8FD758134020E7C55 275 | :10000E00E709F608DFFA8046E709F208DFFA803ED4 276 | :10001E0088828C83E709F0A3DFFA8032E309F608C1 277 | :10002E00DFFA8078E309F208DFFA807088828C8329 278 | :10003E00E309F0A3DFFA806489828A83E0A3F608DD 279 | :10004E00DFFA805889828A83E0A3F208DFFA804CB7 280 | :10005E0080D280FA80C680D4806980F2803380108E 281 | :10006E0080A680EA809A80A880DA80E280CA8033F7 282 | :10007E0089828A83ECFAE493A3C8C582C8CCC5836F 283 | :10008E00CCF0A3C8C582C8CCC583CCDFE9DEE7803F 284 | :10009E000D89828A83E493A3F608DFF9ECFAA9F0BE 285 | :1000AE00EDFB2289828A83ECFAE0A3C8C582C8CC14 286 | :1000BE00C583CCF0A3C8C582C8CCC583CCDFEADE2D 287 | :1000CE00E880DB89828A83E493A3F208DFF980CC8F 288 | :1000DE0088F0EF60010E4E60C388F0ED2402B40488 289 | :1000EE000050B9F582EB2402B4040050AF2323452F 290 | :0600FE00822390005E73F6 291 | :10010400BB010689828A83E0225002E722BBFE02F9 292 | :09011400E32289828A83E493222C 293 | :10011D00BB010CE58229F582E5833AF583E0225097 294 | :10012D0006E92582F8E622BBFE06E92582F8E222E1 295 | :0D013D00E58229F582E5833AF583E49322FB 296 | :10014A00BB010FF8E58229F582E5833AF583E028B9 297 | :10015A00F0225009C58229F8E58226F622BBFE095B 298 | :10016A00C58229F8E22582F222F8EA2583F583E995 299 | :03017A00932822A5 300 | :10017D00BB010689828A83F0225002F722BBFE0161 301 | :02018D00F3225B 302 | :10018F00F8BB010DE58229F582E5833AF583E8F0A6 303 | :10019F00225006E92582C8F622BBFE05E92582C852 304 | :0201AF00F2223A 305 | :1001B100BB010789828A830202D15005E9F8020254 306 | :1001C100BFBBFE05E9F80202E389828A830202F5D8 307 | :1001D100BB011A89828A83D0F0D0E0F8D0E0F9D04F 308 | :1001E100E0FAD0E0FBE8C0E0C0F00202DA5016E924 309 | :1001F100F8D083D082D0E0F9D0E0FAD0E0FBC08221 310 | :10020100C0830202C8BBFE16E9F8D083D082D0E0D9 311 | :0F021100F9D0E0FAD0E0FBC082C0830202EC22F9 312 | :10022000BB010DE58229F582E5833AF5830202D10F 313 | :100230005007E92582F80202BFBBFE07E92582F8D4 314 | :100240000202E3E58229F582E5833AF5830202F5AD 315 | :10025000BB0120E58229F582E5833AF583D0F0D011 316 | :10026000E0F8D0E0F9D0E0FAD0E0FBE8C0E0C0F080 317 | :100270000202DA5018E92582F8D083D082D0E0F962 318 | :10028000D0E0FAD0E0FBC082C0830202C8BBFE18F7 319 | :10029000E92582F8D083D082D0E0F9D0E0FAD0E02E 320 | :0902A000FBC082C0830202EC22C3 321 | :10120C00AC31AD32AE33AF347810EC4D4E4F700480 322 | :10121C007CA57DA5C3EC13FCED13FDEE13FEEF13C3 323 | :10122C00FF5010EC64CCFCED644CFDEE644EFEEF14 324 | :10123C0064CEFFD8DF8C318D328E338F34EE547FF9 325 | :0D124C00FE228E318F3274A5F533F5342269 326 | :100C72008E1A8F1B7E007F648F828E83E0FCA3E03E 327 | :100C8200FD4C7003FEFF228D828C83A3A3E0FAA3A6 328 | :100C9200E0FBC3951BEA951A5008CEECCECFEDCF00 329 | :100CA20080D6C3EB951BF51DEA951AF51CC3E51D0D 330 | :100CB2009410E51C940050198D828C83E0FBA3E014 331 | :100CC2008F828E83CBF0A3EBF0ED2404FFE43CFE95 332 | :100CD2002274FC251DF51D74FF351CF51C8D828CBC 333 | :100CE20083A3A3F0A3E51DF0ED2404FFE43CFEEF93 334 | :100CF200251DFFEE351CFE8F82F583A3A3E51AF0B6 335 | :0C0D0200A3E51BF0EF2404FFE43EFE22FA 336 | :0B13B70048006400000000000000007F 337 | :10129B00EF4E7008FE7F01ED1D70011C900064EE97 338 | :1012AB00F0A3EFF0A3ECF0A3EDF0900064E0FEA34D 339 | :1012BB00E0FFF5828E83E4F0A3F0ED24FCFDEC342B 340 | :0C12CB00FF8F828E83A3A3F0A3EDF0221E 341 | :1006F400EF4E70030207F7900066E07002A3E0700B 342 | :10070400030207F7CDEFCDCCEECCED24FCFDEC34A9 343 | :10071400FFFC751C00751D64851D82851C83E0FA31 344 | :10072400A3E08A1EF51F451E6011D3E51F9FE51E39 345 | :100734009E5008851E1C851F1D80DDE51F451E601B 346 | :100744004A8D828C83A3A3E0FAA3E02FFFEA3EFE46 347 | :10075400EF651F7003EE651E7031851F82851E8351 348 | :10076400A3A3E0FEA3E02404FFE43E8D828C83A3D4 349 | :10077400A38FF01202A9851F82851E83E0FFA3E0E8 350 | :100784008D828C83CFF0A3EFF0800B8D828C83E578 351 | :100794001EF0A3E51FF0851D82851C83A3A3E0FE44 352 | :1007A400A3E0251DFFEE351CFEEF2404FFE43EFE0E 353 | :1007B400EF6D7002EE6C70308D828C83A3A3E0FE2B 354 | :1007C400A3E02404FFE43E851D82851C83A3A38F3C 355 | :1007D400F01202A98D828C83E0FFA3E0851D82853F 356 | :1007E4001C83CFF0A3EFF022851D82851C83ECF0DF 357 | :0407F400A3EDF0225F 358 | :100E410002135FE493A3F8E493A34003F68001F255 359 | :100E510008DFF48029E493A3F85407240CC8C333B2 360 | :100E6100C4540F4420C8834004F456800146F6DF81 361 | :100E7100E4800B01020408102040809013A6E47E58 362 | :100E8100019360BCA3FF543F30E509541FFEE49376 363 | :100E9100A360010ECF54C025E060A840B8E493A33D 364 | :100EA100FAE493A3F8E493A3C8C582C8CAC583CA68 365 | :100EB100F0A3C8C582C8CAC583CADFE9DEE780BE20 366 | :0113C200002A 367 | :1002A900C5F0F8A3E028F0C5F0F8E58215827002E0 368 | :0602B9001583E038F0227D 369 | :0902BF00E6FB08E6FA08E6F92264 370 | :0902C800EBF608EAF608E9F6225B 371 | :0902D100E0FBA3E0FAA3E0F9222E 372 | :0902DA00EBF0A3EAF0A3E9F02225 373 | :0902E300E2FB08E2FA08E2F9224C 374 | :0902EC00EBF208EAF208E9F22243 375 | :0C02F500E493FB740193FA740293F92265 376 | :00000001FF 377 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/exam3.uvproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.1 5 | 6 |
### uVision Project, (C) Keil Software
7 | 8 | 9 | 10 | Target 1 11 | 0x0 12 | MCS-51 13 | 0 14 | 15 | 16 | AT89C52 17 | Microchip 18 | IRAM(0-0xFF) IROM(0-0x1FFF) CLOCK(24000000) 19 | 20 | "LIB\STARTUP.A51" ("Standard 8051 Startup Code") 21 | 22 | 2980 23 | REGX52.H 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 0 35 | 0 36 | 37 | 38 | 39 | Atmel\ 40 | Atmel\ 41 | 42 | 0 43 | 0 44 | 0 45 | 0 46 | 1 47 | 48 | .\Objects\ 49 | exam3 50 | 1 51 | 0 52 | 1 53 | 1 54 | 1 55 | .\Listings\ 56 | 0 57 | 0 58 | 0 59 | 60 | 0 61 | 0 62 | 63 | 64 | 0 65 | 0 66 | 0 67 | 0 68 | 69 | 70 | 0 71 | 0 72 | 73 | 74 | 0 75 | 0 76 | 0 77 | 0 78 | 79 | 80 | 0 81 | 0 82 | 83 | 84 | 0 85 | 0 86 | 0 87 | 0 88 | 89 | 0 90 | 91 | 92 | 93 | 0 94 | 0 95 | 0 96 | 0 97 | 0 98 | 1 99 | 0 100 | 0 101 | 0 102 | 0 103 | 3 104 | 105 | 106 | 1 107 | 65535 108 | 109 | 110 | S8051.DLL 111 | 112 | DP51.DLL 113 | -p52 114 | S8051.DLL 115 | 116 | TP51.DLL 117 | -p52 118 | 119 | 120 | 121 | 0 122 | 0 123 | 0 124 | 0 125 | 16 126 | 127 | 128 | 1 129 | 1 130 | 1 131 | 1 132 | 1 133 | 1 134 | 1 135 | 1 136 | 0 137 | 1 138 | 139 | 140 | 0 141 | 1 142 | 0 143 | 1 144 | 1 145 | 1 146 | 0 147 | 1 148 | 1 149 | 1 150 | 151 | 0 152 | -1 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 0 172 | 0 173 | 0 174 | 0 175 | 0 176 | -1 177 | 178 | 0 179 | 180 | 181 | 182 | 183 | 184 | 185 | 0 186 | 187 | 188 | 189 | 0 190 | 0 191 | 2 192 | 0 193 | 0 194 | 0 195 | 0 196 | 0 197 | 0 198 | 1 199 | 0 200 | 1 201 | 0 202 | 0 203 | 0 204 | 0 205 | 0 206 | 0 207 | 0 208 | 0 209 | 0 210 | 0 211 | 0 212 | 0 213 | 0 214 | 0 215 | 0 216 | 0 217 | 0 218 | 0 219 | 0 220 | 0 221 | 0 222 | 0 223 | 0 224 | 0 225 | 0 226 | 0 227 | 0 228 | 0 229 | 0 230 | 0 231 | 0 232 | 233 | 234 | 0 235 | 0x0 236 | 0x10000 237 | 238 | 239 | 0 240 | 0x0 241 | 0x0 242 | 243 | 244 | 0 245 | 0x0 246 | 0x0 247 | 248 | 249 | 0 250 | 0x0 251 | 0x0 252 | 253 | 254 | 0 255 | 0x0 256 | 0x0 257 | 258 | 259 | 0 260 | 0x0 261 | 0x0 262 | 263 | 264 | 0 265 | 0x0 266 | 0x0 267 | 268 | 269 | 0 270 | 0x0 271 | 0x0 272 | 273 | 274 | 1 275 | 0x0 276 | 0x2000 277 | 278 | 279 | 0 280 | 0x0 281 | 0x100 282 | 283 | 284 | 0 285 | 0x0 286 | 0x0 287 | 288 | 289 | 0 290 | 0x0 291 | 0x0 292 | 293 | 294 | 0 295 | 0x0 296 | 0x0 297 | 298 | 299 | 0 300 | 0x0 301 | 0x0 302 | 303 | 304 | 0 305 | 0x0 306 | 0x0 307 | 308 | 309 | 310 | 311 | 0 312 | 0 313 | 1 314 | 0 315 | 1 316 | 3 317 | 8 318 | 2 319 | 1 320 | 1 321 | 0 322 | 0 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 0 332 | 1 333 | 0 334 | 0 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 0 344 | 0 345 | 1 346 | 0 347 | 2 348 | 1 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | Source Group 1 378 | 379 | 380 | lcd12864.c 381 | 1 382 | .\lcd12864.c 383 | 384 | 385 | lcd12864.h 386 | 5 387 | .\lcd12864.h 388 | 389 | 390 | main.c 391 | 1 392 | .\main.c 393 | 394 | 395 | snake.c 396 | 1 397 | .\snake.c 398 | 399 | 400 | snake.h 401 | 5 402 | .\snake.h 403 | 404 | 405 | readme.txt 406 | 5 407 | .\readme.txt 408 | 409 | 410 | game.h 411 | 5 412 | .\game.h 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 |
421 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/game.h: -------------------------------------------------------------------------------- 1 | #include "lcd12864.h" 2 | #include "snake.h" 3 | // 初始化内存池函数以及随机数生成函数 4 | #include 5 | 6 | //---寄存器位声明---// 7 | sbit Key_Up = P0^0; 8 | sbit Key_Down = P0^1; 9 | sbit Key_Left = P0^2; 10 | sbit Key_Right = P0^3; 11 | sbit Key_Pause = P0^4; 12 | sbit Key_Enter = P0^5; 13 | sbit Key_Return = P0^6; 14 | 15 | //---宏定义常量---// 16 | #define SYS_EASY 1 17 | #define SYS_HARD 2 18 | #define SYS_TIPS 3 19 | 20 | #define TOWDS_UP 0 21 | #define TOWDS_DOWN 1 22 | #define TOWDS_RIGHT 2 23 | #define TOWDS_LEFT 3 24 | 25 | //---全局变量声明---// 26 | unsigned char snake_towds = TOWDS_RIGHT; // 蛇头的朝向,默认朝右 TOWDS_RIGHT 27 | unsigned int snake_speed = 30000; // 小蛇移动速度 28 | Snake snake; 29 | Point snakeRear; // 蛇尾的坐标 30 | Point FruitLocation; // 果实的坐标 31 | unsigned char InitSeed = 0; // 初始化种子,用于产生随机数 32 | unsigned char FruitFlag = 0; // 表示果实是否还存在 33 | bit PressRet = 0; // Return按键是否被按下 34 | bit PressPause = 0; // Pause按键是否被按下 35 | 36 | // 游戏相关函数 37 | void Timer_Set(); // 定时器设置函数 38 | void delay(unsigned int time); // 延时函数 39 | void Key_Scan(); // 按键扫描函数 40 | void Inv_Key_Scan(); // 困难模式下的按键扫描 41 | unsigned char Game_Menu(); // 游戏初始界面菜单 42 | void Game_Over(); // 游戏失败后界面 43 | bit Snake_Check_Dead(Snake *snake, Point *elemNew); // 检查蛇是否咬死自己 44 | Point Snake_Move(Snake *snake, Point *FruitLocation); // 蛇向前移动一个单位 45 | void LCD_Draw_Snake(Snake *snake, Point *ClearLocation); // 在任意位置画一条蛇 46 | void LCD_Draw_Fruit(Point *FruitLocation, Snake *snake_tempt); // 在随机位置画出果实 47 | void LCD_Write_Score(unsigned char Score); // 写入分数 48 | void Sys_Easy(); // 游戏的简单模式 49 | void Sys_Hard(); // 游戏的困难模式 50 | void Sys_Tips(); // 游戏的贴士界面 51 | 52 | // 定时器设置函数 53 | void Timer_Set(){ 54 | EA = 1; // 开启总中断允许 55 | ET0 = 1; // 打开定时器0允许 56 | TMOD = 0x01; // 设置定时器的工作方式寄存器TCON 57 | TH0 = 0; // 设置定时器初值 58 | TL0 = 0; 59 | TR0 = 1; // 最后用TCON寄存器里面的TR0来开启定时器 60 | } 61 | 62 | // 定时器 0 的中断服务函数 63 | void TimerInterrupt() interrupt 1{ 64 | TH0 = 0; 65 | TL0 = 0; 66 | ++InitSeed; // 初始化种子自增 67 | } 68 | 69 | // 延时函数 70 | void delay(unsigned int time){ 71 | while(--time){ 72 | Key_Scan(); 73 | } 74 | } 75 | 76 | // 按键扫描函数 77 | void Key_Scan(){ 78 | if(Key_Up == 0){ 79 | Delay_1ms(1); 80 | if(Key_Up == 0){ 81 | if(snake_towds != TOWDS_DOWN){ 82 | snake_towds = TOWDS_UP; 83 | } 84 | } 85 | } 86 | if(Key_Down == 0){ 87 | Delay_1ms(1); 88 | if(Key_Down == 0){ 89 | if(snake_towds != TOWDS_UP){ 90 | snake_towds = TOWDS_DOWN; 91 | } 92 | } 93 | } 94 | if(Key_Left == 0){ 95 | Delay_1ms(1); 96 | if(Key_Left == 0){ 97 | if(snake_towds != TOWDS_RIGHT){ 98 | snake_towds = TOWDS_LEFT; 99 | } 100 | } 101 | } 102 | if(Key_Right == 0){ 103 | Delay_1ms(1); 104 | if(Key_Right == 0){ 105 | if(snake_towds != TOWDS_LEFT){ 106 | snake_towds = TOWDS_RIGHT; 107 | } 108 | } 109 | } 110 | if(Key_Return == 0){ 111 | PressRet = 1; 112 | } 113 | if(Key_Pause == 0){ 114 | Delay_1ms(20); 115 | if(Key_Pause == 0){ 116 | if(PressPause == 0){ 117 | LCD_Write_Strs(0x90, "Press the Pause", 15); 118 | LCD_Write_Strs(0x89, "for Continue...", 15); 119 | while(!Key_Pause); 120 | PressPause = 1; 121 | while(PressPause && !PressRet){ 122 | Key_Scan(); 123 | } 124 | PressRet = 0; 125 | }else{ 126 | LCD_Clear_DDRAM(); 127 | while(!Key_Pause); 128 | PressPause = 0; 129 | } 130 | } 131 | } 132 | } 133 | 134 | // 困难模式的按键扫描函数 135 | void Inv_Key_Scan(){ 136 | if(Key_Up == 0){ 137 | Delay_1ms(1); 138 | if(Key_Up == 0){ 139 | if(snake_towds != TOWDS_UP){ 140 | snake_towds = TOWDS_DOWN; 141 | } 142 | } 143 | } 144 | if(Key_Down == 0){ 145 | Delay_1ms(1); 146 | if(Key_Down == 0){ 147 | if(snake_towds != TOWDS_DOWN){ 148 | snake_towds = TOWDS_UP; 149 | } 150 | } 151 | } 152 | if(Key_Left == 0){ 153 | Delay_1ms(1); 154 | if(Key_Left == 0){ 155 | if(snake_towds != TOWDS_LEFT){ 156 | snake_towds = TOWDS_RIGHT; 157 | } 158 | } 159 | } 160 | if(Key_Right == 0){ 161 | Delay_1ms(1); 162 | if(Key_Right == 0){ 163 | if(snake_towds != TOWDS_RIGHT){ 164 | snake_towds = TOWDS_LEFT; 165 | } 166 | } 167 | } 168 | if(Key_Return == 0){ 169 | PressRet = 1; 170 | } 171 | if(Key_Pause == 0){ 172 | Delay_1ms(20); 173 | if(Key_Pause == 0){ 174 | if(PressPause == 0){ 175 | LCD_Write_Strs(0x90, "Press the Pause", 15); 176 | LCD_Write_Strs(0x89, "for Continue...", 15); 177 | while(!Key_Pause); 178 | PressPause = 1; 179 | while(PressPause && !PressRet){ 180 | Key_Scan(); 181 | } 182 | PressRet = 0; 183 | }else{ 184 | LCD_Clear_DDRAM(); 185 | while(!Key_Pause); 186 | PressPause = 0; 187 | } 188 | } 189 | } 190 | } 191 | 192 | // 转场动画 193 | void change_Screen(){ 194 | LCD_Clear_DDRAM(); 195 | LCD_Write_Strs(0x88, " Please wait...", 15); 196 | LCD_Draw_Clear(); 197 | LCD_Clear_DDRAM(); 198 | } 199 | 200 | // 初始化 201 | void init(){ 202 | /* 203 | #define _MALLOC_MEM_ xdata 204 | 51由于没有操作系统,需要分配为动态内存的区间并不清楚 205 | 需要头文件故需调用init_mempool来初始化内存池 206 | */ 207 | unsigned char _MALLOC_MEM_ memoryTempt[100]; // 随机分配一个数组,用于初始化内存池,xdata区域 208 | init_mempool(memoryTempt, sizeof(memoryTempt)); // 初始化内存池 209 | 210 | LCD_Init(); // 初始化LCD, 8位并口 211 | Timer_Set(); // 初始化定时器0 212 | Snake_Init(&snake); // 初始化蛇 213 | } 214 | 215 | // 简单系统 216 | void Sys_Easy(){ 217 | Snake_Init(&snake); // 初始化蛇 218 | change_Screen(); 219 | while(!PressRet){ 220 | delay(snake_speed); // 延时,控制蛇走的快慢 221 | 222 | snakeRear = Snake_Move(&snake, &FruitLocation); // 让蛇移动一格,并且取出蛇尾的坐标 223 | 224 | if(FruitLocation.Y == 100){ 225 | FruitLocation.Y = 99; // 说明Game_Over 226 | continue; // 下面语句不执行,直接进行新一次循环 227 | }else if(FruitLocation.Y == 200){ 228 | FruitFlag = 0; // 说明吃到果实了,清空果实存在标志位 229 | snake_speed -= 300; // 每吃到一个果实,蛇的速度加快 230 | } 231 | 232 | // 判断是否要新生成一个果实 233 | if(FruitFlag == 0){ 234 | //Key_Scan(); // 按键扫描函数 235 | LCD_Draw_Fruit(&FruitLocation, &snake); // 生成新的果实,并画出来 236 | //Key_Scan(); // 按键扫描函数 237 | 238 | continue; // 由于蛇尾不再擦除,而且蛇头也不需要重画,所以下面语句不执行,直接进行新一次循环 239 | } 240 | 241 | //Key_Scan(); // 按键扫描函数 242 | 243 | LCD_Draw_Snake(&snake, &snakeRear); // 更新蛇的位置 244 | } 245 | PressRet = 0; 246 | } 247 | 248 | // 困难系统 249 | void Sys_Hard(){ 250 | Snake_Init(&snake); // 初始化蛇 251 | change_Screen(); 252 | while(!PressRet){ 253 | delay(snake_speed); 254 | snakeRear = Snake_Move(&snake, &FruitLocation); 255 | 256 | if(FruitLocation.Y == 100){ 257 | FruitLocation.Y = 99; 258 | continue; 259 | }else if(FruitLocation.Y == 200){ 260 | FruitFlag = 0; 261 | snake_speed -= 300; 262 | } 263 | 264 | if(FruitFlag == 0){ 265 | Inv_Key_Scan(); 266 | LCD_Draw_Fruit(&FruitLocation, &snake); 267 | Inv_Key_Scan(); 268 | continue; 269 | } 270 | Inv_Key_Scan(); 271 | 272 | LCD_Draw_Snake(&snake, &snakeRear); 273 | } 274 | PressRet = 0; 275 | } 276 | 277 | // 提示系统 278 | void Sys_Tips(){ 279 | LCD_Clear_DDRAM(); 280 | LCD_Write_Strs(0x80, "|-----Tips-----|", 16); // The-OdD-SnAKee 281 | LCD_Write_Strs(0x90, "| fmw-lyx-zgt |", 16); // easy 282 | LCD_Write_Strs(0x88, "|--------------|", 16); // -> hard 283 | LCD_Write_Strs(0x98, " ->ok", 9); // tips 284 | 285 | while(1){ 286 | if(Key_Return == 0 || Key_Enter == 0){ 287 | Delay_1ms(20); 288 | if(Key_Return == 0 || Key_Enter == 0){ 289 | while(!Key_Return || !Key_Enter); 290 | break; 291 | } 292 | } 293 | } 294 | } 295 | 296 | 297 | // 在任意位置画出整条蛇 298 | void LCD_Draw_Snake(Snake *snake, Point *ClearLocation){ 299 | // 遍历这条蛇 300 | SnakeNode *p; // 定义一个指针,用于遍历这条蛇 301 | 302 | for(p=snake->front; p!=NULL; p=p->next){ 303 | // 根据当前节点的坐标画出正方形 304 | LCD_Draw_Square(p->Location.X, p->Location.Y, 1); 305 | } 306 | 307 | // 再根据擦除位置的坐标擦除一个正方形 308 | // 说明没有吃到果实,此时擦除蛇尾 309 | if(FruitFlag != 0){ 310 | LCD_Draw_Square(ClearLocation->X, ClearLocation->Y, 0); 311 | } 312 | } 313 | 314 | // 画出游戏初始界面 315 | unsigned char Game_Menu(){ 316 | unsigned char i = 0; 317 | unsigned char ch = SYS_HARD; 318 | unsigned char code str_point[] = " ->"; 319 | unsigned char code str_point_null[] = " "; 320 | change_Screen(); 321 | 322 | // 写入菜单 323 | LCD_Write_Strs(0x80, " The-OdD-SnAKee", 14); 324 | LCD_Write_Strs(0x90, " easy", 10); 325 | LCD_Write_Strs(0x88, " -> hard", 10); 326 | LCD_Write_Strs(0x98, " tips", 10); 327 | 328 | while(1){ 329 | // 选择 easy 330 | if(ch == SYS_EASY){ 331 | // 按↑无反应 332 | // 按↓响应 333 | if(Key_Down == 0){ 334 | Delay_1ms(5); 335 | if(Key_Down == 0){ 336 | ch = SYS_HARD; 337 | LCD_Write_Strs(0x90, str_point_null, 5); 338 | LCD_Write_Strs(0x88, str_point, 5); 339 | while(!Key_Down); 340 | } 341 | } 342 | } 343 | // 选择 hard 344 | if(ch == SYS_HARD){ 345 | // 按↑响应 346 | if(Key_Up == 0){ 347 | Delay_1ms(5); 348 | if(Key_Up == 0){ 349 | ch = SYS_EASY; 350 | LCD_Write_Strs(0x88, str_point_null, 5); 351 | LCD_Write_Strs(0x90, str_point, 5); 352 | while(!Key_Up); 353 | } 354 | } 355 | // 按↓响应 356 | if(Key_Down == 0){ 357 | Delay_1ms(5); 358 | if(Key_Down == 0){ 359 | ch = SYS_TIPS; 360 | LCD_Write_Strs(0x88, str_point_null, 5); 361 | LCD_Write_Strs(0x98, str_point, 5); 362 | while(!Key_Down); 363 | } 364 | } 365 | } 366 | // 选择 tips 367 | if(ch == SYS_TIPS){ 368 | // 按↑响应 369 | // 按↓无反应 370 | if(Key_Up == 0){ 371 | Delay_1ms(20); 372 | if(Key_Up == 0){ 373 | ch = SYS_HARD; 374 | LCD_Write_Strs(0x98, str_point_null, 5); 375 | LCD_Write_Strs(0x88, str_point, 5); 376 | while(!Key_Up); 377 | } 378 | } 379 | } 380 | // 只有当按下"开始"键时,游戏才会开始 381 | if(Key_Enter == 0){ 382 | Delay_1ms(5); 383 | if(Key_Enter == 0){ 384 | // 用随机数产生果实,其中随机数的种子用定时器获取,按下了"开始"键后产生种子,之后种子不再改变 385 | srand(InitSeed); // 初始化种子 386 | // 产生种子之后定时器0就可以关掉了 387 | TR0 = 0; 388 | while(!Key_Enter); 389 | // 退出死循环 390 | return ch; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 画出游戏失败的画面 397 | void Game_Over(){ 398 | unsigned int i = 0; // 用于for循环 399 | 400 | // 清空游戏界面,即清空DDRAM 401 | LCD_Clear_DDRAM(); 402 | 403 | // 写入"Game_Over" 404 | LCD_Write_Strs(0x92, "GameOver", 8); 405 | 406 | // 先写入"得分: " 407 | LCD_Write_Strs(0x8A, "score:", 6); 408 | 409 | // 再写入分数 410 | LCD_Write_Score(snake.length); // 写入分数的函数 411 | 412 | while(1){ 413 | // 只有当按下"回车"键时,游戏才会开始 414 | if(Key_Enter == 0 || Key_Return == 0){ 415 | Delay_1ms(10); 416 | if(Key_Enter == 0 || Key_Return == 0){ 417 | // 之后将蛇销毁,并再次初始化 418 | Snake_Destroy(&snake); 419 | Snake_Init(&snake); 420 | 421 | // 清空果实存在的标志 422 | FruitFlag = 0; 423 | 424 | // 重新设置初始方向为向右 425 | snake_towds = TOWDS_RIGHT; 426 | 427 | while(!Key_Enter || !Key_Return); 428 | // 退出死循环 429 | PressRet = 1; 430 | break; 431 | } 432 | } 433 | } 434 | } 435 | 436 | // 检查蛇是否咬死自己,0表示不会咬死 1表示会咬死自己 437 | bit Snake_Check_Dead(Snake *snake, Point *elemNew){ 438 | SnakeNode *p = snake->front->next->next; // 最开始指向3号位置,为蛇头 439 | 440 | if(snake->length < 4) 441 | return 0; 442 | else{ 443 | for(p; p!=NULL; p=p->next){ 444 | if((elemNew->X == p->Location.X) && (elemNew->Y == p->Location.Y)){ 445 | return 1; 446 | } 447 | } 448 | } 449 | 450 | return 0; 451 | } 452 | 453 | // 写入分数的函数 454 | void LCD_Write_Score(unsigned char Score){ 455 | Score -= 2; // 减掉初始长度2 456 | 457 | // 写入分数时,要判断分数的位数 458 | if(Score < 10){ 459 | LCD_Write(MODE_DATA, '0'); // 48即数字0 460 | LCD_Write(MODE_DATA, Score + '0'); 461 | }else{ 462 | unsigned char Score_H = Score / 10; 463 | unsigned char Score_L = Score % 10; 464 | 465 | LCD_Write(MODE_DATA, Score_H + '0'); 466 | LCD_Write(MODE_DATA, Score_L + '0'); 467 | } 468 | } 469 | 470 | // 画出果实的函数 471 | void LCD_Draw_Fruit(Point *FruitLocation, Snake *snake_tempt){ 472 | // 定义一个指针,遍历整条蛇 473 | SnakeNode *p; 474 | 475 | // 定义一个标志位,用于表示生成的果实是否和蛇的身体重合,1表示重合 476 | bit FruitQualifiedFlag = 1; 477 | 478 | // 判断生成的果实是否合格,不合格的话重新生成一个新果实 479 | while(FruitQualifiedFlag){ 480 | InitSeed = rand(); // 新产生一个随机数 481 | FruitLocation->X = (InitSeed % 63) * 2; // X 最大是124,并且必须是偶数 482 | FruitLocation->Y = (InitSeed % 31) * 2; // Y 最大是60,并且必须是偶数 483 | 484 | for(p=snake_tempt->front; p!=NULL; p=p->next){ 485 | if((p->Location.X == FruitLocation->X) && 486 | (p->Location.Y == FruitLocation->Y)){ 487 | break; 488 | } 489 | } 490 | 491 | // 出循环之后,如果此时 p 为 NULL,说明没有重复,如果p不为NULL,说明有重复 492 | if(p == NULL){ 493 | FruitQualifiedFlag = 0; 494 | } 495 | } 496 | 497 | LCD_Draw_Square(FruitLocation->X, FruitLocation->Y, 1); 498 | 499 | FruitFlag = 1; // 画好果实后,标志位置位 500 | } 501 | 502 | // 处理蛇的走动的函数 503 | Point Snake_Move(Snake *snake, Point *FruitLocation){ 504 | bit EatFruitFlag = 0; 505 | bit Game_Over_Falg = 0; 506 | Point elemNew; 507 | 508 | switch(snake_towds){ 509 | // 向上: 510 | case(TOWDS_UP): 511 | // 判断是否会撞墙导致游戏结束 512 | if(snake->front->Location.Y == 0){ 513 | Game_Over_Falg = 1; 514 | Game_Over(); 515 | }else{ 516 | Key_Scan(); 517 | // 判断是否会吃到果实 518 | if((snake->front->Location.Y == FruitLocation->Y + 2) && 519 | (snake->front->Location.X == FruitLocation->X)){ 520 | // 吃到果实 521 | EatFruitFlag = 1; 522 | } 523 | elemNew.X = snake->front->Location.X; 524 | elemNew.Y = snake->front->Location.Y - 2; 525 | 526 | // 判断是否会咬死自己导致游戏结束,.但是前提条件是蛇的长度大于3 527 | if(((snake->length) >= 4) && (Snake_Check_Dead(snake, &elemNew) == 1)){ 528 | // 检查蛇是否咬死自己,如果会咬死自己上面的函数会返回1 529 | Game_Over_Falg = 1; 530 | Game_Over(); 531 | } 532 | } 533 | break; 534 | // 向下: 535 | case(TOWDS_DOWN): 536 | // 判断是否会撞墙导致游戏结束 537 | if (snake->front->Location.Y == 62){ 538 | Game_Over_Falg = 1; 539 | Game_Over(); 540 | }else{ 541 | Key_Scan(); 542 | // 判断是否会吃到果实 543 | if((snake->front->Location.Y == FruitLocation->Y - 2) && 544 | (snake->front->Location.X == FruitLocation->X)){ 545 | // 吃到果实 546 | EatFruitFlag = 1; 547 | } 548 | elemNew.X = snake->front->Location.X; 549 | elemNew.Y = snake->front->Location.Y + 2; 550 | 551 | // 判断是否会咬死自己导致游戏结束,.但是前提条件是蛇的长度大于3 552 | if(((snake->length) >= 4) && (Snake_Check_Dead(snake, &elemNew) == 1)){ 553 | // 检查蛇是否咬死自己,如果会咬死自己上面的函数会返回1 554 | Game_Over_Falg = 1; 555 | Game_Over(); 556 | } 557 | } 558 | break; 559 | // 向左: 560 | case(TOWDS_LEFT): 561 | // 判断是否会撞墙导致游戏结束 562 | if((snake->front->Location.X == 0 ) || 563 | (snake->front->Location.X == 128)){ 564 | Game_Over_Falg = 1; 565 | Game_Over(); 566 | }else{ 567 | Key_Scan(); 568 | // 判断是否会吃到果实 569 | if((snake->front->Location.Y == FruitLocation->Y) && 570 | (snake->front->Location.X == FruitLocation->X + 2)){ 571 | // 吃到果实 572 | EatFruitFlag = 1; 573 | } 574 | elemNew.X = snake->front->Location.X - 2; 575 | elemNew.Y = snake->front->Location.Y; 576 | 577 | // 判断是否会咬死自己导致游戏结束,.但是前提条件是蛇的长度大于3 578 | if(((snake->length) >= 4) && (Snake_Check_Dead(snake, &elemNew) == 1)){ 579 | // 检查蛇是否咬死自己,如果会咬死自己上面的函数会返回1 580 | Game_Over_Falg = 1; 581 | Game_Over(); 582 | } 583 | } 584 | break; 585 | // 向右 586 | case(TOWDS_RIGHT): 587 | // 判断是否会撞墙导致游戏结束 588 | if((snake->front->Location.X == 126) || 589 | (snake->front->Location.X == 254)){ 590 | Game_Over_Falg = 1; 591 | Game_Over(); 592 | }else{ 593 | Key_Scan(); 594 | // 判断是否会吃到果实 595 | if((snake->front->Location.Y == FruitLocation->Y) && 596 | (snake->front->Location.X == FruitLocation->X - 2)){ 597 | // 吃到果实 598 | EatFruitFlag = 1; 599 | } 600 | elemNew.X = snake->front->Location.X + 2; 601 | elemNew.Y = snake->front->Location.Y; 602 | 603 | // 判断是否会咬死自己导致游戏结束,.但是前提条件是蛇的长度大于3 604 | if(((snake->length) >= 4) && (Snake_Check_Dead(snake, &elemNew) == 1)){ 605 | // 检查蛇是否咬死自己,如果会咬死自己上面的函数会返回1 606 | Game_Over_Falg = 1; 607 | Game_Over(); 608 | } 609 | } 610 | break; 611 | default: 612 | break; 613 | } 614 | 615 | // 判断是否游戏结束 616 | if(Game_Over_Falg == 1){ 617 | FruitLocation->Y = 100; // 正常情况下Y最大62 618 | elemNew.X = elemNew.Y = 0; // 其实此处赋值也是无效的 619 | 620 | return elemNew; // 其实这里返回也是无效的,因为返回之后用不到这个数据 621 | }else{ 622 | Key_Scan(); // 按键扫描函数 623 | 624 | // 首先根据蛇头的朝向在蛇头插入新结点 625 | Insert_At_Snake_Front(snake, &elemNew); // 并不画出来,只是在数据层面加上蛇头 626 | 627 | // EatFruitFlag = 1 说明吃到了果实 628 | if (EatFruitFlag == 1){ 629 | FruitLocation->Y = 200; // 正常情况下Y最大62 630 | elemNew.X = elemNew.Y = 0; // 其实此处赋值也是无效的 631 | 632 | return elemNew; // 其实这里返回也是无效的,因为返回之后用不到这个数据 633 | }else{ 634 | // 释放掉一个尾节点 635 | return Remove_At_Snake_Rear(snake); 636 | } 637 | } 638 | } 639 | -------------------------------------------------------------------------------- /AT89C52+LCD12864 实现贪吃蛇游戏/code/Listings/exam3.m51: -------------------------------------------------------------------------------- 1 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 1 2 | 3 | 4 | BL51 BANKED LINKER/LOCATER V6.22.2.0, INVOKED BY: 5 | D:\KEIL C51\C51\BIN\BL51.EXE .\Objects\lcd12864.obj, .\Objects\main.obj, .\Objects\snake.obj TO .\Objects\exam3 PRINT (. 6 | >> \Listings\exam3.m51) RAMSIZE (256) 7 | 8 | 9 | MEMORY MODEL: SMALL 10 | 11 | 12 | INPUT MODULES INCLUDED: 13 | .\Objects\lcd12864.obj (LCD12864) 14 | .\Objects\main.obj (MAIN) 15 | .\Objects\snake.obj (SNAKE) 16 | D:\KEIL C51\C51\LIB\C51S.LIB (?C_STARTUP) 17 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?COPY) 18 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?CLDPTR) 19 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?CLDOPTR) 20 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?CILDOPTR) 21 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?CSTPTR) 22 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?CSTOPTR) 23 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PLDPTR) 24 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PSTPTR) 25 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PLDOPTR) 26 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PSTOPTR) 27 | D:\KEIL C51\C51\LIB\C51S.LIB (RAND) 28 | D:\KEIL C51\C51\LIB\C51S.LIB (MALLOC) 29 | D:\KEIL C51\C51\LIB\C51S.LIB (INIT_MEM) 30 | D:\KEIL C51\C51\LIB\C51S.LIB (FREE) 31 | D:\KEIL C51\C51\LIB\C51S.LIB (?C_INIT) 32 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?IILDX) 33 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PLDIDATA) 34 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PSTIDATA) 35 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PLDXDATA) 36 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PSTXDATA) 37 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PLDPDATA) 38 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PSTPDATA) 39 | D:\KEIL C51\C51\LIB\C51S.LIB (?C?PLDCODE) 40 | 41 | 42 | LINK MAP OF MODULE: .\Objects\exam3 (LCD12864) 43 | 44 | 45 | TYPE BASE LENGTH RELOCATION SEGMENT NAME 46 | ----------------------------------------------------- 47 | 48 | * * * * * * * D A T A M E M O R Y * * * * * * * 49 | REG 0000H 0008H ABSOLUTE "REG BANK 0" 50 | DATA 0008H 0018H UNIT _DATA_GROUP_ 51 | BIT 0020H.0 0000H.2 UNIT ?BI?MAIN 52 | BIT 0020H.2 0000H.2 UNIT _BIT_GROUP_ 53 | 0020H.4 0000H.4 *** GAP *** 54 | DATA 0021H 0010H UNIT ?DT?MAIN 55 | DATA 0031H 0004H UNIT ?DT?RAND?RAND 56 | IDATA 0035H 0001H UNIT ?STACK 57 | 58 | * * * * * * * X D A T A M E M O R Y * * * * * * * 59 | XDATA 0000H 0064H UNIT _XDATA_GROUP_ 60 | XDATA 0064H 0008H UNIT ?XD?INIT_MEM 61 | 62 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 2 63 | 64 | 65 | * * * * * * * C O D E M E M O R Y * * * * * * * 66 | CODE 0000H 0003H ABSOLUTE 67 | CODE 0003H 0007H UNIT ?PR?LCD_CLEAR_DDRAM?LCD12864 68 | 000AH 0001H *** GAP *** 69 | CODE 000BH 0003H ABSOLUTE 70 | CODE 000EH 02F3H UNIT ?C?LIB_CODE 71 | CODE 0301H 02C5H UNIT ?PR?_SNAKE_MOVE?MAIN 72 | CODE 05C6H 012EH UNIT ?PR?GAME_MENU?MAIN 73 | CODE 06F4H 0104H UNIT ?PR?_FREE?FREE 74 | CODE 07F8H 00FAH UNIT ?PR?_SNAKE_INIT?SNAKE 75 | CODE 08F2H 00C1H UNIT ?PR?_REMOVE_AT_SNAKE_REAR?SNAKE 76 | CODE 09B3H 00BFH UNIT ?PR?_LCD_DRAW_FRUIT?MAIN 77 | CODE 0A72H 00BAH UNIT ?CO?MAIN 78 | CODE 0B2CH 00A3H UNIT ?PR?KEY_SCAN?MAIN 79 | CODE 0BCFH 00A3H UNIT ?PR?INV_KEY_SCAN?MAIN 80 | CODE 0C72H 009CH UNIT ?PR?_MALLOC?MALLOC 81 | CODE 0D0EH 009AH UNIT ?PR?_INSERT_AT_SNAKE_FRONT?SNAKE 82 | CODE 0DA8H 008DH UNIT ?PR?_SNAKE_CHECK_DEAD?MAIN 83 | CODE 0E35H 008CH UNIT ?C_C51STARTUP 84 | CODE 0EC1H 008AH UNIT ?PR?_LCD_DRAW_POINT?LCD12864 85 | CODE 0F4BH 0075H UNIT ?PR?_SNAKE_DESTROY?SNAKE 86 | CODE 0FC0H 0072H UNIT ?PR?SYS_HARD?MAIN 87 | CODE 1032H 0066H UNIT ?PR?SYS_EASY?MAIN 88 | CODE 1098H 0061H UNIT ?PR?_LCD_DRAW_SNAKE?MAIN 89 | CODE 10F9H 005FH UNIT ?PR?LCD_DRAW_CLEAR?LCD12864 90 | CODE 1158H 005DH UNIT ?PR?GAME_OVER?MAIN 91 | CODE 11B5H 0057H UNIT ?PR?SYS_TIPS?MAIN 92 | CODE 120CH 004DH UNIT ?PR?RAND?RAND 93 | CODE 1259H 0042H UNIT ?PR?_LCD_WRITE_SCORE?MAIN 94 | CODE 129BH 003CH UNIT ?PR?_INIT_MEMPOOL?INIT_MEM 95 | CODE 12D7H 0034H UNIT ?PR?_LCD_WRITE_STRS?LCD12864 96 | CODE 130BH 002CH UNIT ?PR?_LCD_DRAW_SQUARE?LCD12864 97 | CODE 1337H 0028H UNIT ?PR?_LCD_WRITE?LCD12864 98 | CODE 135FH 0024H UNIT ?PR?MAIN?MAIN 99 | CODE 1383H 0023H UNIT ?PR?LCD_INIT?LCD12864 100 | CODE 13A6H 001DH UNIT ?C_INITSEG 101 | CODE 13C3H 001CH UNIT ?PR?_DELAY_1MS?LCD12864 102 | CODE 13DFH 001AH UNIT ?PR?INIT?MAIN 103 | CODE 13F9H 0017H UNIT ?PR?_DELAY?MAIN 104 | CODE 1410H 0017H UNIT ?PR?CHANGE_SCREEN?MAIN 105 | CODE 1427H 0016H UNIT ?PR?_LCD_READ?LCD12864 106 | CODE 143DH 0013H UNIT ?PR?LCD_CHECK_BUSY?LCD12864 107 | CODE 1450H 000FH UNIT ?PR?TIMER_SET?MAIN 108 | CODE 145FH 0009H UNIT ?PR?TIMERINTERRUPT?MAIN 109 | 110 | 111 | 112 | OVERLAY MAP OF MODULE: .\Objects\exam3 (LCD12864) 113 | 114 | 115 | SEGMENT BIT_GROUP DATA_GROUP XDATA_GROUP 116 | +--> CALLED SEGMENT START LENGTH START LENGTH START LENGTH 117 | ------------------------------------------------------------------------------------------------ 118 | ?C_C51STARTUP ----- ----- ----- ----- ----- ----- 119 | +--> ?PR?MAIN?MAIN 120 | +--> ?C_INITSEG 121 | 122 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 3 123 | 124 | 125 | ?PR?MAIN?MAIN ----- ----- 0008H 0001H ----- ----- 126 | +--> ?PR?INIT?MAIN 127 | +--> ?PR?GAME_MENU?MAIN 128 | +--> ?PR?SYS_EASY?MAIN 129 | +--> ?PR?SYS_HARD?MAIN 130 | +--> ?PR?SYS_TIPS?MAIN 131 | 132 | ?PR?INIT?MAIN ----- ----- ----- ----- 0000H 0064H 133 | +--> ?PR?_INIT_MEMPOOL?INIT_MEM 134 | +--> ?PR?LCD_INIT?LCD12864 135 | +--> ?PR?TIMER_SET?MAIN 136 | +--> ?PR?_SNAKE_INIT?SNAKE 137 | 138 | ?PR?LCD_INIT?LCD12864 ----- ----- ----- ----- ----- ----- 139 | +--> ?PR?_LCD_WRITE?LCD12864 140 | 141 | ?PR?_LCD_WRITE?LCD12864 ----- ----- ----- ----- ----- ----- 142 | +--> ?PR?LCD_CHECK_BUSY?LCD12864 143 | 144 | ?PR?_SNAKE_INIT?SNAKE ----- ----- 0013H 0006H ----- ----- 145 | +--> ?PR?_MALLOC?MALLOC 146 | 147 | ?PR?_MALLOC?MALLOC ----- ----- 001AH 0004H ----- ----- 148 | 149 | ?PR?GAME_MENU?MAIN ----- ----- 0009H 0002H ----- ----- 150 | +--> ?PR?CHANGE_SCREEN?MAIN 151 | +--> ?CO?MAIN 152 | +--> ?PR?_LCD_WRITE_STRS?LCD12864 153 | +--> ?PR?_DELAY_1MS?LCD12864 154 | +--> ?PR?RAND?RAND 155 | 156 | ?PR?CHANGE_SCREEN?MAIN ----- ----- ----- ----- ----- ----- 157 | +--> ?PR?LCD_CLEAR_DDRAM?LCD12864 158 | +--> ?CO?MAIN 159 | +--> ?PR?_LCD_WRITE_STRS?LCD12864 160 | +--> ?PR?LCD_DRAW_CLEAR?LCD12864 161 | 162 | ?PR?LCD_CLEAR_DDRAM?LCD12864 ----- ----- ----- ----- ----- ----- 163 | +--> ?PR?_LCD_WRITE?LCD12864 164 | 165 | ?PR?_LCD_WRITE_STRS?LCD12864 ----- ----- 0013H 0005H ----- ----- 166 | +--> ?PR?_LCD_WRITE?LCD12864 167 | 168 | ?PR?LCD_DRAW_CLEAR?LCD12864 ----- ----- ----- ----- ----- ----- 169 | +--> ?PR?_LCD_WRITE?LCD12864 170 | 171 | ?PR?SYS_EASY?MAIN ----- ----- ----- ----- ----- ----- 172 | +--> ?PR?_SNAKE_INIT?SNAKE 173 | +--> ?PR?CHANGE_SCREEN?MAIN 174 | +--> ?PR?_DELAY?MAIN 175 | +--> ?PR?_SNAKE_MOVE?MAIN 176 | +--> ?PR?_LCD_DRAW_FRUIT?MAIN 177 | +--> ?PR?_LCD_DRAW_SNAKE?MAIN 178 | 179 | ?PR?_DELAY?MAIN ----- ----- 0009H 0002H ----- ----- 180 | +--> ?PR?KEY_SCAN?MAIN 181 | 182 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 4 183 | 184 | 185 | ?PR?KEY_SCAN?MAIN ----- ----- ----- ----- ----- ----- 186 | +--> ?PR?_DELAY_1MS?LCD12864 187 | +--> ?CO?MAIN 188 | +--> ?PR?_LCD_WRITE_STRS?LCD12864 189 | +--> ?PR?LCD_CLEAR_DDRAM?LCD12864 190 | 191 | ?PR?_SNAKE_MOVE?MAIN 0020H.2 0000H.2 0009H 0008H ----- ----- 192 | +--> ?PR?KEY_SCAN?MAIN 193 | +--> ?PR?_SNAKE_CHECK_DEAD?MAIN 194 | +--> ?PR?GAME_OVER?MAIN 195 | +--> ?PR?_INSERT_AT_SNAKE_FRONT?SNAKE 196 | +--> ?PR?_REMOVE_AT_SNAKE_REAR?SNAKE 197 | 198 | ?PR?_SNAKE_CHECK_DEAD?MAIN ----- ----- 0011H 0009H ----- ----- 199 | 200 | ?PR?GAME_OVER?MAIN ----- ----- 0011H 0002H ----- ----- 201 | +--> ?PR?LCD_CLEAR_DDRAM?LCD12864 202 | +--> ?CO?MAIN 203 | +--> ?PR?_LCD_WRITE_STRS?LCD12864 204 | +--> ?PR?_LCD_WRITE_SCORE?MAIN 205 | +--> ?PR?_DELAY_1MS?LCD12864 206 | +--> ?PR?_SNAKE_DESTROY?SNAKE 207 | +--> ?PR?_SNAKE_INIT?SNAKE 208 | 209 | ?PR?_LCD_WRITE_SCORE?MAIN ----- ----- 0013H 0003H ----- ----- 210 | +--> ?PR?_LCD_WRITE?LCD12864 211 | 212 | ?PR?_SNAKE_DESTROY?SNAKE ----- ----- 0013H 0009H ----- ----- 213 | +--> ?PR?_FREE?FREE 214 | 215 | ?PR?_FREE?FREE ----- ----- 001CH 0004H ----- ----- 216 | 217 | ?PR?_INSERT_AT_SNAKE_FRONT?SNAKE ----- ----- 0011H 0009H ----- ----- 218 | +--> ?PR?_MALLOC?MALLOC 219 | 220 | ?PR?_REMOVE_AT_SNAKE_REAR?SNAKE ----- ----- 0011H 0008H ----- ----- 221 | +--> ?PR?_FREE?FREE 222 | 223 | ?PR?_LCD_DRAW_FRUIT?MAIN 0020H.2 0000H.1 0009H 0009H ----- ----- 224 | +--> ?PR?RAND?RAND 225 | +--> ?PR?_LCD_DRAW_SQUARE?LCD12864 226 | 227 | ?PR?_LCD_DRAW_SQUARE?LCD12864 ----- ----- 0012H 0003H ----- ----- 228 | +--> ?PR?_LCD_DRAW_POINT?LCD12864 229 | 230 | ?PR?_LCD_DRAW_POINT?LCD12864 ----- ----- 0015H 0001H ----- ----- 231 | +--> ?PR?_LCD_WRITE?LCD12864 232 | +--> ?PR?_LCD_READ?LCD12864 233 | 234 | ?PR?_LCD_READ?LCD12864 ----- ----- ----- ----- ----- ----- 235 | +--> ?PR?LCD_CHECK_BUSY?LCD12864 236 | 237 | ?PR?_LCD_DRAW_SNAKE?MAIN ----- ----- 0009H 0009H ----- ----- 238 | +--> ?PR?_LCD_DRAW_SQUARE?LCD12864 239 | 240 | ?PR?SYS_HARD?MAIN ----- ----- ----- ----- ----- ----- 241 | +--> ?PR?_SNAKE_INIT?SNAKE 242 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 5 243 | 244 | 245 | +--> ?PR?CHANGE_SCREEN?MAIN 246 | +--> ?PR?_DELAY?MAIN 247 | +--> ?PR?_SNAKE_MOVE?MAIN 248 | +--> ?PR?INV_KEY_SCAN?MAIN 249 | +--> ?PR?_LCD_DRAW_FRUIT?MAIN 250 | +--> ?PR?_LCD_DRAW_SNAKE?MAIN 251 | 252 | ?PR?INV_KEY_SCAN?MAIN ----- ----- ----- ----- ----- ----- 253 | +--> ?PR?_DELAY_1MS?LCD12864 254 | +--> ?CO?MAIN 255 | +--> ?PR?_LCD_WRITE_STRS?LCD12864 256 | +--> ?PR?KEY_SCAN?MAIN 257 | +--> ?PR?LCD_CLEAR_DDRAM?LCD12864 258 | 259 | ?PR?SYS_TIPS?MAIN ----- ----- ----- ----- ----- ----- 260 | +--> ?PR?LCD_CLEAR_DDRAM?LCD12864 261 | +--> ?CO?MAIN 262 | +--> ?PR?_LCD_WRITE_STRS?LCD12864 263 | +--> ?PR?_DELAY_1MS?LCD12864 264 | 265 | 266 | 267 | SYMBOL TABLE OF MODULE: .\Objects\exam3 (LCD12864) 268 | 269 | VALUE TYPE NAME 270 | ---------------------------------- 271 | 272 | ------- MODULE LCD12864 273 | C:0000H SYMBOL _ICE_DUMMY_ 274 | D:0090H PUBLIC P1 275 | D:00B0H PUBLIC P3 276 | D:00A8H PUBLIC IE 277 | C:10F9H PUBLIC LCD_Draw_Clear 278 | D:00B8H PUBLIC IP 279 | C:130BH PUBLIC _LCD_Draw_Square 280 | C:143DH PUBLIC LCD_Check_Busy 281 | C:0EC1H PUBLIC _LCD_Draw_Point 282 | C:1427H PUBLIC _LCD_Read 283 | D:0098H PUBLIC SCON 284 | D:0088H PUBLIC TCON 285 | C:1344H PUBLIC _LCD_Write 286 | B:00B0H.5 PUBLIC LCD_EN 287 | C:1383H PUBLIC LCD_Init 288 | C:12D7H PUBLIC _LCD_Write_Strs 289 | B:00B0H.7 PUBLIC LCD_RS 290 | B:00B0H.6 PUBLIC LCD_RW 291 | C:13C3H PUBLIC _Delay_1ms 292 | D:00C8H PUBLIC T2CON 293 | C:0003H PUBLIC LCD_Clear_DDRAM 294 | D:00D0H PUBLIC PSW 295 | ------- PROC _DELAY_1MS 296 | D:0006H SYMBOL n 297 | ------- DO 298 | D:0004H SYMBOL i 299 | D:0005H SYMBOL cnt 300 | ------- ENDDO 301 | C:13C3H LINE# 4 302 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 6 303 | 304 | 305 | C:13C3H LINE# 6 306 | C:13C5H LINE# 7 307 | C:13CEH LINE# 8 308 | C:13D8H LINE# 9 309 | C:13DEH LINE# 10 310 | ------- ENDPROC _DELAY_1MS 311 | ------- PROC LCD_CHECK_BUSY 312 | C:143DH LINE# 13 313 | C:143DH LINE# 14 314 | C:1440H LINE# 15 315 | C:1442H LINE# 16 316 | C:1444H LINE# 17 317 | C:1446H LINE# 18 318 | C:1448H LINE# 20 319 | C:144DH LINE# 21 320 | C:144FH LINE# 22 321 | ------- ENDPROC LCD_CHECK_BUSY 322 | ------- PROC LCD_INIT 323 | C:1383H LINE# 25 324 | C:1383H LINE# 26 325 | C:138AH LINE# 27 326 | C:1391H LINE# 28 327 | C:1398H LINE# 29 328 | C:139FH LINE# 30 329 | ------- ENDPROC LCD_INIT 330 | ------- PROC L?0042 331 | ------- ENDPROC L?0042 332 | ------- PROC _LCD_WRITE 333 | D:0007H SYMBOL Write_Mode 334 | D:0005H SYMBOL Data_Command 335 | C:1344H LINE# 34 336 | C:1344H LINE# 46 337 | C:1347H LINE# 47 338 | C:134CH LINE# 48 339 | C:134EH LINE# 49 340 | C:1350H LINE# 50 341 | C:1352H LINE# 51 342 | C:1353H LINE# 52 343 | C:1354H LINE# 53 344 | C:1356H LINE# 54 345 | C:1357H LINE# 55 346 | C:1358H LINE# 56 347 | C:135AH LINE# 57 348 | C:135CH LINE# 58 349 | C:135EH LINE# 60 350 | ------- ENDPROC _LCD_WRITE 351 | ------- PROC _LCD_READ 352 | D:0007H SYMBOL Read_Mode 353 | ------- DO 354 | D:0007H SYMBOL Data_Command 355 | ------- ENDDO 356 | C:1427H LINE# 63 357 | C:1427H LINE# 65 358 | C:142AH LINE# 66 359 | C:142DH LINE# 67 360 | C:1432H LINE# 68 361 | C:1434H LINE# 69 362 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 7 363 | 364 | 365 | C:1436H LINE# 70 366 | C:1438H LINE# 71 367 | C:143AH LINE# 72 368 | C:143CH LINE# 74 369 | C:143CH LINE# 75 370 | ------- ENDPROC _LCD_READ 371 | ------- PROC _LCD_WRITE_STRS 372 | D:0006H SYMBOL addr 373 | D:0014H SYMBOL str 374 | D:0017H SYMBOL count 375 | ------- DO 376 | D:0006H SYMBOL i 377 | ------- ENDDO 378 | C:12D7H LINE# 77 379 | C:12DFH LINE# 79 380 | C:12E6H LINE# 80 381 | C:12EBH LINE# 81 382 | C:12F3H LINE# 82 383 | C:1307H LINE# 83 384 | C:130AH LINE# 84 385 | ------- ENDPROC _LCD_WRITE_STRS 386 | ------- PROC LCD_CLEAR_DDRAM 387 | C:0003H LINE# 87 388 | C:0003H LINE# 88 389 | ------- ENDPROC LCD_CLEAR_DDRAM 390 | ------- PROC LCD_DRAW_CLEAR 391 | ------- DO 392 | D:0006H SYMBOL i 393 | D:0004H SYMBOL j 394 | D:0003H SYMBOL k 395 | ------- ENDDO 396 | C:10F9H LINE# 93 397 | C:10F9H LINE# 94 398 | C:10FDH LINE# 96 399 | C:1103H LINE# 97 400 | C:1108H LINE# 100 401 | C:1112H LINE# 102 402 | C:111EH LINE# 103 403 | C:1127H LINE# 105 404 | C:112AH LINE# 106 405 | C:112CH LINE# 107 406 | C:112EH LINE# 108 407 | C:1135H LINE# 109 408 | C:1135H LINE# 112 409 | C:1141H LINE# 113 410 | C:1148H LINE# 114 411 | C:114BH LINE# 115 412 | C:114EH LINE# 116 413 | C:1151H LINE# 118 414 | ------- ENDPROC LCD_DRAW_CLEAR 415 | ------- PROC _LCD_DRAW_POINT 416 | D:0006H SYMBOL location_x 417 | D:0004H SYMBOL location_y 418 | D:0015H SYMBOL DrawOrClear 419 | ------- DO 420 | D:0003H SYMBOL location_x_port 421 | D:0002H SYMBOL Point_data_old_H 422 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 8 423 | 424 | 425 | D:0001H SYMBOL Point_data_old_L 426 | ------- ENDDO 427 | C:0EC1H LINE# 123 428 | C:0EC7H LINE# 133 429 | C:0ECEH LINE# 134 430 | C:0ED3H LINE# 142 431 | C:0EDDH LINE# 143 432 | C:0EE0H LINE# 144 433 | C:0EE0H LINE# 147 434 | C:0EE5H LINE# 149 435 | C:0EE5H LINE# 150 436 | C:0EE8H LINE# 154 437 | C:0EECH LINE# 155 438 | C:0EF3H LINE# 156 439 | C:0EFAH LINE# 158 440 | C:0EFAH LINE# 159 441 | C:0EFDH LINE# 166 442 | C:0F00H LINE# 168 443 | C:0F0AH LINE# 169 444 | C:0F0DH LINE# 170 445 | C:0F0DH LINE# 172 446 | C:0F13H LINE# 173 447 | C:0F1AH LINE# 174 448 | C:0F26H LINE# 175 449 | C:0F28H LINE# 176 450 | C:0F2FH LINE# 177 451 | C:0F44H LINE# 178 452 | C:0F44H LINE# 180 453 | ------- ENDPROC _LCD_DRAW_POINT 454 | ------- PROC _LCD_DRAW_SQUARE 455 | D:0012H SYMBOL location_x 456 | D:0013H SYMBOL location_y 457 | D:0014H SYMBOL DrawOrClear 458 | C:130BH LINE# 184 459 | C:1311H LINE# 185 460 | C:1314H LINE# 186 461 | C:131FH LINE# 187 462 | C:132AH LINE# 188 463 | ------- ENDPROC _LCD_DRAW_SQUARE 464 | ------- ENDMOD LCD12864 465 | 466 | ------- MODULE MAIN 467 | C:0000H SYMBOL _ICE_DUMMY_ 468 | D:0080H PUBLIC P0 469 | D:0090H PUBLIC P1 470 | D:00B0H PUBLIC P3 471 | B:00A8H.7 PUBLIC EA 472 | C:0DB1H PUBLIC _Snake_Check_Dead 473 | D:0021H PUBLIC FruitFlag 474 | D:0022H PUBLIC snake_speed 475 | B:0080H.5 PUBLIC Key_Enter 476 | B:0080H.4 PUBLIC Key_Pause 477 | B:0080H.3 PUBLIC Key_Right 478 | D:00A8H PUBLIC IE 479 | B:0080H.6 PUBLIC Key_Return 480 | C:0B2CH PUBLIC Key_Scan 481 | C:13F9H PUBLIC _delay 482 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 9 483 | 484 | 485 | C:1450H PUBLIC Timer_Set 486 | B:0020H.0 PUBLIC PressPause 487 | D:0024H PUBLIC snake 488 | B:0080H.2 PUBLIC Key_Left 489 | D:00B8H PUBLIC IP 490 | C:10A7H PUBLIC _LCD_Draw_Snake 491 | D:002BH PUBLIC InitSeed 492 | C:0BCFH PUBLIC Inv_Key_Scan 493 | C:0FC0H PUBLIC Sys_Hard 494 | C:1259H PUBLIC _LCD_Write_Score 495 | D:002CH PUBLIC snakeRear 496 | B:0080H.1 PUBLIC Key_Down 497 | C:135FH PUBLIC main 498 | D:002EH PUBLIC snake_towds 499 | C:1410H PUBLIC change_Screen 500 | C:09B3H PUBLIC _LCD_Draw_Fruit 501 | D:0098H PUBLIC SCON 502 | C:1032H PUBLIC Sys_Easy 503 | D:0089H PUBLIC TMOD 504 | D:0088H PUBLIC TCON 505 | C:13DFH PUBLIC init 506 | B:0020H.1 PUBLIC PressRet 507 | C:11B5H PUBLIC Sys_Tips 508 | B:00A8H.1 PUBLIC ET0 509 | D:002FH PUBLIC FruitLocation 510 | D:008CH PUBLIC TH0 511 | B:0080H.0 PUBLIC Key_Up 512 | D:008AH PUBLIC TL0 513 | B:0088H.4 PUBLIC TR0 514 | C:145FH PUBLIC TimerInterrupt 515 | D:00C8H PUBLIC T2CON 516 | C:0310H PUBLIC _Snake_Move 517 | C:05C6H PUBLIC Game_Menu 518 | C:1158H PUBLIC Game_Over 519 | D:00D0H PUBLIC PSW 520 | ------- PROC TIMER_SET 521 | C:1450H LINE# 53 522 | C:1450H LINE# 54 523 | C:1452H LINE# 55 524 | C:1454H LINE# 56 525 | C:1457H LINE# 57 526 | C:145AH LINE# 58 527 | C:145CH LINE# 59 528 | C:145EH LINE# 60 529 | ------- ENDPROC TIMER_SET 530 | ------- PROC TIMERINTERRUPT 531 | C:145FH LINE# 63 532 | C:145FH LINE# 64 533 | C:1462H LINE# 65 534 | C:1465H LINE# 66 535 | C:1467H LINE# 67 536 | ------- ENDPROC TIMERINTERRUPT 537 | ------- PROC _DELAY 538 | D:0009H SYMBOL time 539 | C:13F9H LINE# 70 540 | C:13FDH LINE# 71 541 | C:140AH LINE# 72 542 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 10 543 | 544 | 545 | C:140DH LINE# 73 546 | C:140FH LINE# 74 547 | ------- ENDPROC _DELAY 548 | ------- PROC KEY_SCAN 549 | C:0B2CH LINE# 77 550 | C:0B2CH LINE# 78 551 | C:0B2FH LINE# 79 552 | C:0B36H LINE# 80 553 | C:0B39H LINE# 81 554 | C:0B3FH LINE# 82 555 | C:0B42H LINE# 83 556 | C:0B42H LINE# 84 557 | C:0B42H LINE# 85 558 | C:0B42H LINE# 86 559 | C:0B45H LINE# 87 560 | C:0B4CH LINE# 88 561 | C:0B4FH LINE# 89 562 | C:0B53H LINE# 90 563 | C:0B56H LINE# 91 564 | C:0B56H LINE# 92 565 | C:0B56H LINE# 93 566 | C:0B56H LINE# 94 567 | C:0B59H LINE# 95 568 | C:0B60H LINE# 96 569 | C:0B63H LINE# 97 570 | C:0B69H LINE# 98 571 | C:0B6CH LINE# 99 572 | C:0B6CH LINE# 100 573 | C:0B6CH LINE# 101 574 | C:0B6CH LINE# 102 575 | C:0B6FH LINE# 103 576 | C:0B76H LINE# 104 577 | C:0B79H LINE# 105 578 | C:0B7FH LINE# 106 579 | C:0B82H LINE# 107 580 | C:0B82H LINE# 108 581 | C:0B82H LINE# 109 582 | C:0B82H LINE# 110 583 | C:0B85H LINE# 111 584 | C:0B87H LINE# 112 585 | C:0B87H LINE# 113 586 | C:0B8AH LINE# 114 587 | C:0B91H LINE# 115 588 | C:0B94H LINE# 116 589 | C:0B97H LINE# 117 590 | C:0BA5H LINE# 118 591 | C:0BB3H LINE# 119 592 | C:0BB6H LINE# 120 593 | C:0BB8H LINE# 121 594 | C:0BBEH LINE# 122 595 | C:0BC1H LINE# 123 596 | C:0BC3H LINE# 124 597 | C:0BC5H LINE# 125 598 | C:0BC6H LINE# 126 599 | C:0BC9H LINE# 127 600 | C:0BCCH LINE# 128 601 | C:0BCEH LINE# 129 602 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 11 603 | 604 | 605 | C:0BCEH LINE# 130 606 | C:0BCEH LINE# 131 607 | C:0BCEH LINE# 132 608 | ------- ENDPROC KEY_SCAN 609 | ------- PROC INV_KEY_SCAN 610 | C:0BCFH LINE# 135 611 | C:0BCFH LINE# 136 612 | C:0BD2H LINE# 137 613 | C:0BD9H LINE# 138 614 | C:0BDCH LINE# 139 615 | C:0BE0H LINE# 140 616 | C:0BE3H LINE# 141 617 | C:0BE3H LINE# 142 618 | C:0BE3H LINE# 143 619 | C:0BE3H LINE# 144 620 | C:0BE6H LINE# 145 621 | C:0BEDH LINE# 146 622 | C:0BF0H LINE# 147 623 | C:0BF6H LINE# 148 624 | C:0BF9H LINE# 149 625 | C:0BF9H LINE# 150 626 | C:0BF9H LINE# 151 627 | C:0BF9H LINE# 152 628 | C:0BFCH LINE# 153 629 | C:0C03H LINE# 154 630 | C:0C06H LINE# 155 631 | C:0C0CH LINE# 156 632 | C:0C0FH LINE# 157 633 | C:0C0FH LINE# 158 634 | C:0C0FH LINE# 159 635 | C:0C0FH LINE# 160 636 | C:0C12H LINE# 161 637 | C:0C19H LINE# 162 638 | C:0C1CH LINE# 163 639 | C:0C22H LINE# 164 640 | C:0C25H LINE# 165 641 | C:0C25H LINE# 166 642 | C:0C25H LINE# 167 643 | C:0C25H LINE# 168 644 | C:0C28H LINE# 169 645 | C:0C2AH LINE# 170 646 | C:0C2AH LINE# 171 647 | C:0C2DH LINE# 172 648 | C:0C34H LINE# 173 649 | C:0C37H LINE# 174 650 | C:0C3AH LINE# 175 651 | C:0C48H LINE# 176 652 | C:0C56H LINE# 177 653 | C:0C59H LINE# 178 654 | C:0C5BH LINE# 179 655 | C:0C61H LINE# 180 656 | C:0C64H LINE# 181 657 | C:0C66H LINE# 182 658 | C:0C68H LINE# 183 659 | C:0C69H LINE# 184 660 | C:0C6CH LINE# 185 661 | C:0C6FH LINE# 186 662 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 12 663 | 664 | 665 | C:0C71H LINE# 187 666 | C:0C71H LINE# 188 667 | C:0C71H LINE# 189 668 | C:0C71H LINE# 190 669 | ------- ENDPROC INV_KEY_SCAN 670 | ------- PROC CHANGE_SCREEN 671 | C:1410H LINE# 192 672 | C:1410H LINE# 193 673 | C:1413H LINE# 194 674 | C:1421H LINE# 195 675 | C:1424H LINE# 196 676 | ------- ENDPROC CHANGE_SCREEN 677 | ------- PROC INIT 678 | ------- DO 679 | X:0000H SYMBOL memoryTempt 680 | ------- ENDDO 681 | C:13DFH LINE# 200 682 | C:13DFH LINE# 207 683 | C:13EAH LINE# 209 684 | C:13EDH LINE# 210 685 | C:13F0H LINE# 211 686 | ------- ENDPROC INIT 687 | ------- PROC SYS_EASY 688 | C:1032H LINE# 215 689 | C:1032H LINE# 216 690 | C:103BH LINE# 217 691 | C:103EH LINE# 218 692 | C:1041H LINE# 219 693 | C:1048H LINE# 221 694 | C:1058H LINE# 223 695 | C:1061H LINE# 224 696 | C:1064H LINE# 225 697 | C:1066H LINE# 226 698 | C:106CH LINE# 227 699 | C:106EH LINE# 228 700 | C:107AH LINE# 229 701 | C:107AH LINE# 232 702 | C:107EH LINE# 234 703 | C:108EH LINE# 237 704 | C:1090H LINE# 238 705 | C:1090H LINE# 242 706 | C:1093H LINE# 243 707 | C:1095H LINE# 244 708 | C:1097H LINE# 245 709 | ------- ENDPROC SYS_EASY 710 | ------- PROC SYS_HARD 711 | C:0FC0H LINE# 248 712 | C:0FC0H LINE# 249 713 | C:0FC9H LINE# 250 714 | C:0FCCH LINE# 251 715 | C:0FCFH LINE# 252 716 | C:0FD6H LINE# 253 717 | C:0FE6H LINE# 255 718 | C:0FEFH LINE# 256 719 | C:0FF2H LINE# 257 720 | C:0FF4H LINE# 258 721 | C:0FFAH LINE# 259 722 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 13 723 | 724 | 725 | C:0FFCH LINE# 260 726 | C:1008H LINE# 261 727 | C:1008H LINE# 263 728 | C:100CH LINE# 264 729 | C:100FH LINE# 265 730 | C:1021H LINE# 266 731 | C:1024H LINE# 267 732 | C:1026H LINE# 268 733 | C:1026H LINE# 269 734 | C:1029H LINE# 271 735 | C:102CH LINE# 272 736 | C:102FH LINE# 273 737 | C:1031H LINE# 274 738 | ------- ENDPROC SYS_HARD 739 | ------- PROC SYS_TIPS 740 | C:11B5H LINE# 277 741 | C:11B5H LINE# 278 742 | C:11B8H LINE# 279 743 | C:11C6H LINE# 280 744 | C:11D4H LINE# 281 745 | C:11E2H LINE# 282 746 | C:11F0H LINE# 284 747 | C:11F0H LINE# 285 748 | C:11F6H LINE# 286 749 | C:11FDH LINE# 287 750 | C:1203H LINE# 288 751 | C:120BH LINE# 289 752 | C:120BH LINE# 290 753 | C:120BH LINE# 291 754 | C:120BH LINE# 292 755 | C:120BH LINE# 293 756 | ------- ENDPROC SYS_TIPS 757 | ------- PROC L?0195 758 | ------- ENDPROC L?0195 759 | ------- PROC _LCD_DRAW_SNAKE 760 | D:0001H SYMBOL snake 761 | D:000CH SYMBOL ClearLocation 762 | ------- DO 763 | D:000FH SYMBOL p 764 | ------- ENDDO 765 | C:10A7H LINE# 299 766 | C:10A7H LINE# 303 767 | C:10B4H LINE# 305 768 | C:10CAH LINE# 306 769 | C:10DEH LINE# 310 770 | C:10E2H LINE# 311 771 | C:10F8H LINE# 312 772 | C:10F8H LINE# 313 773 | ------- ENDPROC _LCD_DRAW_SNAKE 774 | ------- PROC GAME_MENU 775 | ------- DO 776 | D:0009H SYMBOL i 777 | D:000AH SYMBOL ch 778 | C:0B20H SYMBOL str_point 779 | C:0B26H SYMBOL str_point_null 780 | ------- ENDDO 781 | C:05C6H LINE# 316 782 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 14 783 | 784 | 785 | C:05C6H LINE# 317 786 | C:05C9H LINE# 318 787 | C:05CCH LINE# 321 788 | C:05CFH LINE# 324 789 | C:05DDH LINE# 325 790 | C:05EBH LINE# 326 791 | C:05F9H LINE# 327 792 | C:0607H LINE# 329 793 | C:0607H LINE# 331 794 | C:060DH LINE# 334 795 | C:0610H LINE# 335 796 | C:0616H LINE# 336 797 | C:0619H LINE# 337 798 | C:061CH LINE# 338 799 | C:062AH LINE# 339 800 | C:0638H LINE# 340 801 | C:063BH LINE# 341 802 | C:063BH LINE# 342 803 | C:063BH LINE# 343 804 | C:063BH LINE# 345 805 | C:0641H LINE# 347 806 | C:0644H LINE# 348 807 | C:064AH LINE# 349 808 | C:064DH LINE# 350 809 | C:0650H LINE# 351 810 | C:065EH LINE# 352 811 | C:066CH LINE# 353 812 | C:066FH LINE# 354 813 | C:066FH LINE# 355 814 | C:066FH LINE# 357 815 | C:0672H LINE# 358 816 | C:0679H LINE# 359 817 | C:067CH LINE# 360 818 | C:067FH LINE# 361 819 | C:068DH LINE# 362 820 | C:069BH LINE# 363 821 | C:069EH LINE# 364 822 | C:069EH LINE# 365 823 | C:069EH LINE# 366 824 | C:069EH LINE# 368 825 | C:06A4H LINE# 371 826 | C:06A7H LINE# 372 827 | C:06ADH LINE# 373 828 | C:06B0H LINE# 374 829 | C:06B3H LINE# 375 830 | C:06C1H LINE# 376 831 | C:06CFH LINE# 377 832 | C:06D2H LINE# 378 833 | C:06D2H LINE# 379 834 | C:06D2H LINE# 380 835 | C:06D2H LINE# 382 836 | C:06D8H LINE# 383 837 | C:06DFH LINE# 384 838 | C:06E5H LINE# 386 839 | C:06ECH LINE# 388 840 | C:06EEH LINE# 389 841 | C:06F1H LINE# 391 842 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 15 843 | 844 | 845 | C:06F3H LINE# 392 846 | C:06F3H LINE# 393 847 | C:06F3H LINE# 394 848 | C:06F3H LINE# 395 849 | ------- ENDPROC GAME_MENU 850 | ------- PROC GAME_OVER 851 | ------- DO 852 | D:0011H SYMBOL i 853 | ------- ENDDO 854 | C:1158H LINE# 398 855 | C:1158H LINE# 399 856 | C:115DH LINE# 402 857 | C:1160H LINE# 405 858 | C:116EH LINE# 408 859 | C:117CH LINE# 411 860 | C:1181H LINE# 413 861 | C:1181H LINE# 415 862 | C:1187H LINE# 416 863 | C:118EH LINE# 417 864 | C:1194H LINE# 419 865 | C:119DH LINE# 420 866 | C:11A6H LINE# 423 867 | C:11A9H LINE# 426 868 | C:11ACH LINE# 428 869 | C:11B2H LINE# 430 870 | C:11B4H LINE# 431 871 | C:11B4H LINE# 432 872 | C:11B4H LINE# 433 873 | C:11B4H LINE# 434 874 | C:11B4H LINE# 435 875 | ------- ENDPROC GAME_OVER 876 | C:0DA8H SYMBOL L?0193 877 | ------- PROC L?0192 878 | ------- ENDPROC L?0192 879 | C:0DA8H SYMBOL L?0193 880 | ------- PROC _SNAKE_CHECK_DEAD 881 | D:0011H SYMBOL snake 882 | D:0014H SYMBOL elemNew 883 | ------- DO 884 | D:0017H SYMBOL p 885 | ------- ENDDO 886 | C:0DB1H LINE# 438 887 | C:0DB7H LINE# 439 888 | C:0DCCH LINE# 441 889 | C:0DE1H LINE# 442 890 | C:0DE3H LINE# 443 891 | C:0DE3H LINE# 444 892 | C:0DEBH LINE# 445 893 | C:0E1DH LINE# 446 894 | C:0E1FH LINE# 447 895 | C:0E1FH LINE# 448 896 | C:0E33H LINE# 449 897 | C:0E33H LINE# 451 898 | C:0E34H LINE# 452 899 | ------- ENDPROC _SNAKE_CHECK_DEAD 900 | ------- PROC _LCD_WRITE_SCORE 901 | D:0013H SYMBOL Score 902 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 16 903 | 904 | 905 | ------- DO 906 | D:0014H SYMBOL Score_H 907 | D:0015H SYMBOL Score_L 908 | ------- ENDDO 909 | C:1259H LINE# 455 910 | C:125BH LINE# 456 911 | C:125FH LINE# 459 912 | C:126AH LINE# 460 913 | C:1271H LINE# 461 914 | C:1273H LINE# 462 915 | C:1275H LINE# 463 916 | C:127DH LINE# 464 917 | C:1286H LINE# 466 918 | C:1290H LINE# 467 919 | C:129AH LINE# 468 920 | C:129AH LINE# 469 921 | ------- ENDPROC _LCD_WRITE_SCORE 922 | ------- PROC _LCD_DRAW_FRUIT 923 | D:0009H SYMBOL FruitLocation 924 | D:000CH SYMBOL snake_tempt 925 | ------- DO 926 | D:000FH SYMBOL p 927 | B:0020H.2 SYMBOL FruitQualifiedFlag 928 | ------- ENDDO 929 | C:09B3H LINE# 472 930 | C:09B9H LINE# 477 931 | C:09BBH LINE# 480 932 | C:09C1H LINE# 481 933 | C:09C6H LINE# 482 934 | C:09D9H LINE# 483 935 | C:09EFH LINE# 485 936 | C:0A02H LINE# 486 937 | C:0A34H LINE# 487 938 | C:0A34H LINE# 488 939 | C:0A34H LINE# 489 940 | C:0A34H LINE# 490 941 | C:0A48H LINE# 493 942 | C:0A53H LINE# 494 943 | C:0A55H LINE# 495 944 | C:0A55H LINE# 496 945 | C:0A58H LINE# 498 946 | C:0A6EH LINE# 500 947 | C:0A71H LINE# 501 948 | ------- ENDPROC _LCD_DRAW_FRUIT 949 | ------- PROC L?0194 950 | ------- ENDPROC L?0194 951 | ------- PROC _SNAKE_MOVE 952 | D:0009H SYMBOL snake 953 | D:000CH SYMBOL FruitLocation 954 | ------- DO 955 | B:0020H.2 SYMBOL EatFruitFlag 956 | B:0020H.3 SYMBOL Game_Over_Falg 957 | D:000FH SYMBOL elemNew 958 | ------- ENDDO 959 | C:0310H LINE# 504 960 | C:0316H LINE# 505 961 | C:0318H LINE# 506 962 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 17 963 | 964 | 965 | C:031AH LINE# 509 966 | C:0335H LINE# 511 967 | C:0335H LINE# 513 968 | C:0346H LINE# 514 969 | C:0346H LINE# 515 970 | C:0346H LINE# 516 971 | C:0349H LINE# 517 972 | C:034CH LINE# 519 973 | C:0391H LINE# 520 974 | C:0391H LINE# 522 975 | C:0393H LINE# 523 976 | C:0393H LINE# 524 977 | C:03A1H LINE# 525 978 | C:03ABH LINE# 528 979 | C:03CBH LINE# 530 980 | C:03CBH LINE# 531 981 | C:03CBH LINE# 532 982 | C:03CBH LINE# 533 983 | C:03CBH LINE# 534 984 | C:03CEH LINE# 536 985 | C:03CEH LINE# 538 986 | C:03E1H LINE# 539 987 | C:03E1H LINE# 540 988 | C:03E1H LINE# 541 989 | C:03E4H LINE# 542 990 | C:03E7H LINE# 544 991 | C:0421H LINE# 545 992 | C:0421H LINE# 547 993 | C:0423H LINE# 548 994 | C:0423H LINE# 549 995 | C:0431H LINE# 550 996 | C:0436H LINE# 553 997 | C:0456H LINE# 555 998 | C:0456H LINE# 556 999 | C:0456H LINE# 557 1000 | C:0456H LINE# 558 1001 | C:0456H LINE# 559 1002 | C:0459H LINE# 561 1003 | C:0459H LINE# 563 1004 | C:046BH LINE# 564 1005 | C:046BH LINE# 565 1006 | C:046BH LINE# 566 1007 | C:046BH LINE# 567 1008 | C:046EH LINE# 568 1009 | C:0471H LINE# 570 1010 | C:04B6H LINE# 571 1011 | C:04B6H LINE# 573 1012 | C:04B8H LINE# 574 1013 | C:04B8H LINE# 575 1014 | C:04C8H LINE# 576 1015 | C:04D0H LINE# 579 1016 | C:04F0H LINE# 581 1017 | C:04F0H LINE# 582 1018 | C:04F0H LINE# 583 1019 | C:04F0H LINE# 584 1020 | C:04F0H LINE# 585 1021 | C:04F3H LINE# 587 1022 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 18 1023 | 1024 | 1025 | C:04F3H LINE# 589 1026 | C:0509H LINE# 590 1027 | C:0509H LINE# 591 1028 | C:0509H LINE# 592 1029 | C:0509H LINE# 593 1030 | C:050BH LINE# 594 1031 | C:050EH LINE# 596 1032 | C:0548H LINE# 597 1033 | C:0548H LINE# 599 1034 | C:054AH LINE# 600 1035 | C:054AH LINE# 601 1036 | C:055AH LINE# 602 1037 | C:055CH LINE# 605 1038 | C:0576H LINE# 607 1039 | C:0578H LINE# 608 1040 | C:057BH LINE# 609 1041 | C:057BH LINE# 610 1042 | C:057BH LINE# 611 1043 | C:057BH LINE# 612 1044 | C:057BH LINE# 613 1045 | C:057BH LINE# 614 1046 | C:057BH LINE# 617 1047 | C:057EH LINE# 618 1048 | C:0589H LINE# 619 1049 | C:0589H LINE# 621 1050 | C:058BH LINE# 622 1051 | C:058BH LINE# 623 1052 | C:058EH LINE# 626 1053 | C:05A0H LINE# 629 1054 | C:05A3H LINE# 630 1055 | C:05B1H LINE# 631 1056 | C:05B6H LINE# 633 1057 | C:05BCH LINE# 634 1058 | C:05BCH LINE# 636 1059 | C:05C5H LINE# 637 1060 | C:05C5H LINE# 638 1061 | C:05C5H LINE# 639 1062 | ------- ENDPROC _SNAKE_MOVE 1063 | ------- PROC MAIN 1064 | ------- DO 1065 | D:0008H SYMBOL ch 1066 | ------- ENDDO 1067 | C:135FH LINE# 3 1068 | C:135FH LINE# 5 1069 | C:1362H LINE# 7 1070 | C:1362H LINE# 8 1071 | C:1367H LINE# 9 1072 | C:136CH LINE# 10 1073 | C:136FH LINE# 11 1074 | C:1375H LINE# 12 1075 | C:1378H LINE# 13 1076 | C:137EH LINE# 14 1077 | C:1381H LINE# 15 1078 | ------- ENDPROC MAIN 1079 | ------- ENDMOD MAIN 1080 | 1081 | ------- MODULE SNAKE 1082 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 19 1083 | 1084 | 1085 | C:0000H SYMBOL _ICE_DUMMY_ 1086 | C:0F4BH PUBLIC _Snake_Destroy 1087 | C:08F2H PUBLIC _Remove_At_Snake_Rear 1088 | C:0D0EH PUBLIC _Insert_At_Snake_Front 1089 | C:07F8H PUBLIC _Snake_Init 1090 | ------- PROC _SNAKE_INIT 1091 | D:0013H SYMBOL snake 1092 | ------- DO 1093 | D:0016H SYMBOL pNew 1094 | ------- ENDDO 1095 | C:07F8H LINE# 6 1096 | C:07FEH LINE# 10 1097 | C:0810H LINE# 11 1098 | C:0833H LINE# 12 1099 | C:0841H LINE# 14 1100 | C:0859H LINE# 15 1101 | C:0864H LINE# 16 1102 | C:0871H LINE# 18 1103 | C:0883H LINE# 19 1104 | C:089BH LINE# 20 1105 | C:08A5H LINE# 21 1106 | C:08B1H LINE# 23 1107 | C:08CCH LINE# 24 1108 | C:08E4H LINE# 25 1109 | ------- ENDPROC _SNAKE_INIT 1110 | ------- PROC _SNAKE_DESTROY 1111 | D:0013H SYMBOL snake 1112 | ------- DO 1113 | D:0016H SYMBOL p 1114 | D:0019H SYMBOL q 1115 | ------- ENDDO 1116 | C:0F4BH LINE# 29 1117 | C:0F51H LINE# 31 1118 | C:0F5AH LINE# 34 1119 | C:0F62H LINE# 35 1120 | C:0F74H LINE# 36 1121 | C:0F7BH LINE# 37 1122 | C:0F84H LINE# 38 1123 | C:0F86H LINE# 40 1124 | C:0FB3H LINE# 41 1125 | ------- ENDPROC _SNAKE_DESTROY 1126 | ------- PROC _INSERT_AT_SNAKE_FRONT 1127 | D:0011H SYMBOL snake 1128 | D:0014H SYMBOL elem 1129 | ------- DO 1130 | D:0017H SYMBOL pNew 1131 | ------- ENDDO 1132 | C:0D0EH LINE# 45 1133 | C:0D14H LINE# 48 1134 | C:0D26H LINE# 51 1135 | C:0D3EH LINE# 52 1136 | C:0D50H LINE# 53 1137 | C:0D68H LINE# 56 1138 | C:0D83H LINE# 58 1139 | C:0D98H LINE# 60 1140 | C:0DA6H LINE# 62 1141 | C:0DA7H LINE# 63 1142 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 20 1143 | 1144 | 1145 | ------- ENDPROC _INSERT_AT_SNAKE_FRONT 1146 | ------- PROC _REMOVE_AT_SNAKE_REAR 1147 | D:0011H SYMBOL snake 1148 | ------- DO 1149 | D:0014H SYMBOL ClearLocation 1150 | D:0016H SYMBOL p 1151 | ------- ENDDO 1152 | C:08F2H LINE# 66 1153 | C:08F8H LINE# 68 1154 | C:08FDH LINE# 71 1155 | C:092EH LINE# 72 1156 | C:0940H LINE# 73 1157 | C:0942H LINE# 77 1158 | C:0953H LINE# 78 1159 | C:0967H LINE# 81 1160 | C:096EH LINE# 84 1161 | C:0986H LINE# 87 1162 | C:099EH LINE# 90 1163 | C:09ACH LINE# 92 1164 | C:09B2H LINE# 93 1165 | ------- ENDPROC _REMOVE_AT_SNAKE_REAR 1166 | ------- ENDMOD SNAKE 1167 | 1168 | ------- MODULE ?C?COPY 1169 | C:00DEH PUBLIC ?C?COPY 1170 | ------- ENDMOD ?C?COPY 1171 | 1172 | ------- MODULE ?C?CLDPTR 1173 | C:0104H PUBLIC ?C?CLDPTR 1174 | ------- ENDMOD ?C?CLDPTR 1175 | 1176 | ------- MODULE ?C?CLDOPTR 1177 | C:011DH PUBLIC ?C?CLDOPTR 1178 | ------- ENDMOD ?C?CLDOPTR 1179 | 1180 | ------- MODULE ?C?CILDOPTR 1181 | C:014AH PUBLIC ?C?CILDOPTR 1182 | ------- ENDMOD ?C?CILDOPTR 1183 | 1184 | ------- MODULE ?C?CSTPTR 1185 | C:017DH PUBLIC ?C?CSTPTR 1186 | ------- ENDMOD ?C?CSTPTR 1187 | 1188 | ------- MODULE ?C?CSTOPTR 1189 | C:018FH PUBLIC ?C?CSTOPTR 1190 | ------- ENDMOD ?C?CSTOPTR 1191 | 1192 | ------- MODULE ?C?PLDPTR 1193 | C:01B1H PUBLIC ?C?PLDPTR 1194 | ------- ENDMOD ?C?PLDPTR 1195 | 1196 | ------- MODULE ?C?PSTPTR 1197 | C:01D1H PUBLIC ?C?PSTPTR 1198 | ------- ENDMOD ?C?PSTPTR 1199 | 1200 | ------- MODULE ?C?PLDOPTR 1201 | C:0220H PUBLIC ?C?PLDOPTR 1202 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 21 1203 | 1204 | 1205 | ------- ENDMOD ?C?PLDOPTR 1206 | 1207 | ------- MODULE ?C?PSTOPTR 1208 | C:0250H PUBLIC ?C?PSTOPTR 1209 | ------- ENDMOD ?C?PSTOPTR 1210 | 1211 | ------- MODULE RAND 1212 | D:0031H PUBLIC ?SRAND?BYTE 1213 | C:120CH PUBLIC RAND 1214 | C:124EH PUBLIC _SRAND 1215 | ------- ENDMOD RAND 1216 | 1217 | ------- MODULE MALLOC 1218 | C:0C72H PUBLIC _malloc 1219 | ------- ENDMOD MALLOC 1220 | 1221 | ------- MODULE INIT_MEM 1222 | X:0064H PUBLIC __mem_avail__ 1223 | C:129BH PUBLIC _init_mempool 1224 | ------- ENDMOD INIT_MEM 1225 | 1226 | ------- MODULE FREE 1227 | C:06F4H PUBLIC _free 1228 | ------- ENDMOD FREE 1229 | 1230 | ------- MODULE ?C?IILDX 1231 | C:02A9H PUBLIC ?C?IILDX 1232 | ------- ENDMOD ?C?IILDX 1233 | 1234 | ------- MODULE ?C?PLDIDATA 1235 | C:02BFH PUBLIC ?C?PLDIDATA 1236 | ------- ENDMOD ?C?PLDIDATA 1237 | 1238 | ------- MODULE ?C?PSTIDATA 1239 | C:02C8H PUBLIC ?C?PSTIDATA 1240 | ------- ENDMOD ?C?PSTIDATA 1241 | 1242 | ------- MODULE ?C?PLDXDATA 1243 | C:02D1H PUBLIC ?C?PLDXDATA 1244 | ------- ENDMOD ?C?PLDXDATA 1245 | 1246 | ------- MODULE ?C?PSTXDATA 1247 | C:02DAH PUBLIC ?C?PSTXDATA 1248 | ------- ENDMOD ?C?PSTXDATA 1249 | 1250 | ------- MODULE ?C?PLDPDATA 1251 | C:02E3H PUBLIC ?C?PLDPDATA 1252 | ------- ENDMOD ?C?PLDPDATA 1253 | 1254 | ------- MODULE ?C?PSTPDATA 1255 | C:02ECH PUBLIC ?C?PSTPDATA 1256 | ------- ENDMOD ?C?PSTPDATA 1257 | 1258 | ------- MODULE ?C?PLDCODE 1259 | C:02F5H PUBLIC ?C?PLDCODE 1260 | ------- ENDMOD ?C?PLDCODE 1261 | 1262 | BL51 BANKED LINKER/LOCATER V6.22.2.0 12/09/2019 23:55:14 PAGE 22 1263 | 1264 | 1265 | Program Size: data=53.4 xdata=108 code=5223 1266 | LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S) 1267 | --------------------------------------------------------------------------------