/* LCD 型号:HD44780 */
/*打印机型号: EPSON M311 */
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定义8255I/O端口地址
#define PCC8255 XBYTE[0x007f] //8255命令口地址
#define PC8255 XBYTE[0x007e] //8255的PC口地址
#define PB8255 XBYTE[0x007d] //8255的PC口地址
#define PA8255 XBYTE[0x007c] //8255的PC口地址
sfr RPCTL = 0xD8;
sbit RPCTL_5 = RPCTL^5;
sbit LS164A = P2^5;
sbit LS164cp = P2^6;
sbit Print_busy = P3^3;
sbit IC_RST = P1^1;
sbit IC_CLK = P1^0;
sbit IC_IO = P1^2;
sbit IC_PGM = P3^2;
uchar code table1[16]="FEDCBA9870123456";
uchar code table2[16]="0000123456789ABC";
void INIT_8255(void); /*初始化8255*/
void LcdInit(void); /* LCD初始化函数 */
void LcdCmd(uchar); /* LCD控制命令函数 */
void LcdData(uchar); /* LCD数据输入函数 */
void LcdClr(void); /* LCD清屏函数 */
void LcdStr(uchar *); /* 显示字符串函数 */
void LcdDisp(uchar x,uchar d);
void Delay_msec(uint x); /* 延时函数 */
uchar Getkey(void); /*键盘函数 */
void PrintInit(void); /*打印初始化函数*/
void PrintData (uchar d); /*打印函数*/
void PrintString(uchar *p); //打印字符串
void LcdDisp(uchar x,uchar d) //指定位置显示字符 x:LCD位置 d:字符
{
if(x<9)
{
LcdCmd(0x80 + x);
LcdData(d);
}
else
{
LcdCmd(0xc0 + x);
LcdData(d);
}
}
void LcdStr(uchar *p) /* 显示字符串函数 */
{
data uchar i;
LcdCmd(0x80); //设置显示数据RAM
for (i=0;i<=7;i++)
{
LcdData(*p); /* char of LCM */
p++;
}
LcdCmd(0xc0); //设置显示数据RAM
for (i=0;i<=7;i++)
{
LcdData(*p); /* char of LCM */
p++;
}
}
void LcdClr() /* LCD清屏函数?-----通过送0x20清屏*/
{
data uchar i;
LcdCmd(0x80); //设置显示数据RAM
for (i=0;i<=7;i++)
LcdData(0x20); /* char of LCM */
LcdCmd(0xc0); //设置显示数据RAM
for (i=0;i<=7;i++)
LcdData(0x20); /* char of LCM */
}
void LcdClr1(void) /* LCD清屏函数?-----通过控制命令清屏*/
{
LcdCmd(0x01);
}
void LcdCmd(uchar c) /* LCD控制命令函数 */
{
RPCTL_5 = 1;
Delay_msec(1); //延时1ms (1000us)
PCC8255 = 0x00;
PCC8255 = 0x02;
PB8255 = c ;
PCC8255 = 0x05;
PCC8255 = 0x04;
Delay_msec(1); //延时1ms (1000us)
RPCTL_5 = 0;
}
void LcdData(uchar c) /* LCD数据输入函数 */
{
RPCTL_5 = 1;
Delay_msec(1); //延时1ms (1000us)
PCC8255 = 0x01;
PCC8255 = 0x02;
PB8255 = c;
PCC8255 = 0x05;
PCC8255 = 0x04;
Delay_msec(1); //延时1ms (1000us)
RPCTL_5 = 0;
}
void LcdInit() /* LCD初始化函数 */
{
Delay_msec(41); //延时41ms
LcdCmd(0x3c); //设置字符参数
LcdCmd(0x08); //设置显示开/关
LcdCmd(0x01); //清除显示
Delay_msec(41); //延时41ms
LcdCmd(0x06); //设置输入方式
LcdCmd(0x10); //设置显示光标移位
LcdCmd(0x0c); //设置显示开/关
}
void Delay_msec(uint x) /* 延时函数 */
{
data uchar i;
do
{
for (i=0;i<125;i++) /*延时 8us x 125 = 1ms */
;
}
while((x--)!=0);
}
/*-----------------------------------------------------------------*/
void INIT_8255(void) /*8255 初始化 */
{
RPCTL_5 = 1;
_nop_ ();
PCC8255 = 0x80;
_nop_ ();
RPCTL_5 = 0;
}
/*---------------------------------------------------------------*/
uchar Getkey(void)
{
uchar i,lie,keycode,flag;
flag=0;
LS164A=0; //向74Ls164移入8个0
for (i=0;i<8;i++)
{
LS164cp=0;
LS164cp=1;
}
while((P2&0x1f)==0x1f); //是否有键闭合?
Delay_msec(100); //延时10ms (10,000us)
while((P2&0x1f)==0x1f); //是否有键闭合?
LS164A = 1; //向74Ls164移入8个1
for (i=0;i<8;i++)
{
LS164cp = 0;
LS164cp = 1;
}
i=0;
lie = 0; //lie --列号
while(i<8)
{
LS164A = 0; //向74Ls164移入0
LS164cp = 0;
LS164cp = 1;
if((P2&0x01)==0)
{
keycode=0x00 + lie; /*行基数 = 0x00 */
break;
}
else if((P2&0x02)==0)
{
keycode=0x08 + lie; /*行基数 = 0x08 */
break;
}
else if((P2&0x04)==0)
{
keycode=0x10 + lie; /*行基数 = 0x10 */
break;
}
else if((P2&0x08)==0)
{
keycode=0x18 + lie; /*行基数 = 0x18 */
break;
}
else if((P2&0x10)==0)
{
keycode=0x20 + lie; /*行基数 = 0x20 */
break;
}
else
{ i++;
lie = lie + 1; /*列号 + 1 ---下一列*/
if(i==8)
flag=1;
}
}
if(flag==0)
{
LS164A=0;
for (i=0;i<8;i++)
{
LS164cp=0;
LS164cp=1;
}
while((P2&0x1f)!=0x1f); /*按键是否释放*/
return(keycode); /*返回键码 */
}
else
return -1;
}
/*-------------------------------------------------------------------*/
void PrintData (uchar d) /*打印函数*/
{
while (Print_busy); //Busy=1,循环
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
while (Print_busy); //Busy=1,循环
RPCTL_5 = 1;
PA8255 = d;
PCC8255 = 0x08;
PCC8255 = 0x09;
RPCTL_5 = 0 ;
}
void PrintString(uchar *p) //打印字符串
{
while(*p!='\0')
{
PrintData(*p);
p++;
}
PrintData(0x0a);
}
/*-----------------------------------------------------------------*/
void PrintInit(void) /*打印初始化函数*/
{
uchar i;
uchar code Prninitdata[12] ={0x01,0x1b,0x40,0x1b,0x55,0x25,0x1c,0x26,
0x1b,0x33,0x02};
for (i=0;i<11;i++)
PrintData(Prninitdata[i]);
}
/*-----------------------------------------------------------------*/
void main()
{
data uchar key;
uchar code prn0[]=" 电 脑 中 心";
uchar code prn1[]="赵俊杰";
/*************************************************************/
Delay_msec(41); //延时41ms
Delay_msec(41); //延时41ms
Delay_msec(41); //延时41ms
Delay_msec(41); //延时41ms
INIT_8255(); /*8255初始化函数 */
LcdInit(); /* LCD初始化函数 */
PrintInit(); /*打印初始化函数
/*************************************************************/
PrintString(prn0);
Delay_msec(400); //延时400ms
PrintString(prn1);
LcdStr(table1);
Getkey();
LcdClr1();
key = Getkey()+0x30;
LcdDisp(1,key);
Getkey();
LcdStr(table2);
Getkey();
LcdClr();
}
..
评论0