?? 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初始化子程序
//在HD44780顯示屏上顯示一個字符子函數
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n);
unsigned char ChangeASCII(unsigned char x); //轉換數值x為對應的ASCII碼子函數
//外部變量
extern unsigned char time[14];
extern unsigned char alarm[14];
extern unsigned char Ttime[3];
extern int Tdate[3];
extern unsigned char Ttime2[3];
extern int Tdate2[3];
/*LcdshowCharacter:在HD44780顯示屏上顯示一個字符--------------------*
*功能描述:在HD44780顯示屏上第m行,第n列顯示字符str *
*參 數:str:待顯示字符 *
*返 回:無 *
*------------------以上為子程序說明-------------------*/
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n)
{
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,寫指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000|((m-1)*0x40+(n-1)));
LcdCtrl|=1<<LcdRS; //RS、R/W=10,寫數據到DDRAM中
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(str);
}
unsigned char ChangeASCII(unsigned char x) //轉換數值x為對應的ASCII碼
{
unsigned char y;
return y=x+0x30;
}
//顯示大小為n字符數組在第m行的子函數
void LcdShowString(unsigned char str[],unsigned char n,unsigned char m)
{
unsigned char i;
LcdInit();
for(i=0;i<n;i++)
{
LcdshowCharacter(str[i],m,(i+1));
}
}
void Lcdshow(unsigned char temp[]) //顯示日期時間子程序
{ unsigned char i;
LcdInit();
for(i=0;i<4;i++)
{
LcdshowCharacter(ChangeASCII(temp[i]),1,(i+4));
}
LcdshowCharacter('-',1,8);
LcdshowCharacter(ChangeASCII(temp[4]),1,9);
LcdshowCharacter(ChangeASCII(temp[5]),1,10);
LcdshowCharacter('-',1,11);
LcdshowCharacter(ChangeASCII(temp[6]),1,12);
LcdshowCharacter(ChangeASCII(temp[7]),1,13);
LcdshowCharacter(ChangeASCII(temp[8]),2,5);
LcdshowCharacter(ChangeASCII(temp[9]),2,6);
LcdshowCharacter(':',2,7);
LcdshowCharacter(ChangeASCII(temp[10]),2,8);
LcdshowCharacter(ChangeASCII(temp[11]),2,9);
LcdshowCharacter(':',2,10);
LcdshowCharacter(ChangeASCII(temp[12]),2,11);
LcdshowCharacter(ChangeASCII(temp[13]),2,12);
}
/*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(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 LcdShowCursor(unsigned char m,unsigned char n) //顯示光標在第m行,第n列
{
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,寫指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00001111);
Lcd_Command(0b10000000|((m-1)*0x40+(n-1)));
}
/*void LcdShowMenu(void) //顯示菜單
{
unsigned char temp[12]="1. Set Time";
unsigned char temp2[13]="2. Set Alarm";
unsigned char i;
LcdInit();
for(i=0;i<11;i++)
{
LcdshowCharacter(temp[i],1,(i+1));
}
for(i=0;i<12;i++)
{
LcdshowCharacter(temp2[i],2,(i+1));
}
}*/
//將輸入的鍵值傳送到相應位置的位
void Transmission(unsigned char Keyvalue,unsigned char temp[],unsigned char m,unsigned char n)
{
if(m==1) //在第一行
{
switch(n)
{
case 4:temp[0]=Keyvalue;break;
case 5:temp[1]=Keyvalue;break;
case 6:temp[2]=Keyvalue;break;
case 7:temp[3]=Keyvalue;break;
case 9:temp[4]=Keyvalue;break;
case 10:temp[5]=Keyvalue;break;
case 12:temp[6]=Keyvalue;break;
case 13:temp[7]=Keyvalue;break;
}
}
if(m==2) //在第二行
{
switch(n)
{
case 5:temp[8]=Keyvalue;break;
case 6:temp[9]=Keyvalue;break;
case 8:temp[10]=Keyvalue;break;
case 9:temp[11]=Keyvalue;break;
case 11:temp[12]=Keyvalue;break;
case 12:temp[13]=Keyvalue;break;
}
}
}
//判斷按下的鍵是否數字鍵
unsigned char Discriminant(unsigned char m)
{
if(m=='1'||m=='2'||m=='3'||m=='4'||m=='5'||m=='6'||m=='7'||m=='8'||m=='9'||m=='0')
return 1;
else return 0;
}
void Delay(void)
{ unsigned char u;
unsigned char v;
for(u=0;u<=250;u++)
for(v=0;v<=250;v++);
}
void Changetime(int temp1[],unsigned char temp2[]) //將數組temp1拆分存儲到數組temp2
{
time[0]=temp1[0]/1000;
time[1]=temp1[0]/100%10;
time[2]=temp1[0]/10%10;
time[3]=temp1[0]%10;
time[4]=temp1[1]/10;
time[5]=temp1[1]%10;
time[6]=temp1[2]/10;
time[7]=temp1[2]%10;
time[8]=temp2[0]/10;
time[9]=temp2[0]%10;
time[10]=temp2[1]/10;
time[11]=temp2[1]%10;
time[12]=temp2[2]/10;
time[13]=temp2[2]%10;
}
void Change(void) //將數組time組合存儲到數組Tdate
{
Tdate[0]=time[0]*1000+time[1]*100+time[2]*10+time[3];
Tdate[1]=time[4]*10+time[5];
Tdate[2]=time[6]*10+time[7];
Ttime[0]=time[8]*10+time[9];
Ttime[1]=time[10]*10+time[11];
Ttime[2]=time[12]*10+time[13];
}
void Change2(void) //將數組alarm組合存儲到數組Tdate2
{
Tdate2[0]=alarm[0]*1000+alarm[1]*100+alarm[2]*10+alarm[3];
Tdate2[1]=alarm[4]*10+alarm[5];
Tdate2[2]=alarm[6]*10+alarm[7];
Ttime2[0]=alarm[8]*10+alarm[9];
Ttime2[1]=alarm[10]*10+alarm[11];
Ttime2[2]=alarm[12]*10+alarm[13];
}
void Controle(void) //控制時鐘的日期時間合法
{
if(time[12]>5) time[12]=0;
if(time[10]>5) time[10]=0;
if(Ttime[0]>=20&&time[9]>=5) time[9]=0;
if(time[8]>2) time[8]=0;
if(Tdate[1]==2&&(Tdate[0]%4==0&&Tdate[0]%100!=0||Tdate[0]%400==0))
{ if(time[6]>2) time[6]=0;}
if(Tdate[1]==1||Tdate[1]==3||Tdate[1]==5||Tdate[1]==7||
Tdate[1]==8||Tdate[1]==10||Tdate[1]==12)
{ if(time[6]==3&&time[7]>1) time[7]=0;}
if(Tdate[1]==2||Tdate[1]==4||Tdate[1]==6||Tdate[1]==9||Tdate[1]==11)
{ if(time[6]==3&&time[7]>0) time[7]=0;}
if(time[6]>3) time[6]=0;
if(Tdate[1]>10&&time[5]>2) time[5]=0;
if(time[4]>1) time[4]=0;
if(time[6]>3) time[6]=0;
if(Tdate[1]>10&&time[5]>2) time[5]=0;
if(time[4]>1) time[4]=0;
}
void Controle2(void) //控制鬧鐘的日期時間合法
{
if(alarm[12]>5) alarm[12]=0;
if(alarm[10]>5) alarm[10]=0;
if(Ttime2[0]>=20&&alarm[9]>=5) alarm[9]=0;
if(alarm[8]>2) alarm[8]=0;
if(Tdate2[1]==2&&(Tdate2[0]%4==0&&Tdate2[0]%100!=0||Tdate2[0]%400==0))
{ if(alarm[6]>2) alarm[6]=0;}
if(Tdate2[1]==1||Tdate2[1]==3||Tdate2[1]==5||Tdate2[1]==7||
Tdate2[1]==8||Tdate2[1]==10||Tdate2[1]==12)
{ if(alarm[6]==3&&alarm[7]>1) alarm[7]=0;}
if(Tdate2[1]==2||Tdate2[1]==4||Tdate2[1]==6||Tdate2[1]==9||Tdate2[1]==11)
{ if(alarm[6]==3&&alarm[7]>0) alarm[7]=0;}
if(alarm[6]>3) alarm[6]=0;
if(Tdate2[1]>10&&alarm[5]>2) alarm[5]=0;
if(alarm[4]>1) alarm[4]=0;
if(alarm[6]>3) alarm[6]=0;
if(Tdate2[1]>10&&alarm[5]>2) alarm[5]=0;
if(alarm[4]>1) alarm[4]=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -