📄 1602.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 + -