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

📄 1602.c

📁 一个可以直接用的1602.c程序。在程序中可以以头文件形式进行调用函数
💻 C
字号:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/portpins.h>
#include <compat/deprecated.h>

#define uchar unsigned char 

#define busy     (datapin&(1<<7))  //非0--忙,0--不忙
/*************************
cgram是存储字节的地址
ddram是显示字节的地址
1602之所以是字符显示是因为他读入的数据是asc码
现在的问题是如何实现多字符的写入和读出cgram
**********************/



/*定义引脚*/
#define dataport PORTB

#define datapin PINB

#define dataddr DDRB

#define ctlport PORTA

#define ctlddr DDRA



#define LCD_E_0 cbi(ctlport,7)  

#define LCD_RW_0 cbi(ctlport,6)      

#define LCD_RS_0 cbi(ctlport,5)       

#define LCD_E_1 sbi(ctlport,7)        

#define LCD_RW_1 sbi(ctlport,6)       

#define LCD_RS_1 sbi(ctlport,5) 
zifu[]={0x1E,0x11,0x11,0x1E,0x14,0x12,0x11};
unsigned char *flag;   
unsigned char ben,ben1,num;//ben是返回余数,ben1是返回的求整数,num是整数的长度
unsigned char lenth;//小数的位数


void com(uchar init)   //写指令

{  
    
    LCD_RS_0; 
	LCD_E_0 ;     
    dataport=init;    
    _delay_ms(5);
    LCD_E_1;    
    //LCD_E_0;
    
}

 

void Dat(uchar dat)     //写数据

{  
    
    LCD_RS_1;      
    LCD_E_0   ;
    dataport=dat;
    
    _delay_ms(5);
    
    LCD_E_1;
    
    //LCD_E_0;
    
}
unsigned char  CGRAMtab[]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}; //度的符号
unsigned char  CGRAMtab1[]={0x00,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x31};
void  LCD_WriteCGRAM(unsigned char *cgram,unsigned char len)  //自定义字符写入CGRAM函数,在lcdinit函数中调用
{  
	unsigned char i ;
    for (i = 0 ; i< len ; i++)       
    Dat(*(cgram+i)) ;        
}

void lcdclear(void)
{
	com(0x01);
}


void display(uchar x,uchar y,uchar dat)   //精确显示字符,x为列坐标,y为行坐标,dat数据

{   //while (busy!=0);  
    uchar add;
    
    if(y==0)
    
    add=0x80+0x00+x;
    
    else
    
    add=0x80+0x40+x;
    
    com(add);
    
    Dat(dat);
    
}           

 

void Init(void)    //液晶屏初始化

{   
    
    com(0x38);//设置显示模式2行5*7   
    _delay_ms(5);
    com(0x38);
    com(0x38);
    com(0x06);//文字不动,光标右移动  
    com(0x0c);//屏显模式,光标设置  
    com(0x01);//清屏  
	//com(0x40) ;  //写CGRAM
    //LCD_WriteCGRAM(CGRAMtab,8);
	com(0x41) ;  //写CGRAM
	LCD_WriteCGRAM(CGRAMtab1,9);
}
//测量字符串的长度
uchar survey(uchar *chars)
{
 uchar i;
 for(i=0;chars[i]!='\0';i++);
 return i;
}
//逐个显现字符串,第一行可以延续到下行,第二行会溢出;
void displays1(uchar x,uchar y,uchar *chars)
{uchar i;
 uchar num;
 num=survey(chars);
 for(i=0;i<num;i++)
 {if(x+i>16)
  {
   if (y==0)
   {
   display(x+i-16,1,chars[i]);
   }
  }
  else
  {
  display(x+i,y,chars[i]);
  }
 }
 
}
//第一行也会溢出
void displays2(uchar x,uchar y,uchar *chars)
{uchar i;
 uchar num;
 num=survey(chars);
 for(i=0;i<num;i++)
 {
  display(x+i,y,chars[i]);
 }
 
}
//数据的长度
void datalenth(int x)
{
  if(x/10==0) //为什么if(x/10==0)不行呢?又行了。。
  num=1;
 
  else if(x/100==0)
 
  num=2;
 
 else if(x/1000==0)
 
  num=3;
 
 else if(x/10000==0)
 
  num=4;
 
 else if(x/100000==0)
 
  num=5;
 

 
}
//求余数运算
void yushu(int x,int len )
{
 switch(len)
 {
  case 1: ben=x; break;
  case 2: ben=x%10; break;
  case 3: ben=x%100;break;
  case 4: ben=x%1000;break;
  case 5: ben=x%10000;break;
 }
}
//取整
void quzheng(int x,int len )
{
 switch(len)
 {
  case 1: ben1=x; break;
  case 2: ben1=x/10; break;
  case 3: ben1=x/100;break;
  case 4: ben1=x/1000;break;
  case 5: ben1=x/10000;break;
 }
 
}
//数据字符化处理
void processdata(int x)
{
 int i;
 datalenth(x);
 for (i=num;i>0;i--)
 {
  quzheng(x,i);
  flag[i-1]=ben1;
  yushu(x,i);
  x=ben;
 }
 
 
}
//显示整型数字(注意整型数范围<32767)
void displaydata(uchar x,uchar y,int a)//显示一位时带前导零
{

 int i;
 processdata(a);
 {
  for (i=0;i<num;i++)
  {
   display(x+i,y,flag[num-1-i]+0x30);
  }
 }
}
//显示小数
void displayfloatdata(uchar x,uchar y,float a)
{
 int t;
 if (a<32.767)//显示三位小数
 {
  int b;
  t=a;//将小数整型化。
  displaydata(x,y,t);
  display(x+num,y,'.');
  b=num+1;//b的作用是记忆'.'的位置
  t=(a-t)*1000;
  displaydata(x+b,y,t);
 }
 else if(a<327.67)//显示两位小数
 {
  int b;
  t=a;//将小数整型化。
  displaydata(x,y,t);
  display(x+num,y,'.');
  b=num+1;//b的作用是记忆'.'的位置
  t=(a-t)*100;
  displaydata(x+b,y,t);
 }
 else if(a<3276.7)//显示一位小数
 {
  int b;
  t=a;//将小数整型化。
  displaydata(x,y,t);
  display(x+num,y,'.');
  b=num+1;//b的作用是记忆'.'的位置
  t=(a-t)*10;
  display(x+b,y,t+0x30);//显示一位不带前导零
 }
}
zizhizifu()
{
	uchar i;
	com(0x10);// write data to cgram
	for(i=0;i<7;i++)
	{
		Dat(0x80+zifu[i]);
	}
	
}



int main(void)

{        
    ctlddr = 0xff;         //初始化引脚  
    ctlport=0X00;  
    dataddr= 0Xff;
	dataport=0X00;        
    Init();

	
 /* for (i=0;i<16;i++)
 {
  display(i,0,0x41+i);  //显示1602库中自带符号A...
 } 
 for (i=0;i<16;i++)
 {
  display(i,1,0x30+i);  //显示1602库中自带符号1...
 }  */
 displays2(3,0,"12345");
 lcdclear();
 displaydata(0,1,2) ;
 displayfloatdata(6,1,3002.1);
 display(0,0,0);
 //display(1,0,1);
 while(1);
}

⌨️ 快捷键说明

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