📄 lcd__.c
字号:
#include<mega128.h>
#include<string.h>
#include<ZIKU.h>
#define uchar unsigned char
#define uint unsigned int
#define DISP_ON 0x3f
#define DISP_OFF 0x3e
#define COL 0x40 //列地址
#define PAGE 0xb8 //行地址
#define START_LINE 0xc0
#define LCD_BUS PORTA
#define LCD_BUS_DDR DDRA
#define LCD_CON PORTG
#define LCD_CON_DDR DDRG
#define KEY_BUS PORTC
#define KEY_BUS_DDR DDRC
#define E 0 //液晶使能
#define RW 1 //液晶读写
#define DI 2 //液晶数据指
#define CS1 3 // CS1
#define CS2 4 // CS2
#define SET(N) (LCD_CON|=1<<N)
#define CLR(N) (LCD_CON&=~(1<<N))
/********************函数声明*****************************/
void LCDDisplayChinese(uchar page,uchar col,flash uchar *str,uchar n);
void LCDDisplayEnglish(uchar page,uchar col,flash uchar *str,int n);
void LCDDisplayNumber( uchar page,uchar col,flash uchar *str,uchar n);
void LCDInit(void);
void LCDClear(void);
void delay(uint); //延时程序
void LCDWriteCmd(uchar); //写命令操作字
void LCDWriteData(uchar); //写数据
void PortInit(void);
int dd[4];
uchar PY_num;
uchar state=0;
flash uchar *p[]={PY_mb_ao,PY_mb_a,PY_mb_zai};
unsigned char T9PY(unsigned char *str)
{
unsigned int i,j=0;
unsigned char length;
length=strlen(str);
PY_num=0;
if(*str=='\0')return(0); //如果输入空字符返回0
while(j <400) //待查询记录条数
{
for(i=0;i<length;i++)
{
if(*(str+i)!=*(PY_number[j]+i)) //检查字符串匹配
break; //发现字母串不配,退出
}
if(i==length&&PY_num<=3)
{
dd[PY_num]=j;
PY_num++;
}
j++;
}
if (PY_num>0)
{
return(1);
}
else
{
return(0);
}
}
/**********************************************************
* KEY_BUS.7>---0----1----2----3
* | | | |
* KEY_BUS.6>---4----5----6----7
* | | | |
* KEY_BUS.5>---8----9----A----B
* | | | |
* KEY_BUS.4>---C----D----E----F
* | | | |
* KEY_BUS.3 KEY_BUS.2 KEY_BUS.1 KEY_BUS.0
*4*4键盘输入函数
*函数声明:uchar KeyInput();
*函数参数:无
*
*
*
**********************************************************/
uchar KeyInput()
{
uchar keycode=0xff,temp,i;
DDRC=0xf0;
KEY_BUS=0x0f;
temp=PINC&0x0f;
if(temp!=0x0f) //有键按下
{
delay(5);
KEY_BUS=0x7f;
for(i=0;i<4;i++)
{
temp=PINC&0x0f;
if(temp==0x07)
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
KEY_BUS=(KEY_BUS>>1)|0x80;
}
while((PINC&0x0f)!=0x0f) //等待释放
{
KEY_BUS=0x0f;
}
}
return keycode;
}
/**********************************************************
*
*延时函数
*函数声明:void delay(uint t);
*函数参数:t
*
*
**********************************************************/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/**********************************************************
*
*向LCD写命令函数
*函数声明:void LCDWriteCmd(uchar cmd);
*函数参数:cmd(具体命令查看数据手册)
*
*
**********************************************************/
void LCDWriteCmd(uchar cmd)
{
CLR(DI);
CLR(RW);
LCD_BUS=cmd;
SET(E);
CLR(E);
}
/**********************************************************
*
*向LCD写数据函数
*函数声明:void LCDWriteData(uchar dout);
*函数参数:dout为要向LCD写的数据
*
*
**********************************************************/
void LCDWriteData(uchar dout)
{
SET(DI);
CLR(RW);
LCD_BUS=dout;
SET(E);
CLR(E);
}
/**********************************************************
*
*初始化LCD屏函数
*函数声明:void LCDInit();
*函数参数:无
*函数作用:对LCD做初始化操作
*
**********************************************************/
void LCDInit()
{
delay(100);
SET(CS2); CLR(CS1);
delay(100);
LCDWriteCmd(DISP_OFF);
LCDWriteCmd(PAGE);
LCDWriteCmd(START_LINE);
LCDWriteCmd(COL);
LCDWriteCmd(DISP_ON);
CLR(CS2); SET(CS1);
delay(100);
LCDWriteCmd(DISP_OFF);
LCDWriteCmd(PAGE);
LCDWriteCmd(START_LINE);
LCDWriteCmd(COL);
LCDWriteCmd(DISP_ON);
}
/**********************************************************
*
*清屏函数
*函数声明:void LCDClear();
*函数参数:无
*函数作用:
*
**********************************************************/
void LCDClear()
{
uchar j,k;
SET(CS2);CLR(CS1);
for(k=0;k<8;k++)
{
LCDWriteCmd(PAGE+k);
LCDWriteCmd(COL); //列地址0
for(j=0;j<64;j++) //列地址自动加一
LCDWriteData(0x00);
}
CLR(CS2);SET(CS1);
for(k=0;k<8;k++)
{
LCDWriteCmd(PAGE+k);
LCDWriteCmd(COL); //列地址0
for(j=0;j<64;j++) //列地址自动加一
LCDWriteData(0x00);
}
}
/**********************************************************
*
*显示12*16点阵的汉字函数
*函数声明:void LCDDisplayChinese(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名,n为要显示第n个汉字点阵
*函数作用:
*
**********************************************************/
void LCDDisplayChinese(uchar page,uchar col,flash uchar *str,uchar n)
{
uchar i,j;
uchar num;
if(col<=52)
{
SET(CS2);CLR(CS1);
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=0;i<12;i++)
LCDWriteData(str[n*24+12*j+i]);
}
}
else if(col>=64)
{
CLR(CS2);SET(CS1);
col=col-64;
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=0;i<12;i++)
LCDWriteData(str[n*24+12*j+i]);
}
}
else if(col>52&&col<64) //处理跨屏幕的汉字书写的函数
{
num=64-col;
SET(CS2);CLR(CS1);
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=0;i<num;i++)
LCDWriteData(str[n*24+12*j+i]);
}
CLR(CS2);SET(CS1);
col=0;
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=num;i<12;i++)
LCDWriteData(str[n*24+12*j+i]);
}
}
}
/**************************************************************************************************
*
*显示6*16点阵的英文函数
*函数声明:void LCDDisplayEnglish(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名,n为要显示第n个英文点阵
*函数作用:
*
**************************************************************************************************/
void LCDDisplayEnglish(uchar page,uchar col,flash uchar *str,int n)
{
int i,j,num;
if(col<=58)
{
SET(CS2);CLR(CS1);
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=0;i<6;i++)
LCDWriteData(str[(n*12+6*j+i)]);
}
}
else if(col>=64)
{
CLR(CS2);SET(CS1);
col=col-64;
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=0;i<6;i++)
LCDWriteData(str[(n*12+6*j+i)]);
}
}
else if(col>58&&col<64)
{
num=64-col;
SET(CS2);CLR(CS1);
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=0;i<num;i++)
LCDWriteData(str[(n*12+6*j+i)]);
}
CLR(CS2);SET(CS1);
col=0;
for(j=0;j<2;j++)
{
LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
for(i=num;i<6;i++)
LCDWriteData(str[(n*12+6*j+i)]);
}
}
}
/**********************************************************
*显示小数字函数
*函数声明:void LCDDisplayNumber(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名
*函数作用:显示数字0-9
*
*
**********************************************************/
void LCDDisplayNumber(uchar page,uchar col,flash uchar *str,uchar n)
{
uchar i;
if(col<64)
{
SET(CS2);CLR(CS1);
}
else
{
CLR(CS2);SET(CS1);
col=col-64;
}
LCDWriteCmd(PAGE+page);LCDWriteCmd(COL+col);
for(i=0;i<5;i++)
LCDWriteData(str[5*n+i]);
}
void PortInit(void)
{
LCD_BUS_DDR=0xff;
LCD_CON_DDR=0xff;
}
void Welcome(void)
{
uchar i,ii;
uchar str[]="1234";
flash uchar *pp[]={PY_mb_nuo,PY_mb_za};
LCDClear();
for(i=0;i<6;i++)
LCDDisplayChinese(3,24+12*i,pp[1],i);
for(i=0;i<strlen(str);i++)
{
ii=str[i]-32;
//LCDDisplayEnglish(5,12+6*i,ASCII,ii);
}
while(1);
}
/**********************************************************
*
*主函数
*函数声明:void main (void) ;
*函数参数:无
*函数作用:实现一个有限的状态机
*
**********************************************************/
void main ()
{
uchar i;
int j;
uchar ss[]="948264";
PortInit();
LCDInit();
LCDClear();
//T9PY(ss);
for(i=0;i<6;i++)
LCDDisplayChinese(3,12*i,PY_mb[dd[0]],i);
//for(j=0;j<20;j++)
//LCDDisplayEnglish(5,6*j,ASCII,20+j);
while(1)
{
if(state==0) Welcome();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -