⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 430 单片机控制产生正玄波输出 周期频率可以调节
💻 C
📖 第 1 页 / 共 2 页
字号:
//                    FYD12864 测试程序(串口) 
//***************************************************************************
//连线表: CPU=msp430  SystemClock=8Mhz                                      
// Reset=RC in Board 
//P4.4  CS模擦组片选
//P4.5  SID 串行数据输入端
//P4.6  SCK 串行同步时钟,上升沿有效
//P4.7  PSB串口方式接低电平                                                     
//***************************************************************************


#include <msp430x16x.h>
#include "lcd.h"

unsigned char  AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      //第四行汉字位置
};

//全局的AC,记录光标的位置
char GlobeRow;
char GlobeCol;



//控制信号的430底层描述

/*******SCK 串行同步时钟设置*******************************/
void SCK(unsigned char sck)
{
  SCK_OUT;  
  if (sck==1) 
    SCK_H;
  if (sck==0)
    SCK_L;
		
}
/********************CS模擦组片选,高电平有效***********************************/
void CS(unsigned char cs)
{
    CS_OUT ;
    if (cs==1) 
      CS_H ;
  if (cs==0)
      CS_L;
}
/*********SID串行数据输出********************************/
void OUTSID(unsigned char out)
{
	SID_OUT;
	if (out==0)
		SID_L;
	if (out==1)
		 SID_H ;
		
}
/***********SID串行数据输入*******************************/
unsigned char  INSID()
{
	unsigned char temp;
	SID_IN;      // 设置SID串行数据输入方向
	temp=SID;   // 把输入的数据移到第0位,传给temp 
	return temp;
}





//串口发送一个字节
void LCD_SendByte(unsigned char Dbyte)
{
     unsigned char i;
     for(i=0;i<8;i++)
     {    
     	   unsigned char CY;

           SCK(0);//SCK = 0;
           CY=((Dbyte&0x80)>>7);
           Dbyte=Dbyte<<1;      //左移一位
           OUTSID(CY);//SID = CY;            //移出的位给SID
           SCK(1);//SCK = 1;
           SCK(0);//SCK = 0;
     }
}

//串口接收一个字节
//仅在读取数据的时候用到
//而读出的数据是一次只能读出4bit的
unsigned char LCD_ReceiveByte(void)
{
     unsigned char i,temp1,temp2;
     temp1=temp2=0;
     for(i=0;i<8;i++)
     {
           temp1=temp1<<1;
           SCK(0);//SCK = 0;
           SCK(1);//SCK = 1;            
           SCK(0);//SCK = 0;
           if(INSID()) temp1++;
     }
     for(i=0;i<8;i++)
     {
           temp2=temp2<<1;
           SCK(0);//SCK = 0;
           SCK(1);//SCK = 1;
           SCK(0);//SCK = 0;
           if(INSID()) temp2++;
     }
     return ((0xf0&temp1)+(0x0f&temp2));
}

void LCD_CheckBusy( void )
{
     do   LCD_SendByte(0xfc);      //11111,RW(1),RS(0),0
     while(0x80&LCD_ReceiveByte());      //BF(.7)=1 Busy
}

void LCD_WriteCommand( unsigned char Cbyte )
{
     CS(1);//CS = 1;
     LCD_CheckBusy();
     LCD_SendByte(0xf8);            //1111,1,RW(0),RS(0),0
     LCD_SendByte(0xf0&Cbyte);      //高四位
     LCD_SendByte(0xf0&Cbyte<<4);//低四位(先执行<<)
     CS(0);// CS = 0;
}

void LCD_WriteData( unsigned char Dbyte )
{
     CS(1);// CS = 1;
     LCD_CheckBusy();
     LCD_SendByte(0xfa);            //11111,RW(0),RS(1),0
     LCD_SendByte(0xf0&Dbyte);      //高四位
     LCD_SendByte(0xf0&Dbyte<<4);//低四位(先执行<<)
     CS(0);//CS = 0;
}

unsigned char LCD_ReadData( void )
{
     LCD_CheckBusy();
     LCD_SendByte(0xfe);            //11111,RW(1),RS(1),0
     return LCD_ReceiveByte();
}

void LCD_Delay(unsigned int MS)
{
     unsigned char us,usn;
     while(MS!=0)            //for 12M
           { usn = 2;
                 while(usn!=0)
                       {
                             us=0xf5;
                             while (us!=0){us--;};
                             usn--;
                       }
                 MS--;
           }
}



//文本区清RAM函数
void LCD_LcmClearTXT( void )
{
     unsigned char i;
     LCD_WriteCommand(0x30);      //8BitMCU,基本指令集合
     LCD_WriteCommand(0x80);      //AC归起始位
     for(i=0;i<64;i++)
        LCD_WriteData(0x20);
     LCD_WriteCommand(0x30);      //8BitMCU,基本指令集合
     LCD_WriteCommand(0x80);      //AC归起始位
}

//图形区和文本区显示在两个不同的RAM区
//图形区清RAM函数
void LCD_LcmClearBMP( void )
{
     unsigned char i,j;
     LCD_WriteCommand(0x34);      //8Bit扩充指令集,即使是36H也要写两次
     LCD_WriteCommand(0x36);      //绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)            //12864实际为256x32
     {
           LCD_WriteCommand(0x80|i);      //行位置
           LCD_WriteCommand(0x80);      //列位置
           for(j=0;j<32;j++)            //256/8=32 byte
                LCD_WriteData(0);
     }
}


void LCD_setAC(unsigned char  row,unsigned char col)   //设置光标的位置
{
	 GlobeRow=row; GlobeCol=col;
}


//显示一个字符串,row=-1和col=-1,接着上次显示完的地方开始显示,满四行清屏
void LCD_PutStr( int row, int col,unsigned char *puts) 
{
     unsigned char temp1=0xff;
     unsigned char temp2=1;
     LCD_WriteCommand(0x30);      //8BitMCU,基本指令集合
     if ((row==-1)||(col==-1))//若row=-1和col=-1,接着上次显示完的地方开始显示
     	{
          row=GlobeRow;
     	  col=GlobeCol;
     	 }
     LCD_WriteCommand(AC_TABLE[8*row+col]);      //起始位置
     
     while(*puts != '\0')      //判断字符串是否显示完毕
     {
           if(col==8)            //判断换行
           {            //若不判断,则自动从第一行到第三行
                 col=0;
                 row++;
           }
           if(row==4) 
           {
                row=0;
                LCD_LcmClearTXT();
           	/*LCD_PutStr(0,0,"                \0");
           	LCD_PutStr(1,0,"                \0");
           	LCD_PutStr(2,0,"                \0");  */
            }     //一屏显示完,回到屏左上角
           
           if(temp1)     {   //如果是第一个位置输入
               LCD_WriteCommand(AC_TABLE[8*row+col]);//写入待显示字符地址
               if((*puts)>=0xA1)  temp2=1;else temp2=0; //temp2=1为输入的是中文
           }else if((temp2==0)&&(*puts)>=0xA1)  {    //如果是第二个位置输入而且是中文字符的第一个字节,则写入一空格
                    LCD_WriteData(0x20);
                    col++; 
                    temp1=~temp1;
                     continue;
             }
           LCD_WriteData(*puts); 
           puts++;     
           temp1=~temp1;
           if(temp1)  col++; 
         
       }
     if(temp1=~temp1)  col++;
     GlobeRow=row; GlobeCol=col; //记录当前位置
     
}

//显示一个字符串,row=-1和col=-1,接着上次显示完的地方开始显示,满2行清屏

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -