//以下程序都是在VC++6.0上调试运行过的程序,没有错误,没有警告。//单片机是STC89C52RC,但是在所有的5152单片机上都是通用的。51只是一个学习的基础平台,你懂得。//程序在关键的位置添加了注释。//用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推//1111111111111111111111111111111111111111111111111111111111111111111//1111111111111111111111111111111111111111111111111111111111111111111/********************************************************************************实验名:矩阵键盘实验*使用的IO:数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3*实验效果:按矩阵键盘分别显示在数码管上面显示十六进制的0到F。*注意:*******************************************************************************/#includereg51.h#includelcd.hunsignedcharPuZh[]=PechinScience;/********************************************************************************函数名:main*函数功能:主函数*输入:无*输出:无*******************************************************************************/voidmain(void){unsignedchari;LcdInit();for(i=0;i16;i++){LcdWriteData(PuZh[i]);}while(1){}}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////下面是被调文件lcd.c的内容。#includelcd.h/********************************************************************************函数名:Lcd1602_Delay1ms*函数功能:延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b;for(;c0;c--){for(b=199;b0;b--){for(a=1;a0;a--);}}}/********************************************************************************函数名:LcdWriteCom*函数功能:向LCD写入一个字节的命令*输入:com*输出:无*******************************************************************************/#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时voidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能LCD1602_RS=0;//选择发送命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//放入命令Lcd1602_Delay1ms(1);//等待数据稳定LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}#elsevoidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能清零LCD1602_RS=0;//选择写入命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;//Lcd1602_Delay1ms(1);LCD1602_DATAPINS=com4;//发送低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/********************************************************************************函数名:LcdWriteData*函数功能:向LCD写入一个字节的数据*输入:dat*输出:无*******************************************************************************/#ifndefLCD1602_4PINSvoidLcdWriteData(uchardat)//写入数据{LCD1602_E=0;//使能清零LCD1602_RS=1;//选择输入数据LCD1602_RW=0;//选择写入LCD1602_DATAPINS=dat;//写入数据Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}#elsevoidLcdWriteData(uchardat)//写入数据{LCD1602_E=0;//使能清零LCD1602_RS=1;//选择写入数据LCD1602_RW=0;//选择写入LCD1602_DATAPINS=dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;LCD1602_DATAPINS=dat4;//写入低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/********************************************************************************函数名:LcdInit()*函数功能:初始化LCD屏*输入:无*输出:无*******************************************************************************/#ifndefLCD1602_4PINSvoidLcdInit()//LCD初始化子程序{LcdWriteCom(0x38);//开显示LcdWriteCom(0x0c);//开显示不显示光标LcdWriteCom(0x06);//写一个指针加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//设置数据指针起点}#elsevoidLcdInit()//LCD初始化子程序{LcdWriteCom(0x32);//将8位总线转为4位总线LcdWriteCom(0x28);//在四位线下的初始化LcdWriteCom(0x0c);//开显示不显示光标LcdWriteCom(0x06);//写一个指针加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//设置数据指针起点}#endif