单片机1602LCD和4X4键盘相关c语言程序,共五个(驱动程序,字符串程序等)

源代码在线查看: 44矩阵键盘,第一排前三列是实现小时分钟秒的加.txt

软件大小: 6 K
上传用户: spy0207
关键词: 1602 LCD 4X4 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				//可以实现两种功能的切换,其他功能自行对照代码研究
				// 4*4矩阵键盘,第一排前三列是实现小时\分钟\秒的加.
				//第二排前三列是实现小时\分钟\秒的减.
				//当然还可以通过设置矩阵键盘的键值,来实现加\减\乘\除四则运算,
				//由数码管显示参与运算的数字以及最终的运算结果
				
				#include
				
				#include
				
				#include 
				
				#include
				
				#include
				
				#define uchar unsigned char
				
				#define uint unsigned int
				
				#define wc 0x8fff
				
				#define wd 0xdfff
				
				#define rc 0xbfff
				
				 
				
				void displayListChar(unsigned char X, unsigned char Y, uchar DData);
				
				uchar dispbuf[]={'0','1','2','3','4','5','6','7','8','9',':'}; 
				
				uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
				
				                            0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
				
				                               0xc6,0xa1,0x86,0x8e,0x00
				
				}; 
				
				 
				
				uchar second;
				
				uchar temp1;  
				
				uchar minute; 
				
				uchar hour; 
				
				uint tcnt,g; 
				
				uchar suanfa; 
				
				bit flag2;
				
				bit flag1=1;//////控制计算器还是液晶调整的状态灯
				
				 
				
				uint i=0,f,m,g,s,t;//    for里的计数值,用于循环
				
				// 用来标记按了什么,如+,-.*,或是/
				
				sbit P2_0=P2^0;// 定义P2.0口用来,当计算值超过15时,P2.0所对应的灯闪几下
				
				sbit P2_1=P2^1;// 定义P2.1口用来,当除数为0时,P2.1所对应的灯闪几下
				
				sbit P2_2=P2^2;
				
				sbit P2_3=P2^3;
				
				uint num[4]={0}; //用于记录外面输入的数字
				
				uint Tablenum;
				
				sbit P3_4=P3^4;
				
				sbit P3_5=P3^5;
				
				 
				
				void jieguo(void);
				
				void Settime(uchar verify);
				
				uchar kbscan(void);///键盘扫描
				
				void Show_Time(void);////显示时间
				
				void Settime(uchar verify);//verify 在这里为调整的意思
				
				uint transfor( uchar key1);
				
				 
				
				 
				
				void delay400ms(void) ;
				
				void delay200ms(void);
				
				void delay5ms(void); 
				
				void delay_1s(void);
				
				void dlms(void);
				
				 
				
				void dlms1(void)
				
				{    
				
				      uint g=20000;
				
				      while(--g);  //延时100mS钟
				
				}
				
				 
				
				 
				
				void clr(void) 
				
				{
				
				  i=0;
				
				  suanfa=0;
				
				  Tablenum=0;
				
				  for(f=0;f				
				   {
				
				     num[f]=0;
				
				   }
				
				   
				
				   P2_0=1;
				
				   P2_1=1;
				
				   P2_2=1;
				
				   P2_3=0;
				
				   P3_4=0;
				
				   P3_5=1;
				
				   P0=0xc0;
				
				   P3_5=0;
				
				}
				
				//***************************************以下单片机液晶显示****************************************************
				
				 
				
				void waitLcd()                     //just wait until 液晶不忙为止
				
				  {
				
				    char temp;
				
				    bit flag=1;
				
				    while(flag==1)
				
				    {
				
				       temp=XBYTE[rc];
				
				       if (temp>>7==0) flag=0;
				
				       P1=temp;
				
				    }
				
				      P1=0xff;
				
				  }
				
				//just wait until 液晶不忙为止
				
				void WriteCommand_Lcd(bit isCheck,char c)    
				
				  {
				
				    if (isCheck==1) waitLcd();
				
				     XBYTE[wc]=c;
				
				  }
				
				 
				
				void writedata(char c)
				
				{
				
				    waitLcd();
				
				    XBYTE[wd]=c;
				
				}
				
				 
				
				void LcdInit()
				
				  {
				
				    delay5ms();
				
				    delay5ms();
				   
				    delay5ms();
				
				    WriteCommand_Lcd(0,0x38); //三次显示模式设置,不检测忙信号
				
				    delay5ms();
				
				    WriteCommand_Lcd(0,0x38);
				
				    delay5ms(); 
				
				    WriteCommand_Lcd(0,0x38);
				
				    delay5ms();
				
				    WriteCommand_Lcd(1,0x38); //显示模式设置,开始要求每次检测忙信号,8位2行5*7
				
				    WriteCommand_Lcd(1,0x08); //关闭显示
				
				    WriteCommand_Lcd(1,0x01); //清显示
				
				    WriteCommand_Lcd(1,0x06); // 文字不动,光标右移
				
				    WriteCommand_Lcd(1,0x0C); // 显示开及光标设置
				
				  } 
				
				 
				
				 
				
				void displayListChar(unsigned char X, unsigned char Y, uchar DData)
				
				  { 
				
				 Y &= 0x1;
				
				 X &= 0xF; 
				
				 if (X 				
				   {
				
				    Y &= 0x1;
				
				 X &= 0xF; 
				
				 if (Y) X = 0x40; 
				
				 X = 0x80; 
				
				 WriteCommand_Lcd(0,X); 
				
				 writedata(dispbuf[DData]);
				
				
				   }
				
				 }
				
				//****************************************以上单片机液晶显示驱动*****************************************************
				
				//*****************************************************************************************************
				
				 
				
				//**********************************以下显示时间*****************************************************
				
				void Show_Time(void)
				
				{
				
				   displayListChar(0,0,hour/10);
				
				   displayListChar(1,0,hour%10);
				
				   displayListChar(2,0,10);
				
				   displayListChar(3,0,minute/10);
				
				   displayListChar(4,0,minute%10);
				
				   displayListChar(5,0,10);
				
				   displayListChar(6,0,second/10);
				
				   displayListChar(7,0,second%10);
				
				 } 
				
				//**********************************以上显示时间*****************************************************
				
				void main(void)
				
				{   
				
				    TMOD=0x02; //置自动重装载模式
				
				    TH0=0x06;   //设初值
				
				    TL0=0x06;  //设初值
				
				    TR0=1;     //开始计数
				
				    ET0=1;    //开定时器/计数器
				
				    EA=1;     //中断开
				
				    delay400ms();//启动等待,等LCM讲入工作状态
				
				    LcdInit();     //LCM初始化  
				
				       P3_4=0;
				
				       P2_0=1;
				
				       P2_1=1;
				
				       P2_2=0;
				
				    P2_3=1;
				
				    P3_5=1;
				
				       P0=0xc0;
				
				       P3_5=0;    
				
				    while(1)
				
				   {  
				
				       uchar key; 
				
				         key=kbscan();
				
				          dlms();
				
				         // 0(11100111  0xe7)         
				
				         ///*****************************以下是单片机液晶显示两种状态的切换********************
				
				         //**********************************************************************************************
				
				         if(key==0xe7)
				
				         {
				
				            dlms();
				
				            flag1=~flag1;
				
				            key=0x00;    
				
				               if(flag1==1)
				
				                {            
				
				                      P2_0=1;
				
				                P2_1=1;
				
				                P2_2=0;///液晶状态灯
				
				                P2_3=1;
				
				                }         
				
				                if(flag1==0)
				
				                {
				
				                  
				
				                  P2_0=1;
				
				                  P2_1=1;
				
				                  P2_2=1;
				
				                  P2_3=0;///计算器状态灯
				
				                }
				           dlms1();
				
				          }
				   }
				}
				//*****************************以上是单片机液晶显示两种状态的切换********************			

相关资源