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

📄 240128._c

📁 用ATmega88驱动LCD240128
💻 _C
字号:
/*******************************************************************************
                           T6963C液晶驱动 RT240128
                              MAGE88 16M
*******************************************************************************/
#include <iom88v.h>
#include <macros.h>
#include "240128.h"
#include "storeroom.h"
const unsigned char  turnf[8] = {7,6,5,4,3,2,1,0};
unsigned char gCurRow,gCurCol;
/*******************************************************************************
 状态位STA1,STA0判断读写指令和读写数据,在读写数据或者写入命令前必须保证均为1。 
*******************************************************************************/
unsigned char fnSTA01(void)
{
    if( (LCD_RD_STATUS() & 0x03) == 0x03 )    return(0);
	else                                      return(1);
}
/*******************************************************************************
 状态位STA2,如果STA2=1 为自动读状态
*******************************************************************************/
unsigned char fnSTA2(void)
{
    if( (LCD_RD_STATUS() & 0x04) == 0x04 )    return(0);
    else                                      return(1);
}
/*******************************************************************************
 状态位STA3 如果STA3 = 1 数据自动写状态
*******************************************************************************/
unsigned char fnSTA3(void)
{
    if( (LCD_RD_STATUS() & 0x08) == 0x08 )    return(0);
    else                                      return(1);
}
/*******************************************************************************
 状态位STA6 如果STA6 =1 屏读/屏拷贝状态
*******************************************************************************/
unsigned char fnSTA6(void)
{
    if( (LCD_RD_STATUS() & 0x40) == 0x40 )    return(0);
    else                                      return(1);
}
/*******************************************************************************
 读LCD状态
*******************************************************************************/
unsigned char LCD_RD_STATUS(void)
{
    unsigned char temp;
    LCD_DDR = 0x00;
    LCD_CD_H;
    LCD_RD_L;
	NOP();NOP();NOP();
    temp = LCD_DATA;
    LCD_RD_H;
    LCD_DDR = 0xFF;
    return(temp);
}
/*******************************************************************************
 读LCD数据
*******************************************************************************/
unsigned char LCD_RD_DATA(void)
{
    unsigned char temp;
    LCD_DDR = 0x00;
    LCD_CD_L; 
    LCD_RD_L;
	NOP();NOP();NOP();
    temp = LCD_DATA;
    LCD_RD_H;
    LCD_DDR = 0xFF;
    return(temp);
}
/*******************************************************************************
 写数据 
*******************************************************************************/
void LCD_WR_DATA(unsigned char data)
{
    while( fnSTA01() );	
	LCD_CD_L;
    LCD_WR_L;
  //LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
    LCD_PORT = data;
    LCD_WR_H;
}
/*******************************************************************************
 写无参数命令 
*******************************************************************************/
void LCD_WR_CODE(unsigned char code)
{
    while( fnSTA01() );	
    LCD_CD_H;
    LCD_WR_L;
  //LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
    LCD_PORT = code;
    LCD_WR_H;
}
/*******************************************************************************
 写单参数的指令 
*******************************************************************************/
void LCD_WR_CODE1(unsigned char code, unsigned char data1)
{    
    LCD_WR_DATA(data1);
    LCD_WR_CODE(code);    
}
/*******************************************************************************
 写双参数的指令 
*******************************************************************************/
void LCD_WR_CODE2(unsigned char code, unsigned char data1, unsigned char data2)
{    
    LCD_WR_DATA(data1);
    LCD_WR_DATA(data2);
    LCD_WR_CODE(code);    
}
/*******************************************************************************
 初始化LCD 
*******************************************************************************/
void LCD_INIT(void)
{
    LCD_WR_CODE(LCD_MOD_OR);
    LCD_WR_CODE(0x98);                  //打开图形显示
    LCD_WR_CODE2(LCD_TXT_STP,0,0);
    LCD_WR_CODE2(LCD_TXT_WID,30,0);
    LCD_WR_CODE2(LCD_GRH_STP,0,0);
    LCD_WR_CODE2(LCD_GRH_WID,30,0);
}
/*******************************************************************************
 清整屏 
*******************************************************************************/
void LCD_CLEAR(unsigned char data)
{
    unsigned char i,j;
    LCD_WR_CODE(0x98);                  //打开图形显示
    LCD_WR_CODE2(LCD_ADD_POS,0,0);
    LCD_WR_CODE(LCD_AUT_WR);
    for(i=0;i<128;i++)
    {
        for(j=0;j<30;j++)
        {
            LCD_WR_DATA(data);
        }
    }                               
    LCD_WR_CODE(LCD_AUT_OVR);
}
/*******************************************************************************
 显示一个240*128的图片 图片的大小为3840 。
*******************************************************************************/
void PRINT_240128(const unsigned char *str)
{
    unsigned char i,j;
    LCD_WR_CODE(0x98);
    LCD_WR_CODE2(LCD_ADD_POS,0,0);
    LCD_WR_CODE(LCD_AUT_WR);
    for(i=0;i<128;i++)
    {
        for(j=0;j<30;j++)
        {
            LCD_WR_DATA(*str++);
        }
    }
    LCD_WR_CODE(LCD_AUT_OVR);
}
/*******************************************************************************
 设置当前地址,用于起点定位。
*******************************************************************************/
void LCD_SET_ADD(unsigned char urow, unsigned char ucol)
{
    LCD_WR_CODE2(LCD_ADD_POS,(urow*30+ucol) & 0xFF,(urow*30+ucol) / 256);
    gCurRow = urow;
    gCurCol = ucol;
}
/*******************************************************************************
 ASCII(8*16) 及 汉字(16*16) 显示函数,ASCII与汉字区别在于128做分界。
*******************************************************************************/
void PRINT_words (unsigned char x,unsigned char y, char *ptr)
{
    unsigned char length=0,i=0,j=0,uRow=0,uCol=0;
    unsigned int  k=0;
	uRow = y;
    uCol = x;	            	
	LCD_SET_ADD(uRow*16,uCol);      //起点定位

	
    while (ptr[length]!=0)            //探测字串长度
    {
	  length++;
    }		
    while(i<length)//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
    {
	    uRow = gCurRow;    
    	uCol = gCurCol;			
    	if(ptr[i] <= 128)//ASCII
      	{
            for(j=0;j<16;j++)
            {
                LCD_WR_CODE(LCD_AUT_WR);
                LCD_WR_DATA(ASC_MSK[(ptr[i]-0x20)*16+j]);
                LCD_WR_CODE(LCD_AUT_OVR);
                LCD_SET_ADD(uRow+j+1,uCol);
            }
            uCol += 1;
        }
    	else//中文
      	{
            for(j=0;j<sizeof(GB_16x16)/sizeof(GB_16x16[0]);j++)  	// 查找定位
            {
                if(ptr[i] == GB_16x16[j].Index[0] && ptr[i+1] == GB_16x16[j].Index[1])
                {
                    break;
                }	
            }
            for(k=0;k<sizeof(GB_16x16[0].Msk)/2;k++)
            {
                LCD_SET_ADD(uRow+k,uCol);
        	    LCD_WR_CODE(LCD_AUT_WR);      		// 写数据
        	    if(j < sizeof(GB_16x16)/sizeof(GB_16x16[0]))
          	    {
          	        LCD_WR_DATA(GB_16x16[j].Msk[k*2]);
          	        LCD_WR_DATA(GB_16x16[j].Msk[k*2+1]);
          	    }
        	    else   		// 未找到该字
          	    {
          	        if(k < sizeof(GB_16x16[0].Msk)/4)
            	    {
                        LCD_WR_DATA(0x00);
            		    LCD_WR_DATA(0x00);
            	    }
         	        else
            	    {
            		    LCD_WR_DATA(0xff);
			            LCD_WR_DATA(0xff);
            	    }
                }
        	    LCD_WR_CODE(LCD_AUT_OVR);
            }
      	    uCol += 2;
      	    i++;
        }		
    	if(uCol >= 30)      					// 光标后移
      	{
      	    uRow += 16;
            if(uRow < 0x80)
            {
                uCol -= 30;
            }
      	    else
            {
        	uRow = 0;
        	uCol = 0;
            }
      	 }
         LCD_SET_ADD(uRow,uCol);
    	 i++;
    }
}
/*******************************************************************************
 画点
*******************************************************************************/
void PRINT_point(unsigned char x,unsigned char y,unsigned char s)
{
    unsigned char x1;
    x1 = x >> 3; // 取Y方向分页地址
    LCD_SET_ADD(y,x1); // 起点定位
    x1 = turnf[ x & 0x07 ];
    x1 = 0xF0 | x1 | s; // 字节内位置计算
    LCD_WR_CODE(x1); // 画上屏幕S显示属性8 画点0 擦除点
}
/*******************************************************************************
 画线任意方向的斜线,直线数学方程aX+bY=1
*******************************************************************************/
void PRINT_line(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)
{
    register unsigned char t;
    int xerr = 0,yerr = 0;
    int delta_x,delta_y,distance;
    int incx,incy,uRow,uCol;
    delta_x = xt-x0; // 计算坐标增量
    delta_y = yt-y0;
    uRow = x0;
    uCol = y0;
    if(delta_x>0)
    {
        incx = 1; // 设置单步方向
    }
    else if( delta_x==0 )
    {
        incx=0; // 垂直线
    }
    else
    {
        incx = -1;
        delta_x = -delta_x;
     
    }
    if(delta_y>0)
    {
        incy=1;
    }
    else if( delta_y==0 ) 
    {
        incy=0; // 水平线
    }
    else 
    {
        incy=-1;
        delta_y=-delta_y;
    }
    if( delta_x > delta_y ) 
    {
        distance=delta_x; // 选取基本增量坐标轴
    }
    else 
    {
        distance=delta_y;
    }
    for( t=0;t <= distance+1; t++ )   // 画线输出
    { 
        PRINT_point(uRow,uCol,s); // 画点
        xerr += delta_x;
        yerr += delta_y;
        if( xerr > distance )
        {
            xerr -= distance;
            uRow += incx;
        }
        if( yerr > distance )
        {
            yerr -= distance;
            uCol += incy;
        }
    }
}
/*******************************************************************************
 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2
*******************************************************************************/
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s)
{
    unsigned int xx,rr;
    unsigned int xt,yt;
    unsigned int rs,row,col;
    yt = Rx;
    rr = (unsigned int)Rx*Rx+1; // 补偿1 修正方形
    rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
    for (xt=0;xt<=rs;xt++)
    {
        xx = xt*xt;
        while ((yt*yt)>(rr-xx))
        {
            yt--;
        }
        row = Ox+xt; // 第一象限
        col = Oy-yt;
        PRINT_point(row,col,s);
        row = Ox-xt; // 第二象限
        PRINT_point(row,col,s);
        col = Oy+yt; // 第三象限
        PRINT_point(row,col,s);
        row = Ox+xt; // 第四象限
        PRINT_point(row,col,s);
        /***************45度镜象画另一半***************/
        row = Ox+yt; // 第一象限
        col = Oy-xt;
        PRINT_point(row,col,s);
        row = Ox-yt; // 第二象限
        PRINT_point(row,col,s);
        col = Oy+xt; // 第三象限
        PRINT_point(row,col,s);
        row = Ox+yt; // 第四象限
        PRINT_point(row,col,s);
    }
}

⌨️ 快捷键说明

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