用Protues7.8仿真測試,使用KEIL4,語言是KEIL4,制作了12864的驅動程序,希望能幫到初學者,程序都有一定注釋。建議零基礎的師兄下載來用。
6[V2@AM51heiD7@B90J6RQ)HYP.png (31.3 KB, 下載次數(shù): 50)
下載附件
2020-7-12 07:32 上傳
51hei.png (17.25 KB, 下載次數(shù): 62)
下載附件
2020-7-12 13:14 上傳
XB1QKO%O}O}U[IH623WXU.png (21.99 KB, 下載次數(shù): 57)
下載附件
2020-7-12 07:33 上傳
單片機源程序如下:
- #include "reg52.h"
- #include "string.h"
- #include "stdio.h"
- sbit RS = P1^7; //控制端口
- sbit RW = P1^6;
- sbit E = P1^5;
- sbit PSB = P3^2;
- sbit PAUSE = P0^3;
- sbit RES = P0^2;
- #define DataPort P2 //單片機 P2<------> 液晶DB0-DB7
- sbit BEEP=P1^0 ;//蜂鳴器IO口定義
- sbit KEY1=P1^3; //撤銷按鍵IO口定義
- sbit LED=P1^1;//繼電器控制IO口定義
- #define SET_BEEP BEEP = 0
- #define CLR_BEEP BEEP = 1
- signed long dat=0;
- unsigned char iii=0;
- char string[]=" ";
- //M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
- //4字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
- unsigned char code data2[4] = {0x12,0,0,0};
- unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
- unsigned char idata MLastSelectedSnr[4];
- unsigned char idata RevBuffer[30];
- //unsigned char data SerBuffer[20];
- bit CmdValid;
- unsigned char code ASCII_NUM[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
- unsigned char code Yankey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //原始密碼
- unsigned char code XiugaiYunKey[16]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x07,0x80,0x69,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //修改后的密碼
- unsigned char code Nowkey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE}; //xianzia 密碼
- unsigned char code XiugaiNowKey[16]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x80,0x69,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
- unsigned char idata Read_Data[16]={0x00};
- unsigned char data OperationCard;
- unsigned char data bWarn,bPass,ttt=0,tt=0;
- #define REGCARD 0xa1
- #define CONSUME 0xa2
- #define READCARD 0xa3
- #define ADDMONEY 0xa4
- #define CHEXIAO 0xa5
- /*------------------------------------------------
- uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void STC_send_bluetooth(unsigned char a) //注意:若單片機TXD(P3.1)無上拉能力,必須在P3.1端接上拉電阻。本次測試需要接上拉電阻
- {
- TI=0;
- SBUF=a;
- while(TI==0);
- TI=0;}
- void KeyScan(void) //獨立按鍵掃描
- {
- char string[]=" ";
- if(KEY1 == 0)//撤銷按鍵
- {
- delay_10ms(1);
- if(KEY1 == 0 )
- {
- OperationCard=CHEXIAO;
- tt=5;}
- }
- if(REGCARDBTN == 0)//注冊按鍵
- {
- delay_10ms(1);
- if(REGCARDBTN == 0 )
- OperationCard = REGCARD;
- tt=1;
- }
- if(READCARDBTN == 0)//讀卡信息
- {
- delay_10ms(1);
- if(READCARDBTN == 0 )
- OperationCard = READCARD; tt=4;
- }
- }
- void Warn(void) //蜂鳴器報警 長
- {
- uchar data ii;
- for(ii=0;ii<3;ii++)
- {
- SET_BEEP;//ShortBeep();如果是有源蜂鳴器就一句SET_BEEP就ok了
- delay_10ms(5);
- CLR_BEEP;
- delay_10ms(5);
- }
- }
- void WaitCardOff(void)
- {
- char status;
- unsigned char TagType[2];
- while(1)
- {
- status = PcdRequest(PICC_REQALL , TagType);
- if(status)
- {
- status = PcdRequest(PICC_REQALL , TagType);
- if(status)
- {
- status = PcdRequest(PICC_REQALL , TagType);
- if(status)
- {
- return;
- }
- }
- }
- //delay_10ms(5);
- }
- }
- void Pass(void)//蜂鳴器報警 短
- {
- SET_BEEP;//LongBeep();如果是有源蜂鳴器就一句SET_BEEP就ok了
- delay_10ms(30);
- CLR_BEEP;
- }
- void CtrlProcess(void)//射頻讀卡程序
- {
-
- unsigned char idata Write_Consume_Data[16];
-
- signed long money_value;
- unsigned char ii;
- char status;
- status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//尋天線區(qū)內(nèi)未進入休眠狀態(tài)的卡,返回卡片類型 2字節(jié)
-
- if(status!=MI_OK)
- return;
-
- for(ii=0;ii<2;ii++)
- {
- string[2*ii] = ASCII_NUM[(RevBuffer[ii]>>4)&0x0f];
- string[2*ii+1] = ASCII_NUM[RevBuffer[ii]&0x0f];
-
- }
- string[4] = '\0';
- LCD_PutString(0,2,"類型: 學? ");//液晶顯示卡類型
- LCD_PutString(0,3,"卡號: ");
- LCD_PutString(0,1," ");
- status=PcdAnticoll(&RevBuffer[2]);//防沖撞,返回卡的序列號 4字節(jié)
-
- if(status!=MI_OK)
- return;
- memcpy(MLastSelectedSnr,&RevBuffer[2],4);//4字節(jié)序列號 放到MLastSelectedSnr
- for(ii=0;ii<4;ii++)
- {
- string[2*ii] = ASCII_NUM[(MLastSelectedSnr[ii]>>4)&0x0f];
- string[2*ii+1] = ASCII_NUM[MLastSelectedSnr[ii]&0x0f];
- }
- string[9] = '\0';
- LCD_PutString(3,3,string);// LCD顯示序列號
-
- status=PcdSelect(MLastSelectedSnr);//選卡
- if(status!=MI_OK)
- return;
-
- if(OperationCard==REGCARD)//注冊程序
- {
- while(1)
- {
- status=PcdAuthState(PICC_AUTHENT1A,7,Yankey,MLastSelectedSnr);//
- //DelayNS(1);
- if(status!=MI_OK)//已經(jīng)注冊顯示
- { LCD_PutString(0,4," 已注冊:"); Warn(); WaitCardOff(); break; }
- status=PcdWrite(7,XiugaiYunKey);
-
- if(status!=MI_OK)
- {
- // bWarn=1;
- break;
- }
- for(ii=0;ii<16;ii++)
- {
- Write_Consume_Data[ii]=0xaa;//Write_First_Data
- }
- memset( Write_Consume_Data, 0, sizeof(Write_Consume_Data) );//Write_First_Data Write_First_Data
- money_value = 0000;
- memcpy( Write_Consume_Data, ( uchar * )&money_value, 4 ); //Write_First_Data
-
- status=PcdWrite(4,&Write_Consume_Data[0]);//Write_First_Data
- if(status!=MI_OK)
- {
- bWarn=1;
- break;
- }
- LCD_PutString(0,4,"注冊: 成功");
- //LCD_PutString(0,4," ");
- Pass();
- PcdHalt();
- }
- }
- if(OperationCard==CHEXIAO)//撤銷程序
- {
- while(1)
- {
- status = PcdAuthState(PICC_AUTHENT1A,7,Nowkey,MLastSelectedSnr);
- //DelayNS(1);
- if(status!=MI_OK)
- { LCD_PutString(0,4," 已撤銷:"); Warn(); WaitCardOff(); break; }
- status=PcdWrite(7,XiugaiNowKey);
-
- if(status!=MI_OK)
- {
- // bWarn=1;
- break;
- }
- for(ii=0;ii<16;ii++)
- {
- Write_Consume_Data[ii]=0xaa;//Write_First_Data
- }
- memset( Write_Consume_Data, 0, sizeof(Write_Consume_Data) );//Write_First_Data Write_First_Data
- money_value = 0000;
- memcpy( Write_Consume_Data, ( uchar * )&money_value, 4 ); //Write_First_Data
-
- status=PcdWrite(4,&Write_Consume_Data[0]);//Write_First_Data
- if(status!=MI_OK)
- {
- bWarn=1;
- break;
- }
- LCD_PutString(0,4,"注銷: 成功");
- Pass();
- PcdHalt();
- }
- }
-
- else if(OperationCard==READCARD)//讀卡
- {
- while(1)
- {
- status=PcdAuthState(PICC_AUTHENT1A,7,Nowkey,MLastSelectedSnr);//????KUAI4?
-
- if(status!=MI_OK) //無效卡顯示
- { LCD_PutString(0,4," 無效卡: ");iii=2; Warn(); WaitCardOff(); break; }
-
- status=PcdRead(4,Read_Data);
- LED=0;
- if(status!=MI_OK)
- {
- //bWarn=1;
- break;
- }
- memcpy( (uchar *)&money_value, Read_Data, 4 );
- PcdHalt();
- }
-
- if(iii==1){ Warn(); }if(iii==0) Pass();iii=0;
- delay_10ms(10);
- }
-
- WaitCardOff();
- PcdHalt();//中止
- delay_10ms(100);
- LED=1;
- }
- void iccardcode()
- {
- unsigned char cmd;
- unsigned char status;
-
- cmd = RevBuffer[0];
- switch(cmd)
- {
- case 1: // Halt the card //終止卡的操作
- status= PcdHalt();;
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
- // 尋卡,防沖突,選擇卡 返回卡類型(2 bytes)+ 卡系列號(4 bytes)
- status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
- if(status!=0)
- {
- status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
- if(status!=0)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- }
- RevBuffer[0]=3;
- RevBuffer[1]=status;
- break;
-
- case 3: // 防沖突 讀卡的系列號 MLastSelectedSnr
- status = PcdAnticoll(&RevBuffer[2]);
- if(status!=0)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- memcpy(MLastSelectedSnr,&RevBuffer[2],4);
- RevBuffer[0]=5;
- RevBuffer[1]=status;
- break;
- case 4: // 選擇卡 Select Card
- status=PcdSelect(MLastSelectedSnr);
- if(status!=MI_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- RevBuffer[0]=3;
- RevBuffer[1]=status;
- break;
- case 5: // Key loading into the MF RC500's EEPROM
- status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校驗卡密碼
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 6:
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 7:
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 8: // Read the mifare card
- // 讀卡
- status=PcdRead(RevBuffer[1],&RevBuffer[2]);
- if(status==0)
- {RevBuffer[0]=17;}
- else
- {RevBuffer[0]=1;}
- RevBuffer[1]=status;
- break;
- case 9: // Write the mifare card
- // 寫卡 下載密碼
- status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 10:
- PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 12: // 參數(shù)設置
- PcdBakValue(RevBuffer[1], RevBuffer[2]);
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- break;
- }
- }
- /*------------------------------------------------
- 檢測忙位
- ------------------------------------------------*/
- void Check_Busy()
- {
- RS=0;
- RW=1;
- E=1;
- DataPort=0xff;
- while((DataPort&0x80)==0x80);//忙則等待
- E=0;
- }
- /*------------------------------------------------
- 寫命令
- ------------------------------------------------*/
- void Write_Cmd(unsigned char Cmd)
- {
- Check_Busy();
- RS=0;
- RW=0;
- E=1;
- DataPort=Cmd;
- DelayUs2x(5);
- E=0;
- DelayUs2x(5);
- }
- /*------------------------------------------------
- 寫數(shù)據(jù)
- ------------------------------------------------*/
- void Write_Data(unsigned char Data)
- {
- Check_Busy();
- RS=1;
- RW=0;
- E=1;
- DataPort=Data;
- DelayUs2x(5);
- E=0;
- DelayUs2x(5);
- }
- /*------------------------------------------------
- 液晶屏初始化
- ------------------------------------------------*/
- void Init_ST7920()
- {
- DelayMs(40); //大于40MS的延時程序
- PSB=1; //設置為8BIT并口工作模式
- DelayMs(1); //延時
- RES=0; //復位
- DelayMs(1); //延時
- RES=1; //復位置高
- DelayMs(10);
- Write_Cmd(0x30); //選擇基本指令集
- DelayUs2x(50); //延時大于100us
- Write_Cmd(0x30); //選擇8bit數(shù)據(jù)流
- DelayUs2x(20); //延時大于37us
- Write_Cmd(0x0c); //開顯示(無游標、不反白)
- DelayUs2x(50); //延時大于100us
- Write_Cmd(0x01); //清除顯示,并且設定地址指針為00H
- DelayMs(15); //延時大于10ms
- Write_Cmd(0x06); //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動
- DelayUs2x(50); //延時大于100us
- }
- /*------------------------------------------------
- 顯示字符串
- x:橫坐標值,范圍0~8
- y:縱坐標值,范圍1~4
- ------------------------------------------------*/
- void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s)
- {
- switch(y)
- {
- case 1: Write_Cmd(0x80+x);break;
- case 2: Write_Cmd(0x90+x);break;
- case 3: Write_Cmd(0x88+x);break;
- case 4: Write_Cmd(0x98+x);break;
- default:break;
- }
- while(*s>0)
- {
- Write_Data(*s);
- s++;
- DelayUs2x(50);
- }
- }
- /*------------------------------------------------
- 清屏
- ------------------------------------------------*/
- void ClrScreen()
- {
- Write_Cmd(0x01);
- DelayMs(15);
- }
- /////////////////////////////////////////////////////////////////////
- //系統(tǒng)初始化
- /////////////////////////////////////////////////////////////////////
- void InitializeSystem()//射頻初始化
- {
- CmdValid=0;
- LED_GREEN = 1;
- PcdReset();
- PcdAntennaOff();
- PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- LED_GREEN = 0;
- delay_10ms(10);
- LED_GREEN = 1;
- delay_10ms(10);
- LED_GREEN = 0;
- }
- /////////////////////////////////////////////////////////////////////
- //用T2做延時子程序
- /////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // 接收和發(fā)送中斷
- ///////////////////////////////////////////////////////////////////////
- void isr_UART(void) interrupt 4 using 1
- {
- unsigned char len, i;
- unsigned int j=0;
-
- if(RI)
- {
- len=SBUF;
- RI=0;
- for(i=0;i<len;i++)
- {
- while(!RI)
- {
- j++;
- if(j>1000)
- {
- break;
- }
- }
- if(j<1000)
- {
- RevBuffer[i]=SBUF;
- RI=0;
- j=0;
- }
- else
- {
- break;
- }
- }
- if(i==len)
- {
- REN=0;
- CmdValid=1;
- }
- }
- else if(!RI && TI)
- {
- TI=0;
- len=RevBuffer[0];
- for(i=0;i<len+1;i++)
- {
- SBUF=RevBuffer[i];
- while(!TI);
- TI=0;
- }
- REN=1;
- }
- }
- void UartProcess(void)
- {
- unsigned char baud;
- if(RevBuffer[0]==11) //為了加快相應速度 測試風鳴器
- {
- RevBuffer[2]=RevBuffer[1];
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- CALL_isr_UART();
- LED_GREEN = 1;
- delay_10ms(RevBuffer[2]);
- LED_GREEN = 0;
- }
- else if(RevBuffer[0]==13) //設置通訊波特率
- {
- switch(RevBuffer[1])
- {
- case 0:
- baud=BAUD_9600;
- break;
-
- }
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- CALL_isr_UART();
- delay_10ms(5);
- TR1 = 0;
- TH1 = baud;
- TL1 = TH1;
- delay_10ms(2);
- TR1 = TRUE;
- }
- else
- {
- iccardcode();
- CALL_isr_UART();
- }
- }
- void InitializeSystem1()
- {
- P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;P2 = 0xFF;
- TMOD = 0x21;
- TH1 = 0xFd; //11.0592M晶振,9600波特率
- TL1 = 0xFd;
- TH0 = 0xfe; //11.0592M晶振,9600波特率
- TL0 = 0x33;
-
- ET0 = 1;
- TR0 = 1;
- SM0 = 0;
- SM1 = 1;
- REN = 1;//允許串口接收
- TR1 = 1;
- ES = 1;//開串口 中斷
- EA = 1;
- }
- void timer0() interrupt 1 /* T0中斷服務程序 */
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
32.12864顯示內(nèi)容.zip
(250.12 KB, 下載次數(shù): 40)
2020-7-12 07:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|