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

📄 lcd.c

📁 一款类linux的操作系统源码
💻 C
字号:

#include <lcd.h>
#include <ctype.h>
#include <intr.h>
#include <mutex.h>

unsigned char col = 0;
unsigned char line = 0;
unsigned char page = 7;
unsigned char startline = 0;
struct mutex lcdmutex;

extern const unsigned char fontdata_8x8[];
//extern const unsigned char fontdata_12x12[];

void lcd_reset()                       // 复位lcd
{
     char i=0;
     
     LCD_RES_OUT();	            // 使 LCD_RES 引脚为输出状态
	 
	 	     
     LCD_RES_0();	                     // LCD_RES = 0
	 	 
     for(i=0;i<10;i++);                // 延时
     
     LCD_RES_1();                      // LCD_RES = 0
}

unsigned char 
lcd_read_status()                      // 读出lcd的状态
{
     return(LCD_STATUS_REG); 
}


void lcd_set_contrast(unsigned char i) // i <= 63,设置灰度
{
     LCD_COMMAND_REG = LCD_CONTRAST;
     
     LCD_COMMAND_REG = i&0x3f;       
}

void lcd_set_startline(unsigned char i) // i <= 63 设置行
{
     LCD_COMMAND_REG =0x40 + (i & 0x3f);
}

void lcd_set_ratio(unsigned char i)    // i <= 7,设置反馈电阻值
{
     LCD_COMMAND_REG = (0x20+(i&0x07));
}


void lcd_cls()                         // 液晶清屏
{
    unsigned char i,j;
	    
    for(i=0;i<=8;i++)
    {
       LCD_COMMAND_REG = 0XB0+i;       // 设置行
       LCD_COMMAND_REG = 0X10;         // 设置列h
       LCD_COMMAND_REG = 0X00;         // 设置列l

       for(j=0;j<132;j++)
          {
             LCD_DATA_REG = 0x00;      // 写显示数据
          }          
    }
    
    col = 0;
    line = 0;
    page = 7;
    
    lcd_set_page(page);
    lcd_set_col(STARTCOL);
    
    lcd_write_char('>');
}


void lcd_set_col(unsigned char i)
{
     LCD_COMMAND_REG = i % 16;
     LCD_COMMAND_REG = 0x10 + i /16;
}


void lcd_set_page(unsigned char i)
{
     LCD_COMMAND_REG = 0xB0 + (i & 0x07);
}

void lcd_init()                        // 液晶初始化
{
     lcd_reset();  

     lcd_power_on();
        
     lcd_set_ratio(0x03);              // 设置反馈电阻
    
     lcd_set_contrast(20);             // 设置灰度

     lcd_cls();
          
     lcd_display_on();
     
     mutex_clear(&lcdmutex);
}

void lcd_write_char(unsigned char i)   // 往lcd中写入英文字模
{
     unsigned char j;
     
     lcd_scroll();
     
     for(j=0;j<8;j++)
        {
           LCD_DATA_REG = fontdata_8x8[(i * 8) + j];    
        }   
        
     col = col + 1;    
}


void lcd_scroll()
{
     unsigned char i;
     
     if(col == COLS )
       {
          col = 0;
          line = line + 1;
          lcd_set_col(STARTCOL);
          
          if(line == LINES)
            {
              line = 7;
              
              if(startline == 0)
                {
                   startline = 64;
                   page = 8;
                }
                
              startline = startline -8;            
              lcd_set_startline(startline);      
            }
            
          if(page == 0)
            {
               page = LINES;
            }
            
          page = page - 1;
          
          lcd_set_page(page);            
          
          for(i=0;i<132;i++)LCD_DATA_REG = 0X00;
          
          lcd_set_col(STARTCOL);	     	     
       }      
}


void lcd_backspace()
{
     if(col != 0) 
       {
          col--;
       }
     else 
       {
          if(line != 0)
            {
               line--;
               page++;
               col = COLS -1;
               if(page == LINES)page = 0;
            }
       } 
        
     lcd_set_page(page);
     lcd_set_col(col * 8 + STARTCOL);
}

void lcd_put(char c)
{
     unsigned char i;

     mutex_lock(&lcdmutex);
     
     if (isprint(c)) {    
        
         lcd_write_char(c); 
         
     } else if (c == '\n') {
      
         col = COLS;
	     lcd_scroll();
	     
         for(i=0;i<8;i++)LCD_DATA_REG = fontdata_8x8['>' * 8 + i];
         for(i=8;i<132;i++)LCD_DATA_REG = 0X00;         
         
         col = col +1;
         lcd_set_col(STARTCOL + 8);
          
	 } else if (c == '\b') {
		 
		 lcd_backspace();
     }
     
     mutex_unlock(&lcdmutex);
}


void lcd_put_xy(char x, char y, char z)
{
     
     mutex_lock(&lcdmutex);
     col = y;
     lcd_set_col(y);
     lcd_write_char(z); 
     mutex_unlock(&lcdmutex);
}

/*
void lcd_write_hz(char * s)
{
     char i;
     unsigned long d;
     unsigned short c;

     //c =(unsigned short)*s;
     
     //s +=2;
     
     //d = (c - 0xa1a1)*24;
     
     d= 36;
     
     for(i=0;i<12;i++)
        {
           LCD_DATA_REG = fontdata_12x12[d + i];
        }
        
}
*/

⌨️ 快捷键说明

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