标题:
单片机怎么把LCD1602程序在LCD12864里实现?
[打印本页]
作者:
zxcv159
时间:
2022-5-7 21:55
标题:
单片机怎么把LCD1602程序在LCD12864里实现?
求大佬给段代码参考一下,或者给个思路,实在是想不出来了。
#ifndef _LCD_12864
#define _LCD_12864
/*****************************预定义**************************************/
#define uchar unsigned char
#define uint unsigned int/***************************12864管脚配置****************************/
#define port P2
sbit rs=P3^0;
sbit rw=P3^1;
sbit e=P3^2;
sbit cs1=P3^3;
sbit cs2=P3^4;
/********************************************************************************************
* 函数名称:Delay()
* 功 能:延迟时间=a*1ms
* 入口参数:
* 出口参数:无
*********************************************************************************************/
void Delay(uint a)
{
uchar i;
while(a--)
for(i=0;i<125;i++);
}
/********************************************************************************************
* 函数名称:Lcd_Display_On()
* 功 能:LCD显示开
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Display_On()
{
port=0x3f;
rs=0;
rw=0;
e=1;
e=0;
}
/********************************************************************************************
* 函数名称:Lcd_Display_Off()
* 功 能:LCD显示关
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Display_Off()
{
port=0x3e;
rs=0;
rw=0;
e=1;
e=0;
}
/********************************************************************************************
* 函数名称:Lcd_Set_X(uchar x)
* 功 能:LCD设置X坐标
* 入口参数:x
* 出口参数:无
*********************************************************************************************/
void Lcd_Set_X(uchar x)
{
port=0xb8|x;
rs=0;
rw=0;
e=1;
e=0;
}
/********************************************************************************************
* 函数名称:Lcd_Set_Y(uchar y)
* 功 能:LCD设置Y坐标
* 入口参数:y
* 出口参数:无
*********************************************************************************************/
void Lcd_Set_Y(uchar y)
{
port=0x40|y;
rs=0;
rw=0;
e=1;
e=0;
}
/********************************************************************************************
* 函数名称:Lcd_Set_X_Y(uchar x, uchar y )
* 功 能:LCD设置x y坐标
* 入口参数:x y
* 出口参数:无
*********************************************************************************************/
void Lcd_Set_X_Y(uchar x, uchar y)
{
if( y<64 )
{ cs1=1; cs2=0; Lcd_Set_Y( y ); }
else
{ cs1=0; cs2=1; Lcd_Set_Y( y-64 ); }
Lcd_Set_X( x);
}
/********************************************************************************************
* 函数名称:Lcd_Write_Command()
* 功 能:写指令代码
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
/*void Lcd_pos(uchar x,uchar y)
{
uchar pos;
switch(x)
{
case 0:x=0x80;break;
case 1:x=0x90;break;
case 2:x=0x88;break;
case 3:x=0x98;break;
default:break;
}
pos=x+y;
}
/********************************************************************************************
* 函数名称:Lcd_Write_Command()
* 功 能:写指令代码
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Write_Command(uchar temp)
{
port=temp;
rs=0;
rw=0;
e=1;
e=0;
}
/********************************************************************************************
* 函数名称:Lcd_Write_Byte()
* 功 能:写数据
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Write_Byte(uchar temp)
{
port=temp;
rs=1;
rw=0;
e=1;
e=0;
}
/****************************************************************************
*名称:Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )
*功能:显示16X8字符(字母)
*入口参数:
*出口参数:
*说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示
****************************************************************************/
void Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )
{
uchar i , j,temp;
temp=y;
if( bit_flag )
{
for( i=0; i<2; i++ )
{
x+=i;
y=temp;
for( j=0;j<8;j++ )
{
Lcd_Set_X_Y( x, y ); y++;
Lcd_Write_Byte( point[ i*8 + j] );
}
}
}
else
{
for( i = 0; i < 2; i++ )
{
x += i;
y = temp;
for( j = 0; j < 8; j++ )
{
Lcd_Set_X_Y( x, y ); y++;
Lcd_Write_Byte( ~point[ i * 8 + j ] );
}
}
}
}
/****************************************************************************
* 名称:Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
* 功能:显示16*16字符(汉字)
* 入口参数:x y data
* 出口参数:无
*说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示
****************************************************************************/
void Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
{
uchar i,j,temp ;
temp=y;
if( bit_flag )
{
for( i=0; i<2; i++ )
{
x+=i;
y=temp;
for( j=0;j<16;j++ )
{
Lcd_Set_X_Y( x, y ); y++;
Lcd_Write_Byte( point[ i*16 + j] );
}
}
}
else
{
for( i = 0; i<2; i++ )
{
x += i;
y = temp;
for( j = 0; j < 16; j++ )
{
Lcd_Set_X_Y( x, y ); y++;
Lcd_Write_Byte( ~ point[ i * 16 + j ] );
}
}
}
}
/****************************************************************************
* 名称:Lcd_Clear(void)
* 功能:清屏
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Lcd_Clear()
{
uchar i,j;
cs1=1;cs2=1;
for(i=0;i<8;i++)
{
Lcd_Set_X( i );
Lcd_Set_Y( 0 );
for(j=0;j<64;j++)
Lcd_Write_Byte(0x00);
}
}
/*******************************************************************************************
* 函数名称:Lcd_Initial()
* 功 能:初始化LCD
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Lcd_Initial()
{
Lcd_Display_Off();
Lcd_Write_Command(0xb8); //Page_Add
Lcd_Write_Command(0x40); //Col_Add
Lcd_Write_Command(0xc0); //Start_Line
Lcd_Display_On();
Lcd_Clear();
}
/****************************************************************************
* 名称:Lcd_Time(uchar * clock_time )
* 功能:显示时间
* 入口参数:无
* 出口参数:无
* 说明 : 时间数组 BCD 码形式
****************************************************************************/
void Lcd_Time(uchar * clock_time )
{
uchar i=0;
//显示 "hour时min分sec秒"
i= * clock_time >> 4;
Lcd_Character_16X8( 1, 0, 80, letter_logo[i]); //显示 sec的高位
i= * clock_time & 0x0f;
Lcd_Character_16X8( 1, 0, 88, letter_logo[i]); //显示 sec的低位
Lcd_Character_16X16( 1, 0, 96 , time_logo[2]); //显示 秒
clock_time ++;
i= * clock_time >> 4;
Lcd_Character_16X8( 1, 0, 48, letter_logo[i]); //显示 min的高位
i= * clock_time & 0x0f;
Lcd_Character_16X8( 1, 0, 56, letter_logo[i]); //显示 min的低位
Lcd_Character_16X16( 1, 0, 64 , time_logo[1]); //显示 分
clock_time ++;
i= * clock_time >> 4;
Lcd_Character_16X8( 1, 0, 16 , letter_logo[i]); //显示 hour的高位
i= * clock_time & 0x0f;
Lcd_Character_16X8( 1, 0, 24 , letter_logo[i]); //显示 hour的低位
Lcd_Character_16X16( 1, 0, 32 , time_logo[0]); //显示 分
}
/****************************************************************************
* 名称:Lcd_Data(uchar * clock_time )
* 功能:显示日期
* 入口参数:无
* 出口参数:无
* 说明 : 时间数组 BCD 码形式
****************************************************************************/
void Lcd_Week( uchar week )
{
Lcd_Character_16X16( 1, 6, 0, week_logo[7] ); //星
Lcd_Character_16X16( 1, 6, 16, week_logo[8] ); //期
Lcd_Character_16X16( 1, 6, 32, week_logo[ week & 0x0f ] );
}
/******************************************************************************
* 函数名称: Lcd_Clock( uchar *clock_time )
* 功能: 显示时钟
* 入口参数: 时钟地址
* 出口参数: 无
********************************************************************************/
void Lcd_Clock( uchar * clock_time )
{
Lcd_Time( clock_time ); //显示时间
}
/******************************************************************************
* 函数名称: Lcd_welcome()
* 功能: 显示欢迎语
* 入口参数: 无
* 出口参数: 无
********************************************************************************/
void Lcd_welcome()
{
Lcd_Character_16X16( 1,2, 32, chushi_logo[0] );
Lcd_Character_16X16( 1,2, 48, chushi_logo[1] );
Lcd_Character_16X16( 1,2, 64, chushi_logo[2] );
Lcd_Character_16X16( 1,2, 80, chushi_logo[3] );
Lcd_Character_16X16( 1,5, 32, chushi_logo[4] );
Lcd_Character_16X16( 1,5, 48, chushi_logo[5] );
Lcd_Character_16X16( 1,5, 64, chushi_logo[6]);
Lcd_Character_16X16( 1,5, 80, chushi_logo[7] );
}
/******************************************************************************
* 函数名称: Lcd_welcome()
* 功能: 显示欢迎语
* 入口参数: 无
* 出口参数: 无
********************************************************************************/
void Lcd_dsgt()
{
Lcd_Character_16X8(1,2,0,letter_logo[1]);
Lcd_Character_16X8(1,2,8,letter_logo[10]);
Lcd_Character_16X8(1,2,16,letter_logo[5]);
Lcd_Character_16X8(1,2,24,letter_logo[13]);
Lcd_Character_16X8(1,2,32,letter_logo[2]);
Lcd_Character_16X8(1,2,40,letter_logo[10]);
Lcd_Character_16X8(1,2,48,letter_logo[6]);
Lcd_Character_16X8(1,2,56,letter_logo[13]);
Lcd_Character_16X8(1,2,64,letter_logo[3]);
Lcd_Character_16X8(1,2,72,letter_logo[10]);
Lcd_Character_16X8(1,2,80,letter_logo[7]);
Lcd_Character_16X8(1,2,88,letter_logo[13]);
Lcd_Character_16X8(1,2,96,letter_logo[4]);
Lcd_Character_16X8(1,2,104,letter_logo[10]);
Lcd_Character_16X8(1,2,112,letter_logo[8]);
Lcd_Character_16X8(1,2,120,letter_logo[13]);
}
/******************************************************************************
* 函数名称: Lcd_welcome()
* 功能: 显示欢迎语
* 入口参数: 无
* 出口参数: 无
********************************************************************************/
void Lcd_tim()
{
Lcd_Character_16X8(1,4,32,letter_logo[0]);
Lcd_Character_16X8(1,4,40,letter_logo[0]);
Lcd_Character_16X8(1,4,48,letter_logo[10]);
Lcd_Character_16X8(1,4,56,letter_logo[0]);
Lcd_Character_16X8(1,4,64,letter_logo[0]);
Lcd_Character_16X8(1,4,72,letter_logo[10]);
Lcd_Character_16X8(1,4,80,letter_logo[0]);
Lcd_Character_16X8(1,4,88,letter_logo[0]);
}
/******************************************************************************
* 函数名称: Lcd_welcome()
* 功能: 显示欢迎语
* 入口参数: 无
* 出口参数: 无
********************************************************************************/
void Lcd_Show()
{
Lcd_dsgt();
Lcd_tim();
}
/*******************************************************************************
* 名称: Lcd_Temperature( uchar * temperture )
* 功能: 显示温度
* 入口参数: 温度
* 出口参数: 无
*********************************************************************************/
void Lcd_Temperture( uchar * temperature )
{
uchar temp;
uchar sign=0; //定义符号标志位,revised by iam3i
if(temperature[1]>127)
{
sign=1;
temperature[0]=(~temperature[0]+1);
if((temperature[0])>=0xff)
temperature[1]=(~temperature[1])+1;
else
temperature[1]=~temperature[1];
}
else
sign=0;
switch( * temperature & 0x0f ) //查表 精确到 0.1 °C
{
case 0x00: temp = 0; break;
case 0x01: temp = 1; break;
case 0x02: temp = 1; break;
case 0x03: temp = 2; break;
case 0x04: temp = 2; break;
case 0x05: temp = 3; break;
case 0x06: temp = 4; break;
case 0x07: temp = 4; break;
case 0x08: temp = 5; break;
case 0x09: temp = 6; break;
case 0x0a: temp = 6; break;
case 0x0b: temp = 7; break;
case 0x0c: temp = 8; break;
case 0x0d: temp = 8; break;
case 0x0e: temp = 9; break;
case 0x0f: temp = 9; break;
default: break;
}
Lcd_Character_16X8( 1, 6, 56, letter_logo[12] );
Lcd_Character_16X8( 1, 6, 64, letter_logo[10] );
Lcd_Character_16X8( 1, 6, 120, temperture_logo[2] ); // C
Lcd_Character_16X8( 1, 6, 112, temperture_logo[1] ); // °
Lcd_Character_16X8( 1, 6, 104, letter_logo[temp] ); // 小数位
Lcd_Character_16X8( 1, 6, 96, temperture_logo[0] ); // .
temp = ( * temperature ) >> 4;
temperature++;
temp |= ( * temperature ) << 4;
Lcd_Character_16X8( 1, 6, 88, letter_logo[temp% 10 ] ); //个位
if (temp/10==0 )
Lcd_Character_16X8(1,6,80,letter_logo[13]); //十位为0,不显示
else
Lcd_Character_16X8( 1, 6, 80, letter_logo[temp/10 ] ); //十位,该程序不能正确显示大于99.9度的温度
if(sign==1)
Lcd_Character_16X8(1,6,72,letter_logo[11]);
else
Lcd_Character_16X8(1,6,72,letter_logo[13]);
}
/********************************************************************************
* 名称: void Week_convert( uchar * clock_time )
* 功能: 输入BCD阳历数据;输出BCD星期
* 入口参数:
* 出口参数:
* 说明: 算法: ( 日期 + 年份 + 所过闰年 + 月校正 ) / 7 的余数就是星期 如果是闰年又不到 3 月份上述之和 要减一天 再
********************************************************************************/
void Week_Convert( bit c, uchar * clock_time )
{
uchar year, month, day; //定义 年 月 天
uchar temp;
clock_time += 3; //指向日
day = ( * clock_time >> 4 ) * 10 + ( *clock_time & 0x0f ); //BCD转换十进制
clock_time ++; //指向月
month = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f );
clock_time ++; //指向年
year = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f );
if( c == 0 ) //如果为21世纪,年份数加100
year += 100;
temp = year / 4; //所过闰年数只算1900年之后的
temp = year + temp;
temp = temp % 0x07; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
temp = temp + day + table_week[ month - 1 ];
if( ( year % 4 == 0 ) && ( month <3 ) )
temp -=1;
Lcd_Week( temp % 7 );
}
/********************************************************************************/
#endif
复制代码
上面的是LCD12864函数,怎么能在12864中把这段1602里的代码实现?
void write_sfm(uint8_t add,uint8_t date) //时间写入函数
{
uint8_t shiw,gew;
shiw=date/10;
gew=date%10;
lcd_wcmd(0x80+0x40+add);
lcd_wdat(0x30+shiw);
lcd_wdat(0x30+gew);
}
void write_dsgt(uint8_t add,uint8_t date) //药量写入函数
{
lcd_wcmd(0x80+0x40+add);
lcd_wdat(0x30+date);
}
复制代码
if(s3num==2)
{
shi++;
if(shi==24)
shi=0;
write_sfm(8,shi);
lcd_wcmd(0x80+0x40+8);
}
if(s3num==3)
{
dsg1++;
if(dsg1==10)
dsg1=0;
write_dsgt(0,dsg1);
lcd_wcmd(0x80+0x40+0);
}
if(s3num==4)
{
dsg2++;
if(dsg2==10)
dsg2=0;
write_dsgt(2,dsg2);
lcd_wcmd(0x80+0x40+2);
}
if(s3num==5)
{
dsg3++;
if(dsg3==10)
dsg3=0;
write_dsgt(4,dsg3);
lcd_wcmd(0x80+0x40+4);
}
if(s3num==6)
{
dsg4++;
if(dsg4==10)
dsg4=0;
write_dsgt(6,dsg4);
lcd_wcmd(0x80+0x40+6);
复制代码
sheji.rar
2022-5-7 21:54 上传
点击文件名下载附件
42.98 KB, 下载次数: 9
1602程序
作者:
人人学会单片机
时间:
2022-5-7 23:49
LCD1602和LCD12864 功能寄存器地址 都是一样的,唯一的区别就是存储地址不一样。改改就行了。
正常工作的LCD1602程序,也可以直接在LCD12864显示几个文字或者乱码。
作者:
hy47566398
时间:
2022-5-8 04:39
//行控制码1602&1604通用
#define LINE0 0x80
#define LINE1 0xC0
#define LINE2 0x90
#define LINE3 0xD0
作者:
man1234567
时间:
2022-5-8 09:37
两者相同点就是都用点阵来显示,不同点是1602直接调字库显示而12864就是调也要打点。
所以,先读懂代码,然后改起来就很容易了。
作者:
angmall
时间:
2022-5-8 11:11
LCD12864在市面上主要分为两种,一种是采用st7920控制器驱动的,有PSB,它一般带有中文字库字模,价格略高一点。另一种是采用KS0108控制器驱动,有CS1和CS2,它只是点阵模式,不带字库。
带中文字库的,采用st7920控制器驱动的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式驱动
你发的程序是采用KS0108控制器驱动,不带字库
如果不带字库,为了显示一个汉字,就需要传送一大批点阵数据。
如果带字库,显示一个汉字,仅仅需要传送两个字节汉字内码。
这种情况下,速度就很快。
作者:
xiaoyuxinke
时间:
2022-5-8 14:28
//LCD12864行地址地址定义 *
//第一行地址:80H 81H 82H 83H 84H 85H 86H 87H *
//第二行地址:90H 91H 92H 93H 94H 95H 96H 97H *
//第三行地址:88H 89H 8AH 8BH 8CH 8DH 8EH 8FH *
//第四行地址:98H 99H 9AH 9BH 9CH 9DH 9EH 9FH *
这个是LCD12864的显示地址,照这个修改即可,另LCD1602显示的时候只能显示数字和英文字母以及西文字符和一些图标,但LCD12864可以显示128*64的图片,如果带字库的还可以直接显示汉字.
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1