for(j=0;j<120;j++);}
unsignedcharget_key(void)
{unsignedcharkey_code;
unsignedcharmask=0x01,low_num=0,i;
for(i=0;i<4;i++)
{if(!
(mask&P1))low_num++;
mask=mask<<1;}//mask,low_num都必须设为局部变量,不能是全局变量
hextodec1(low_num);//显示按键按下数
if(low_num==1){if(P10==0)key_code=0;
elseif(P11==0)key_code=1;
elseif(P12==0)key_code=2;
elseif(P13==0)key_code=3;}
elsekey_code=0xff;
return(key_code);}
main()
{unsignedinti;
LCD_Initial();
GotoXY(2,0);
Print("1602LCDDisp");
EA=1;EX0=1;IT0=1,EX1=1;IT1=1;
TMOD=0x05;
while
(1)
{key=get_key();
hextodec(key);
for(i=0;i<5;i++)dispbuf[i]=a[i];
dispbuf[5]='\0';
GotoXY(1,1);
Print(&dispbuf[0]);
for(i=0;i<5;i++)dispbuf1[i]=b[i];
dispbuf1[5]='\0';
GotoXY(10,1);
Print(&dispbuf1[0]);
Delay1ms(100);}
程序4.1LCD1602头文件
#ifndefLCD_CHAR_1602_2005_4_9
#defineLCD_CHAR_1602_2005_4_9
#include
sbitLcdRs=P2^0;//口定义
sbitLcdRw=P2^1;
sbitLcdEn=P2^2;
sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
unsignedcharLCD_Wait(void)//内部等待函数
{LcdRs=0;
LcdRw=1;_nop_();
LcdEn=1;_nop_();
LcdEn=0;
returnDBPort;
}
//向LCD写入命令或数据
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput)
{
LcdEn=0;
LcdRs=style;
LcdRw=0;_nop_();
DBPort=input;_nop_();//注意顺序
LcdEn=1;_nop_();//注意顺序
LcdEn=0;_nop_();
LCD_Wait();
}
//设置显示模式
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
{
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
}
//设置输入模式************************************************************
#defineLCD_AC_UP0x02
#defineLCD_AC_DOWN0x00//default
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//default
voidLCD_SetInput(unsignedcharInputMode)
{
LCD_Write(LCD_COMMAND,0x04|InputMode);
}
//初始化LCD
voidLCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动
}
//*******
voidGotoXY(unsignedcharx,unsignedchary)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
voidPrint(unsignedchar*str)
{
while(*str!
='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序5按键直接输入共阴
#include
#include
unsignedcharlow_num,ledk[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
unsignedcharget_key(void)
{unsignedcharkey_code;
if(P10==0)key_code=0;
elseif(P11==0)key_code=1;
elseif(P12==0)key_code=2;
elseif(P13==0)key_code=3;
elsekey_code=0xff;//当没有按键按下
return(key_code);}
voidkey_func(key)
{switch(key)
{case0:
P2=ledk[0];break;
case1:
P2=ledk[1];break;
case2:
P2=ledk[2];break;
case3:
P2=ledk[3];break;
default:
P2=ledk[10];break;}//当没有按键按下,不显示
}
voidmain(void)
{unsignedcharkey;
while
(1)
{key=get_key();
key_func(key);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序6按键_74165
#include
#include
sbitsh_ld=P1^0;sbitclk=P1^1;sbitin=P1^2;
unsignedchardisp[8],xx;
voiddelay(unsignedintn)
{unsignedinti;
for(i=0;i;}
hextobin(xx)
{disp[0]=xx/128;
disp[1]=(xx%128)/64;
disp[2]=(xx%64)/32;
disp[3]=(xx%32)/16;
disp[4]=(xx%16)/8;
disp[5]=(xx%8)/4;
disp[6]=(xx%4)/2;
disp[7]=xx%2;}
unsignedcharshift165()
{unsignedcharj=0,d=0;
sh_ld=1;delay
(2);sh_ld=0;delay
(2);sh_ld=1;
while(j<8)
{if(in==1)d=d*2+1;
elsed=d*2;
clk=0;clk=1;
j++;}
returnd;}
voidmain(void)
{unsignedchari;
lcd_init();
while
(1)
{xx=shift165();
hextobin(xx);
wr_comd(0xc4);
for(i=0;i<8;i++)wr_data(0x30+disp[i]);
delay(500);
}
}
程序6.1LCD头文件
sbite=P2^2;sbitrs=P2^0;sbitrw=P2^1;
voiddelay_ms(unsignedintt)
{unsignedintj;
for(;t>0;t--)
for(j=125;j>0;j--){;}}
voidwr_comd(unsignedcharx)
{P0=x;rs=0;rw=0;e=1;delay_ms
(1);e=0;}
voidwr_data(unsignedcharx)
{P0=x;rs=1;rw=0;e=1;delay_ms
(1);e=0;}
voidlcd_init(void)
{wr_comd(0x01);delay_ms(5);
wr_comd(0x38);delay_ms(5);wr_comd(0x38);delay_ms(5);
wr_comd(0x06);delay_ms(5);wr_comd(0x0c);}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序7点阵
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//unsignedcharcodea[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voiddelay(unsignedintn)
{unsignedinti,j;
for(i=0;ifor(j=0;jmain()
{unsignedinti,mask=0xfe,mask1=0x01;
while
(1)
{for(i=0;i<8;i++)
{P1=0XFF;P2=mask;
mask=_crol_(mask,1);
delay(200);}
for(i=0;i<8;i++)
{P2=0;P1=mask1;
mask1=_crol_(mask1,1);
delay(200);}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序8点阵_74595
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSDATA=P1^0;//串行数据输入
sbitSCLK=P1^1;//移位时钟脉冲
sbitRCK=P1^2;//输出锁存器控制脉冲
voiddelay(unsignedintn)
{unsignedinti,j;
for(i=0;ifor(j=0;jvoidshift(unsignedchard)
{unsignedcharj=0;
while(j<8)
{if((d&0x80)!
=0)SDATA=1;
elseSDATA=0;
SCLK=0;_nop_();SCLK=1;
d<<=1;j++;}}
voidOUT_595(void)
{RCK=0;_nop_();
RCK=1;_nop_();//上升沿将数据送到输出锁存器
RCK=0;}
main()
{uchari,mask=0xfe,mask1=0x01;
while
(1)
{for(i=0;i<8;i++)
{shift(0xff);
OUT_595();
P2=mask;
mask=_crol_(mask,1);
delay(100);}
for(i=0;i<