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

📄 uop.c

📁 一些C51的源程序,KEY I2C LCD等.
💻 C
📖 第 1 页 / 共 3 页
字号:
void      AutoWriteData( uchar dat) ;
void      ClearScreen(unsigned int ram) ;
void      draw_dot(uchar x,uchar y,uchar mode);
void      WriteCmd1(unsigned char cmd); 
void      WriteCmd2(unsigned char dat,unsigned char cmd);
void      WriteCmd3(unsigned char dat1,unsigned char dat2,unsigned char cmd);
void      CursorPosSet(unsigned char x,unsigned char y) ;

unsigned char Cursor_X,Cursor_Y;        //光标的坐标
/************************************************************ 

                       指令代码定义 

************************************************************/ 
#define   CursorPointer    0x21          // 光标地址设置 
#define   OffsetReg        0x22          // CGRAM偏移地址设置 
#define   AddrSet          0x24          // 显示地址设置 
#define   TextHomeAddr     0x40          // 文本首地址 
#define   TextArea         0x41          // 文本宽度设置 
#define   GraHomeAddr      0x42          // 图形首地址设置 
#define   GraArea          0x43          // 图形宽度设置 
#define   OrMode           0x80          // 或模式显示 
#define   ExorMode         0x81          // 异或模式显示 
#define   AndMode          0x83          // 与模式显示 
#define   TextAttMode      0x84          // 文本属性模式 
#define   InterCGROM       0             // 内部CGROM 
#define   ExCGRAM          0x08          // 外部CGRAM 
#define   DisplayOff       0x90          // 显示关闭 
#define   CursorOn         0x92          // 光标显示,但不闪烁 
#define   CursorBlink      0x93          // 光标闪烁 
#define   TextOn           0x94          // 文本模式打开 
#define   GraOn            0x98          // 图形模式打开 
#define   TGAllOn          0x9c          // 文本图形模式都打开 
#define   DataAutoWrite    0xb0          // 数据自动写 
#define   DataAutoRead     0xb1          // 数据自动读 
#define   ExitAutoRW       0xb2          // 退出数据自动读写模式 
#define   DataWAddrI       0xc0          // 数据写,地址加1 
#define   DataWAddrD       0xc2          // 数据写,地址减1 
#define   DataWAddrNV      0xc4          // 数据写,地址不变 
#define   DataRAddrI       0xc1          // 数据读,地址加1 
#define   DataRAddrD       0xc3          // 数据读,地址减1 
#define   DataRAddrNV      0xc5          // 数据读,地址不变 
#define   ScreenPeek       0xe0          // 屏读 
#define   ScreenCopy       0xe1          // 屏拷贝 
#define   LineChar         32            // 设置宽度  
/******************************************************************************** 
函数名:    ReadSdate(void) 
函数功能: IOPORT输出数据并检查LCD忙数据。
返回数据:checkbusy
/********************************************************************************/ 
ReadSdate()
{  
    uchar   checkbusy; 
    LCD_BUS = 0xff;
    CD1=1;
    RD1=0;
    checkbusy=LCD_BUS;
    RD1=1; 
    return ( checkbusy );  
}
/******************************************************************************** 
函数名:    Void RWcheck() 
函数功能: 判断状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读,
           写数据之前这两个标志位必须同时为1 
/********************************************************************************/ 
void RWcheck(void)
{   
     uchar   databusy;
     do{   databusy=ReadSdate();}
while( !(databusy&0x03) );
}
/******************************************************************************** 
函数名:    Void AutoRcheck() 
函数功能: 判断状态位STA2的子程序(数据自动读状态),该位在数据自动读操作过程中
           取代STA0和STA1有效。在连续读过程中每读一次之前都要确认STA2=1
********************************************************************************/ 
void AutoRcheck(void)
{   
     uchar   databusy;
     do{databusy=ReadSdate(); }
while( !(databusy&0x04) ); 
}
/******************************************************************************** 
函数名: Void AutoWcheck() 
函数功能: 判断状态位STA3子程序(数据自动写状态) 
********************************************************************************/ 
void AutoWcheck(void)
{    
     uchar   databusy;
     do{databusy=ReadSdate(); }
while( !(databusy&0x08) );
}
/******************************************************************************** 
函数名:    Void WriteCmd1(uchar cmd)
           Void WriteCmd2(uchar dat1,uchar cmd)
           Void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
     Void WriteData(uchar dat)
函数功能: 写指令和写数据子程序
********************************************************************************/ 
void WriteData(uchar dat)
{   
RWcheck();
CD1=0;                 
LCD_BUS=dat;
WR1=0;
WR1=1;
}
void WriteCmd1(unsigned char cmd)
{
RWcheck();
CD1=1;       
LCD_BUS=cmd; 
WR1=0;       
WR1=1;       
}
void WriteCmd2(uchar dat,uchar cmd)
{
    WriteData(dat);   
    WriteCmd1(cmd);      
}
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
{       
    WriteData(dat1);  
    WriteData(dat2);
    WriteCmd1(cmd);   
}
void AutoWriteData( uchar dat)
{  
    AutoWcheck();
    CD1 = 0;    
    LCD_BUS= dat;
    WR1=0;
    WR1=1;
}
/********************************************************************************
函数名:   void lcd_init (void)
函数功能:LCD初始化设置
********************************************************************************/ 
void lcd_init (void)
{  
    WriteCmd3(0x00,0x00,0x40);   //文本首地址
    WriteCmd3(0x20,0x00,0x41);   //文本宽度设置
    WriteCmd3(0x00,0x00,0x42);   // 图形首地址
    WriteCmd3(0x20,0x00,0x43);   //设置图形宽度  
                                //即一行显示所占字节数
    WriteCmd1(0xa1);             //光标设置
    WriteCmd1(0x81);             //显示方式设置   逻辑“或”合成
    WriteCmd1(0x9f);             //显示开关
    Cursor_X=0x08;
    Cursor_Y=0x4f; 
    CursorPosSet(Cursor_X,Cursor_Y); 
    ClearScreen(0x2000); 
   }
/******************************************************************************** 
函数名: Void ClearScreen(unsigned int ram) 
函数功能: 清除整个屏幕 
     ram : 需要清零的单元数
********************************************************************************/ 
void ClearScreen(uint ram) 
{ 
     unsigned int i; 
                                                            // 清显示 RAM 区 0000h--2000h (8k) 
     WriteCmd3(0x00,0x00,0x24);                              // 设置指针地址0000H 
     WriteCmd1(0xb0);                                        // 设置自动写状态 
     for(i=0x00;i<ram;i++) AutoWriteData(0x00);                  // data=0; 
     WriteCmd1(0xb2);                                        // 自动写结束 
} 
/********************************************************************************
函数原型: void draw_dot(x,y)
功     能; T6963屏上打点
入口参数: 横坐标(x),枞坐标(y)
出口参数: 
********************************************************************************/ 
void draw_dot(uchar x,uchar y,uchar mode)
{   uchar dat11,dat22;
    uchar n,t;

    dat11=(y*32)%256 +x/8; 
    dat22=(y*32)/256;
    delay(20);
    WriteCmd3(dat11,dat22,0x24);
    if(mode)    n=0xf8;
    else        n=0xf0; 
    t=n|((~(x%8))&0x07);
    WriteCmd1(t);
}
/******************************************************************************** 
函数名: Void CursorPosSet(uchar X,uchar Y) 
函数功能:   光标位置设置 
********************************************************************************/ 
void CursorPosSet(unsigned char x,unsigned char y) 
{ 
    WriteCmd3(x,y,CursorPointer);          //X的取值范围0-20;Y的取值范围0-15; 
} 
/******************************************************************************** 
函数名: Void CursorUp() 
函数功能:   光标向上移动一格 
********************************************************************************/ 
void CursorUp() 
{ 
         if(Cursor_Y>0)Cursor_Y-=1;  
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorDown() 
函数功能:   光标向下移动一格 
********************************************************************************/ 
void CursorDown() 
{ 
         if(Cursor_Y<8)Cursor_Y+=1; 
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorRight() 
函数功能:   光标向右移动一格 
********************************************************************************/ 
void CursorRight() 
{ 
         if(Cursor_X<20)Cursor_X+=1; 
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorLeft() 
函数功能:   光标向左移动一格 
********************************************************************************/ 
void CursorLeft() 
{ 
         if(Cursor_X>0)Cursor_X-=1; 
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorEnter() 
函数功能:   光标换行
********************************************************************************/ 
void CursorEnter() 
{ 
    Cursor_X=0; 
    Cursor_Y+=1; 
    WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/********************************************************************************
函数原型: void delay(uchar t)
功     能; (1)延时 T*10 (2) 1MS*k
入口参数: (1) uchar t   (2)uint k
出口参数: 
********************************************************************************/ 
void delay(uchar t)
{ 
   uchar i,j;
   for(i=0;i<t;i++) {   for(j=0;j<10;j++);   }
}
void delay1(uint k)
{ 
   uchar j;
   while ((k--)!=0) {   for (j=0;j<125;j++);}
}
/******************************************************************************** 
函数名:Void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode) 
函数功能:显示一个汉字(16*16点阵)
           column:汉字起始列(0-30) (240/8=30)
           lin: 汉字起始行(0-7)     (128/16=8)
        hzcode: 汉字代码(自定义的) 
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/ 
void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode) 
{ 
     unsigned char temp1,temp2; 
     unsigned int StartAddr; 
     unsigned char i=0;
     unsigned int * temp;
     temp=&HZK16x16[hzcode][0];
     StartAddr=16*lin*LineChar+ column;        //定位起始行
     for(i=0;i<16;i++) 
     { 
       WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet); 
       temp1=HZK16x16[hzcode][i*2+*temp];
       WriteCmd2(temp1, DataWAddrI);              // 左半部 地址加一 
       temp2=HZK16x16[hzcode][i*2+1+*temp]; 
       WriteCmd2(temp2, DataWAddrNV);             // 右半部 显示地址不变
       StartAddr=StartAddr + LineChar;            // 换到下一行
     } 
} 
//***********************************************************
//         主函数
//***********************************************************
main()
{ /*
   uchar   x;
   uchar   m;
   
   
      for(x=0;x<240;x++)
      {
        draw_dot(2*x,94,1);
        draw_dot(2*x,47,1);
        draw_dot(2*x,0,1);
       }
       for(m=0;m<128;m++)
       {
         draw_dot(0,m*2,1);
         draw_dot(239,m*2,1);
         draw_dot(120,m*2,1);
          }*/
          
      lcd_init();    
         CursorPosSet(15,2);
        ShowHZ16x16(12,1, 2);
        ShowHZ16x16(12,2, 0);
//        ShowHZ16x16(10,7, 0x03);
//        ShowHZ16x16(12,7, 0x04);
//        ShowHZ16x16(15,6, 0x05);
//        ShowHZ16x16(17,6, 0x16);-
//        ShowHZ16x16(15,7, 0x17);
//        ShowHZ16x16(17,7, 0x18);
    while(1);
}
 




//   TGLCMLIMIT64A接口程序(模拟方式)
/***************************************************************************
;连线图:
;*LCM---89C52*  *LCM---89C52*   *LCM-------89C52*     *LCM----------89C52* *
;*DB0---P0.0*   *DB4---P0.4*    *D/I-------P2.6*      *CS1----------P2.4*  *
;*DB1---P0.1*   *DB5---P0.5*    *R/W-------P2.7*      *CS2----------P2.5*  *
;*DB2---P0.2*   *DB6---P0.6*    *RST--------VCC*      *CS3----------P3.2*  * 
;*DB3---P0.3*   *DB7---P0.7*    *E---------P2.3*                           *
;注:89C52的晶振频率为12MHz                                                 *
***************************************************************************/

⌨️ 快捷键说明

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