笨笨兔 发表于 2018-4-26 16:13 没外加,用的89c52 |
没设置过,不知道 |
data和xdata是不一样的RAM xdata,你外加芯片了吗? |
这个应该打开软件可以配置的 |
我之前一直把两个选项设为最大值,都是第三个. |
#include <reg52.h> #include <string.h> #include <stdio.h> #include <intrins.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned int #define FOSC_110592M unsigned int rec_data_len_uart=0; unsigned char idata Buffer_Uart0_Rec[25]={0}; unsigned char TIME_BASE; unsigned char MACT_ENDB; unsigned char Rece_Errp=0; uchar PH[30]={"AT+CMGS=\"15051861770\"\r\n"}; uchar code IC_DAT[]; uchar pic1[]; uchar code pic2[]; uchar key; uchar MEDAT[16][4]; uchar cabinet[16]; uchar contain[4]; uchar data pic6[]; bit key_flag=0; bit cabinet_1=0; bit cabinet_2=0; bit cabinet_3=0; bit cabinet_4=0; bit cabinet_5=0; bit cabinet_6=0; bit cabinet_7=0; bit cabinet_8=0; bit cabinet_9=0; bit cabinet_10=0; bit cabinet_11=0; bit cabinet_12=0; bit cabinet_13=0; bit cabinet_14=0; bit cabinet_15=0; bit cabinet_16=0; sbit RS = P0^7; sbit WRD = P0^6; sbit E = P0^5; sbit PSB = P0^4; sbit RES = P0^3; void TransferData(char data1,bit DI); void display(void); void display_grapic(void); void delayms(uint n); void DisplayLine(uchar line1,uchar line2); void DisplayGraphic(uchar code *adder); void initinal(void); void DelaySec(int sec); void delay(uint m); void lcd_mesg(uchar *adder1); void KeyScan(); sbit key1=P3^5; sbit key2=P3^4; uchar code IC_DAT[]={ " " //0X80 " Express " //0X90 " Intelligent " //0X88 " Cabinet " //0X98 }; uchar pic1[]={ " 欢迎使用 " " " " 输入号码 " " " }; uchar code pic2[]={ " " " " "短信发送中......" " " }; uchar code pic3[]={ " " " " " 短信已发送 " " " }; uchar data pic6[]={ " " " " "choose " " " }; uchar code pic5[]={ " " " " " 无可用柜 " " " }; uchar code pic7[]={ " " " " " Error " " " }; CheckCabinet() { char n=1; if(cabinet_1==0) { cabinet[n]=1; n++; } if(cabinet_2==0) { cabinet[n]=2; n++; } if(cabinet_3==0) { cabinet[n]=3; n++; } if(cabinet_4==0) { cabinet[n]=4; n++; } if(cabinet_5==0) { cabinet[n]=5; n++; } if(cabinet_6==0) { cabinet[n]=6; n++; } if(cabinet_7==0) { cabinet[n]=7; n++; } if(cabinet_8==0) { cabinet[n]=8; n++; } if(cabinet_9==0) { cabinet[n]=9; n++; } if(cabinet_10==0) { cabinet_10=10; n++; } if(cabinet_11==0) { cabinet[n]=11; n++; } if(cabinet_12==0) { cabinet[n]=12; n++; } if(cabinet_13==0) { cabinet[n]=13; n++; } if(cabinet_14==0) { cabinet[n]=14; n++; } if(cabinet_15==0) { cabinet[n]=15; n++; } if(cabinet_16==0) { cabinet[n]=16; } if(cabinet_1&&cabinet_2&&cabinet_3&&cabinet_4&&cabinet_5&&cabinet_6&&cabinet_7&&cabinet_8&&cabinet_9&&cabinet_10&&cabinet_11&&cabinet_12&&cabinet_13&&cabinet_14&&cabinet_15&&cabinet_16==1) { initinal(); lcd_mesg(pic5); DelaySec(2); return(n); } return(n); } char ChooseCabinet() { char i; char m; char k; cch: initinal(); delay(20); i=0; lcd_mesg(pic6); delayms(10); ccheck: do { KeyScan(); } while(key_flag==0); key_flag=0; if(key==10)//确认键 { if(i==1) { for(m=0;m<=15;m++) { if(pic6[39]-'0'==cabinet[m]) return(m+1); } lcd_mesg(pic7); DelaySec(2); goto cch; } else if(i==2) { k=(pic6[39]-'0')*10+(pic6[40]-'0'); for(m=0;m<=15;m++) { if(k==cabinet[m]) return(m+1); } lcd_mesg(pic7); DelaySec(2); goto cch; } else { lcd_mesg(pic7); DelaySec(2); goto cch; } } else if(key==11)//退格键 { --i; pic6[39+i]=' '; initinal(); delayms(2); lcd_mesg(pic6); delayms(20); goto ccheck; } else { pic6[39]=key+'0';//存输入 i++; goto ccheck; lcd_mesg(pic6); } delay(5); } void GetMEDAT(char v) { srand(TH0); MEDAT[v][0]=rand()%9+0; MEDAT[v][1]=rand()%9+0; MEDAT[v][2]=rand()%9+0; MEDAT[v][3]=rand()%9+0; } void SystemInit(void) { TMOD=0x01; TH0=(65536-45872)/256; // 定时50ms //晶振:11.0592MHZ TL0=(65536-45872)%256; ET0=1; TR0=1; EA=1; } void Timer0_IRQ(void) interrupt 1 { TH0=(655365-45872)/256; TL0=(655365-45872)%256; //进入中断50ms +1次 TIME_BASE++; if(TIME_BASE == 20) // 20ms * 50ms = 刚好等于1000ms 也就是1秒 { TIME_BASE = 0; MACT_ENDB++; // 一秒加一次 if(MACT_ENDB==20) // 等于刚好20秒时间到 { MACT_ENDB = 0; Rece_Errp=1; } } } void SerialInti()//初始化程序(必须使用,否则无法收发) { TMOD=0x20;//定时器1操作模式2:8位自动重载定时器 #ifdef FOSC_12M //在这里根据晶振大小设置不同的数值初始化串口 TH1=0xf3;//装入初值,波特率2400 TL1=0xf3; #else TH1=0xfd;//装入初值,波特率9600 TL1=0xfd; #endif //end of SOC_12M TR1=1;//打开定时器 SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制) SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据 REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许) EA=1;//开总中断 ES=1;//开串行口中断 } /*串行通讯中断,收发完成将进入该中断*/ void Serial_interrupt() interrupt 4 { unsigned char temp_rec_data_uart0; temp_rec_data_uart0 = SBUF;//读取接收数据 RI=0;//接收中断信号清零,表示将继续接收 Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0; //接收数据 rec_data_len_uart++; if(rec_data_len_uart>24) { rec_data_len_uart=0; //从头开始接收数据 } } void Uart1Send(uchar c) { SBUF=c; while(!TI);//等待发送完成信号(TI=1)出现 TI=0; } //串行口连续发送char型数组,遇到终止号/0将停止 void Uart1Sends(uchar *str) { while(*str!='\0') { SBUF=*str; while(!TI);//等待发送完成信号(TI=1)出现 TI=0; str++; } } //延时函数大概是1s钟,不过延时大的话不准... void DelaySec(int sec) { uint i , j= 0; for(i=0; i<sec; i++) { for(j=0; j<65535; j++) { } } } void initinal(void) //LCD字库初始化程序 { delay(40); //大于40MS的延时程序 PSB=1; //设置为8BIT并口工作模式 delay(1); //延时 RES=0; //复位 delay(1); //延时 RES=1; //复位置高 delay(10); TransferData(0x30,0); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF delay(100); //大于100uS的延时程序 TransferData(0x30,0); //Function Set delay(37); ////大于37uS的延时程序 TransferData(0x08,0); //Display on Control delay(100); //大于100uS的延时程序 TransferData(0x10,0); //Cursor Display Control光标设置 delay(100); //大于100uS的延时程序 TransferData(0x0C,0); //Display Control,D=1,显示开 delay(100); //大于100uS的延时程序 TransferData(0x01,0); //Display Clear delay(10); //大于10mS的延时程序 TransferData(0x06,0); //Enry Mode Set,光标从右向左加1位移动 delay(100); //大于100uS的延时程序 } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main(void) { while(1) { start: initinal(); //调用LCD字库初始化程序 delay(20); //大于100uS的延时程序 lcd_mesg(IC_DAT); //显示中文汉字 delayms(10); do { KeyScan(); } while(key_flag==0); key_flag=0; if(key==12) //存快递 { int z=17; int m; char v; SystemInit(); //开始定时 do { for(m=17;m<=27;m++) //号码清除 { pic1[m]=' '; } memset(cabinet,0,sizeof(cabinet));//初始化可用柜号数组 if(CheckCabinet()==1) { goto start; } else { v=ChooseCabinet(); initinal(); lcd_mesg(pic1); ee1: do { KeyScan(); } while(key_flag==0&&Rece_Errp==0); if(Rece_Errp==1) goto ee2; key_flag=0; if(key==11)//退格键 { --z; pic1[z]=' '; initinal(); delayms(2); lcd_mesg(pic1); delayms(20); goto ee1; } else if(key==10) //存确认 { int i; for(i=0;i<=10;i++) PH[i+9]=pic1[i+17]; GetMEDAT(v); contain[0]=MEDAT[v][0]+'0'; contain[1]=MEDAT[v][0]+'0'; contain[2]=MEDAT[v][0]+'0'; contain[3]=MEDAT[v][0]+'0'; lcd_mesg(pic2); delayms(200); SerialInti(); Uart1Sends("AT+CSCS=\"GSM\"\r\n"); DelaySec(1);//延时大约3秒 1 Uart1Sends("AT+CMGF=1\r\n"); DelaySec(1);//延时3秒 Uart1Sends("AT+CSCA?\r\n"); DelaySec(1);//延时3秒 Uart1Sends("AT+CSMP=17,167,0,241\r\n"); DelaySec(1);//延时3秒 Uart1Sends(PH);//号码 DelaySec(1);//延时3秒 Uart1Sends(contain);//修改短信内容,短信内容可为英文和数字 Uart1Send(0x1a); DelaySec(1);//延时3秒 lcd_mesg(pic3); DelaySec(2); } else { pic1[z]=key+'0';//存输入 z++; delay(5); lcd_mesg(pic1); delayms(20); goto ee1; } } } while(Rece_Errp==1); ee2: Rece_Errp=0; goto start; } } } /******************************************************************** * 名称 : 信息发送 * 功能 : * 输入 : 无 * 输出 : 无 ***********************************************************************/ void lcd_mesg(unsigned char *adder1) { unsigned char i; TransferData(0x80,0); //Set Graphic Display RAM Address delay(100); for(i=0;i<32;i++) { TransferData(*adder1,1); adder1++; } TransferData(0x90,0); //Set Graphic Display RAM Address delay(100); for(i=32;i<64;i++) { TransferData(*adder1,1); adder1++; } } /******************************************************************** * 名称 : 信息判断 * 功能 : * 输入 : 无 * 输出 : 无 ***********************************************************************/ void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据. { WRD=0; RS=DI; delay(1); P2=data1; E=1; delay(1); E=0; } /******************************************************************** * 名称 : 延时 * 功能 : * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delayms(unsigned int n) //延时10×n毫秒程序 { unsigned int i,j; for(i=0;i<n;i++) for(j=0;j<2000;j++); } /******************************************************************** * 名称 : 延时 * 功能 : * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay(unsigned int m) //延时程序 { unsigned int i,j; for(i=0;i<m;i++) for(j=0;j<10;j++); } void KeyScan() //键盘扫描程序,key应定义为全局无符号字符型 { uchar i,temp,temp1=0xfe; for(i=0;i<4;i++) { P1=temp1; temp=P1&0xf0; if(temp!=0xf0) { delayms(1); temp=P1&0xf0; if(temp!=0xf0) { while((P1&0xf0)!=0xf0); switch(temp) { case 0xe0:key=4*i+0;break; case 0xd0:key=4*i+1;break; case 0xb0:key=4*i+2;break; case 0x70:key=4*i+3;break; } key_flag=1; break; } } temp1=(temp1<<1)|0x01; } } |
西瓜_ 发表于 2018-4-26 13:59 没有故障,代码放楼下,刚刚试了一下,我的这个数组定义为data就能运行,定义为xdata就运行不了,这两种keil都不报错 |
贴代码或者故障码呀 |
我之前一直把两个选项设为最大值,都是第三个 |