📄 lcdshow.c
字号:
/*文件描述:本文件包含了用HD44780显示相关的3个子程序 *
* 1. LCDShow:在LCD上显示32个字符 *
* 2. LcdInit:初始化Lcd *
* 3. Lcd_Command:执行给定的cmd命令 *
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[头文件]
#include "GP32C.h" //包含头文件
#define LcdData PTB //Lcd显示数据传送口
#define LcdData_D DDRB //数据口方向寄存器
#define LcdCtrl PTC //Lcd控制信号传送口
#define LcdCtrl_D DDRC //控制口方向寄存器
#define LcdRS 0 //Lcd寄存器选择信号PTC0
#define LcdRW 1 //读写信号接PTC1
#define LcdE 2 //Lcd使能信号接PTC2
//内部调用子程序
void Lcd_Command(unsigned char cmd); //命令执行子程序
void LcdInit(void); //Lcd初始化子程序
unsigned char flat=0;
extern unsigned char clockstr[8]; /*时间显示的LCD显示*/
extern unsigned char alartstr[5]; /*闹钟显示的LCD显示*/
extern unsigned char datestr[10]; /*日期显示LCD显示*/
unsigned char data[3];time[3];
/*LcdShow:在HD44780显示屏上显示数据--------------------*
*功能描述:在HD44780显示屏上显示str中的32个数据 *
*参 数:str:待显示数组 *
*返 回:无 *
*------------------以上为子程序说明-------------------*/
void lcdshow2(unsigned char str[])
{
unsigned char i;
LcdInit(); //调用Lcd初始化子程序
//显示第1行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000); //后7位为DDRAM地址0x00
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=0;i<16;i++) //逐个显示
Lcd_Command(str[i]);
//显示第2行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b11000000); //后7位为DDRAM地址0x40
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=16;i<32;i++) //逐个显示
Lcd_Command(str[i]);
}
void lcdshow(unsigned char strl1[],unsigned char strl2[])
{
unsigned char i;
LcdInit(); //调用Lcd初始化子程序
//显示第1行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000011); //后7位为DDRAM地址0x03
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=0;i<16;i++) //逐个显示
Lcd_Command(strl1[i]);
//显示第2行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b11000100); //后7位为DDRAM地址0x44
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=16;i<32;i++) //逐个显示
Lcd_Command(strl2[i]);
}
void lcdshow1(unsigned char x,unsigned char y,unsigned char data)
{
unsigned char i;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000|(x*0x40+y)); //DDRAM地址
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(data);
}
void guangbiao(unsigned char x,unsigned char y)
{
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000|(x*0x40+y)); //DDRAM地址 0x03
Lcd_Command(0b00001111);
}
/*LcdInit:初始化Lcd------------------------------------*
*功 能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1 *
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
void LcdInit(void)
{
unsigned char i;
LcdData_D=0b11111111; //数据口为输出
LcdCtrl_D|=(1<<LcdE); //控制口低三位为输出
LcdCtrl_D|=(1<<LcdRS);
LcdCtrl_D|=(1<<LcdRW);
LcdCtrl|=(1<<LcdE); //E=1
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00111000); //8位数据接口,2行,5*7点阵
Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
Lcd_Command(0b00000001); //清屏
for(i=0;i<250;i++); //延时>1.6ms
for(i=0;i<250;i++);
Lcd_Command(0b00010100); //光标右移一个字符位,AC自
// 动加1 (是否错误?)
Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
}
/*Lcd_Command:执行给定的cmd命令------------------------*
*功 能:执行给定的cmd命令,且延时 *
*参 数:cmd:待执行的命令 *
*返 回:无 *
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
{
unsigned char i;
for (i=0;i<20;i++); //等待>40us
LcdData=cmd; //把指令码送到Lcd数据传送口
LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
asm("NOP");
asm("NOP");
asm("NOP");
LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
for (i=0;i<20;i++); //等待>40us
}
void left(void) ////进入左移时间模式
{
if(flat>10)
{
flat--;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00010000); //后7位为DDRAM地址0x10
}
else if(flat==10)
{
flat--;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10001100); //后7位为DDRAM地址0x4c
}
else if(flat>0)
{
flat--;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00010000); //后7位为DDRAM地址0x10
}
Lcd_Command(0b00001111); //开显示,开光标显示,闪烁
}
void right(void) ////进入右移时间模式
{
if(flat<9)
{
flat++;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00010100); //
}
else if(flat==9)
{
flat++;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b11000100); //后7位为DDRAM地址0x44
}
else if(flat<17)
{
flat++;
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00010100); //后7位为DDRAM地址0x03
}
}
void down(void) ////进入左移时间模
{
unsigned char i,j;
j=flat;
i=(unsigned char)datestr[j]-0x30;
i++;
datestr[j]=(unsigned char)i+0x30;
if(j<=3)data[2]=data[2]-10^(3-j);
if(j>=5&&j<=6)data[1]=data[1]-10^(j-5);
if(j>=8&&j<=9)data[0]=data[0]-10^(j-8);
if(j>=10&&j<=11)time[2]=time[2]-10^(j-10);
if(j>=13&&j<=14)time[1]=time[1]-10^(j-13);
if(j>=15&&j<=16)time[0]=time[0]-10^(j-15);
}
void up(void) ////进入右移时间模式
{
//
unsigned char i,j;
j=flat;
i=(unsigned char)datestr[j]-0x30;
i=i+1;
datestr[j]=(unsigned char)i+0x30;
if(j<=3)data[2]=data[2]+10^(3-j);
if(j>=5&&j<=6)data[1]=data[1]+10^(j-5);
if(j>=8&&j<=9)data[0]=data[0]+10^(j-8);
if(j>=10&&j<=11)time[2]=time[2]+10^(j-10);
if(j>=13&&j<=14)time[1]=time[1]+10^(j-13);
if(j>=15&&j<=16)time[0]=time[0]+10^(j-15);
lcdshow((unsigned char *)datestr,(unsigned char *)clockstr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -