微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 急!LCD12864显示乱码和缺少部分内容,毕设,求大神解答

急!LCD12864显示乱码和缺少部分内容,毕设,求大神解答

时间:10-02 整理:3721RD 点击:
文件12864.c的内容如下:
#include "lpcreg.h"
#include <intrins.h>       
#include <12864.h>
extern unsigned char g_ucTempbuf[20];
uchar code dis1[] = {"毕设"};
uchar code dis2[] = {"RFID刷卡系统"};
uchar code dis3[] = {"主控芯片RC522 "};
uchar code dis4[] = {"请您刷卡! "};
uchar code table3[]={"卡号:"};
uchar code table4[]={"卡类型:"};
uchar code table5[]={"消费:"};
uchar code table6[]={"余额:"};
uchar code table7[]={"元:"};
/*******************************************************************/
/*                                                                 */
/*  延时函数                                                       */
/*                                                                 */
/*******************************************************************/
void delay(int ms)
{
    while(ms--)
        {
      uchar i;
          for(i=0;i<250;i++)  
           {
            _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}               
/*******************************************************************/
/*                                                                 */
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*                                                                 */
/*******************************************************************/
/*bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);  //(bit)强制转换成位,P0&0x80换成二进制就10000000也就是P0口的P0^7位。换成=P0^7也可以,但返回值中要判断result是否为0
    LCD_EN = 0;
    return(result);
}*/
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   //while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;//下降沿写入
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   //while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{
    LCD_PSB = 1;         //并口方式
    lcd_wcmd(0x34);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}
void display_welcome2()
{
        uchar i;
    delay(10);                 //延时
    //wela=0;
        //dula=0;         
    lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
     i = 0;
    while(dis1[i] != '\0')
     {                         //显示字符
       lcd_wdat(dis1[i]);
       i++;
     }
    lcd_pos(1,0);             //设置显示位置为第二行的第1个字符
     i = 0;
    while(dis2[i] != '\0')
     {
       lcd_wdat(dis2[i]);      //显示字符
       i++;
     }
         lcd_pos(2,0);             //设置显示位置为第三行的第1个字符
     i = 0;
    while(dis3[i] != '\0')
     {
       lcd_wdat(dis3[i]);      //显示字符
       i++;
     }
         lcd_pos(3,0);             //设置显示位置为第四行的第1个字符
     i = 0;
    while(dis4[i] != '\0')
     {
       lcd_wdat(dis4[i]);      //显示字符
       i++;
     }
  //while(1);

}
/*********************************************************/
/*                                                                                                                 */
/* 延时x*0.14ms子程序                                                                         */
/*                                                       */
/*********************************************************/
/*void delay0(uchar x)    //x*0.14MS
{
  uchar i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}*/
/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcmd(pos);     //显示地址
}
void LCD_Data(unsigned char LCDbyte )
{
         unsigned char count;
         count=(LCDbyte&0xf0)>>4;
         if (count>0x9) lcd_wdat(count%9+0x40);
         else lcd_wdat(count+0x30);
         count=LCDbyte&0x0f;
         if (count>9) lcd_wdat(count%9+0x40);
         else lcd_wdat(count+0x30);
}
void display_type()//寻到卡后显示出该卡的类型
{
        unsigned char num;
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
    lcd_pos(0,0);             //设置显示位置为第四行的第1个字符
        for(num=0;num<8;num++)    //第一行要显示的11个字符
        {
        lcd_wdat(table4[num]);       
        }
        for(num=0;num<2;num++)//第一行要显示的11个字符
        {
                lcd_pos(0,num+4);
                LCD_Data(g_ucTempbuf[num]);//写数字
        }
}
void display_cardnum()
{
        unsigned char num;
    //lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
    lcd_pos(1,0);             //设置显示位置为第四行的第1个字符
        for(num=0;num<6;num++)    //第一行要显示的11个字符
        {
        lcd_wdat(table3[num]);       
        }
        for(num=0;num<4;num++)//第一行要显示的11个字符
        {
                lcd_pos(1,num+3);
                LCD_Data(g_ucTempbuf[num]);//写数字
        }
}
void display_xiaofeicarddat()//消费
{
    unsigned char num;
        lcd_pos(2,0);             //设置显示位置为第四行的第1个字符
        for(num=0;num<6;num++)    //第一行要显示的11个字符
        {
        lcd_wdat(table5[num]);       
        }
    lcd_pos(2,7);             //设置显示位置为第四行的第1个字符
        for(num=0;num<2;num++)    //第一行要显示的11个字符
        {
        lcd_wdat(table7[num]);       
        }
        for(num=0;num<1;num++)//第一行要显示的11个字符
        {
                lcd_pos(2,num+3);
                LCD_Data(0x01);//消费
        }
}
void display_carddat()    //余额
{
    unsigned char first,second,num,i,yule[3];
    lcd_pos(3,0);     
        for(num=0;num<6;num++)    //第一行要显示的11个字符
        {
        lcd_wdat(table6[num]);       
        }
    lcd_pos(3,7);             //设置显示位置为第四行的第1个字符
        for(num=0;num<2;num++)    //第一行要显示的11个字符
        {
        lcd_wdat(table7[num]);       
        }
           //设置显示位置为第四行的第1个字符
        first=(g_ucTempbuf[3]&0xf0)>>4;
        //LCD_write_shu(7,4,first);//写数字
    second=g_ucTempbuf[3]&0x0f;
        //LCD_write_shu(8,4,second);//写数字
    num=first*16+second;        //十进制显示
    yule[0]=num/100;
    yule[1]=num%100/10;
    yule[2]=num%10;
    for(i=0;i<3;i++)
    //LCD_write_shu(7+i,4,yule[i]);//写数字
     {
        lcd_pos(3,3+i);
                lcd_wdat(yule[i]+0x30);//写数字,余额
         }
    /*for(num=0;num<4;num++)//第一行要显示的11个字符
        {
        lcd_pos(3,num+3);
                LCD_Data(g_ucTempbuf[3]);//写数字,余额
        }*/
   /*lcd_pos(3,0);
    for(num=8;num<16;num++)//第一行要显示的11个字符
        {
                LCD_Data(g_ucTempbuf[num]);//写数字
        }*/
}
文件main.c内容如下
#include "lpcreg.h"
#include "main.h"
#include "mfrc522.h"
#include "12864.h"
#include   <STDIO.H>
#include <string.h>
unsigned char code data1[16] = {0x12,0x34,0x56,0x78,0xED,0xCB,0xA9,0x87,0x12,0x34,0x56,0x78,0x01,0xFE,0x01,0xFE};
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char code data2[4]  = {0,0,0,0x01};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

unsigned char g_ucTempbuf[20];                        
void delay1(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);       
}  

void main( )
{   
     unsigned char status,i;
          unsigned int temp;
         lcd_init();
     InitializeSystem( );
     PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();  
          display_welcome2();
          
          
     while ( 1 )
     {   

         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
         if (status != MI_OK)
         {   
                          continue;
         }
                        display_type();//寻到卡后显示出该卡的类型

                        printf("卡的类型:");
            for(i=0;i<2;i++)
                                        {
                                                temp=g_ucTempbuf[i];
                                                printf("%X",temp);
                                               
                                        }
                       
         status = PcdAnticoll(g_ucTempbuf);//防冲撞
         if (status != MI_OK)
         {    continue;    }

                        display_cardnum();//显示寻到的卡的序列号

                                        ////////以下为超级终端打印出的内容////////////////////////
                               
                                        printf("卡序列号:");        //超级终端显示,
                                        for(i=0;i<4;i++)
                                        {
                                                temp=g_ucTempbuf[i];
                                                printf("%X",temp);
                                               
                                        }
                      
                                        //temp=m1erea;
                                       
                                        //printf("%X\n",temp);

                                        ///////////////////////////////////////////////////////////
         status = PcdSelect(g_ucTempbuf);//选定卡片
         if (status != MI_OK)
         {    continue;    }
         status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
         if (status != MI_OK)
         {    continue;    }
         status = PcdWrite(1, data1);//写块
         if (status != MI_OK)
         {    continue;    }
while(1)                 
                {
         status = PcdRequest(PICC_REQIDL, g_ucTempbuf);//寻卡
         if (status != MI_OK)
         {   
                          continue;
         }
                 status = PcdAnticoll(g_ucTempbuf);//防冲撞
         if (status != MI_OK)
         {    continue;    }
                display_cardnum();//显示寻到的卡的序列号
                status = PcdSelect(g_ucTempbuf);//选定卡片
         if (status != MI_OK)
         {    continue;    }
         status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
         if (status != MI_OK)
         {    continue;    }
         
             /*    status = PcdValue(PICC_DECREMENT,1,data2);//扣款
         if (status != MI_OK)
         {    continue;    }  */
                 
        status = PcdValue(PICC_INCREMENT,1,data2);//充值
         if (status != MI_OK)
         {    continue;    }
        display_xiaofeicarddat();//消费       
         status = PcdBakValue(1, 2);//块备份
         if (status != MI_OK)
         {    continue;    }
         status = PcdRead(2, g_ucTempbuf);//读块
         if (status != MI_OK)
         {    continue;    }
                printf("卡读块:");        //超级终端显示,
         for(i=0;i<16;i++)
                                        {
                                                temp=g_ucTempbuf[i];
                                                printf("%X",temp);
                                               
                                        }
                 printf("\n");
         display_carddat();//显示数据
         //memcpy(data1,g_ucTempbuf,16);
                LED_GREEN = 0;
                FM_QI= 0;
                delay1(100);
                LED_GREEN = 1;
                FM_QI= 1;
                delay1(100);
                LED_GREEN = 0;
                FM_QI= 0;
                delay1(200);
                LED_GREEN = 1;       
                FM_QI= 1;                         
                delay1(600);                                                   
                 PcdHalt();
                }
          
    }
}

/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
        P0M1 = 0x0; P0M2 = 0x0;
        P1M1 = 0x0;        P1M2 = 0x0;                     
        P3M1 = 0x0; P3M2 = 0xFF;
        P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;P2 = 0xFF;
       
        TMOD=0x21;                   //设T0为方式1,GATE=1;
        SCON=0x50;
        TH1=0xFA;          //波特率为4800bps
        TL1=0xFA;
        TH0=0;
        TL0=0;
        TR0=1;  
        ET0=1;             //允许T0中断
        TR1=1;                           //开启定时器
        TI=1;
        EA=1;                                   //开启总中断
       
        ES = 1;
        RI = 1;
}






最好能说明一下截图哪些是显示乱码,哪些是缺少内容

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top