大三的时候做的单片机课程设计源代码
STC89C52单片机,用的LCD1602液晶显示屏和4*4的矩阵键盘
功能大致就是选定9个按键进行a~z 0~9的输入,并能通过两个按键移动光标选择输入的位置。
本贴分享的是源代码
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD1602_DB P0
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^5;
-
- #define RS_CLR RS=0
- #define RS_SET RS=1
-
- #define RW_CLR RW=0
- #define RW_SET RW=1
-
- #define EN_CLR EN=0
- #define EN_SET EN=1
-
- #define DataPort P0
-
- uchar code table[]={'A','B','C'};
- uchar code table1[]={'D','E','F'}; //
- uchar code table2[]={'G','H','I'};
- uchar code table3[]={'J','K','L'};
- uchar code table4[]={'M','N','O'}; //
- uchar code table5[]={'P','Q','R'};
- uchar code table6[]={'S','T','U'};
- uchar code table7[]={'V','W','X'};
- uchar code table8[]={'Y','Z','!'};//
- unsigned char code KeyCode[] = { //4*4矩阵键盘按键编码
- 0xE7, 0xD7, 0xB7, 0x77, 0xEB, 0xDB, 0xBB, 0x7B,
- 0xED, 0xDD, 0xBD, 0x7D, 0xEE, 0xDE, 0xBE, 0x7E,
- };
- uchar num1,num2,num3,num4,num5,num6,num7,num8,num9,key=15;\
- char j,k;
- void light(uchar x,uchar y);
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
-
- void LCD_Write_Com(uchar com)
- {
- delayms(5);
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
-
-
- void LCD_Write_Data(uchar Data)
- {
- delayms(5);
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- delayms(5);
- }
- void light(uchar x,uchar y) //光标位置
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
-
- }
- void LCD_Write_Char(uchar x,uchar y,uchar Data) //LCD 写
- {
- light( x,y);
- LCD_Write_Data( Data);
- light(x, y);
- }
- void LCD_Init(void) //lcd初始化
- {
- LCD_Write_Com(0x38);
- delayms(5);
- LCD_Write_Com(0x38);
- delayms(5);
- LCD_Write_Com(0x38);
- delayms(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08);
- LCD_Write_Com(0x01);
- LCD_Write_Com(0x06);
- delayms(5);
- LCD_Write_Com(0x0C);
- LCD_Write_Com(0x0F); //显示光标以及光标闪烁
- }
-
- void ScanKeyboard() //键盘扫描程序
- {
- unsigned char scan1,scan2,keyboard;
- unsigned char i;
- P2 = 0xf0; //4条行线输出低电平,4条列线作为输出
- scan1 = P2; //读取列线状态
- if((scan1&0xf0)!=0xf0) //判断是否有键按下
- {
- delayms(10); //延时去抖
- scan1 = P2; //再次读取列线状态
- if((scan1&0xf0)!=0xf0) //再次判断是否有键按下
- {
- P2 = 0x0f; //4条列线输出低电平,4条行线作为输出
- scan2 = P2; //读取行线状态
- keyboard = scan1 | scan2; //组合键值
- while((P2&0x0f)!=0x0f); //等待按键释放
- for(i=0;i<=15;i++) //根据按键编码得出按键编号
- {
- if(keyboard == KeyCode[i])//判断对应的键值 以及按下次数
- {
- key = i;
- switch(key)
- {
- case 0:num1++;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
- case 1:num2++;num1=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
- case 2:num3++;num1=0;num2=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
- case 4:num4++;num1=0;num2=0;num3=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
- case 5:num5++;num1=0;num2=0;num3=0;num4=0;num6=0;num7=0;num8=0;num9=0;break;
- case 6:num6++;num1=0;num2=0;num3=0;num4=0;num5=0;num7=0;num8=0;num9=0;break;
- case 8:num7++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num8=0;num9=0;break;
- case 9:num8++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num9=0;break;
- case 10:num9++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;break;
- case 15:k++;
- if(k==16)
- {
- k=0;j++;
- if(j==2)
- {
- j=0;
- }
- }
- light( k,j);break;
- case 7:k--;
- if(k==-1)
- {
- k=15;j++;
- if(j==2)
- {
- j=0;
- }
- }
- light( k,j);break;
- default:break;
- }
- }
- }
- }
- }
- }
-
- uchar jianzhi() //按下次数所显示的字母
- {
-
- switch(key)
- {
- case 0:return table[(num1-1)%3];break;
- case 1:return table1[(num2-1)%3];break;
- case 2:return table2[(num3-1)%3];break;
- case 4:return table3[(num4-1)%3];break;
- case 5:return table4[(num5-1)%3];break;
- case 6:return table5[(num6-1)%3];break;
- case 8:return table6[(num7-1)%3];break;
- case 9:return table7[(num8-1)%3];break;
- case 10:return table8[(num9-1)%3];break;
- default:return 0xff;break;
- }
- if(key==0||key==1||key==2||key==4||key==5||key==6||key==8||key==9||key==10) return table[key];
- else return 0xff;
-
-
-
- }
- void xianshi()
- {
- static uchar str;
- str=jianzhi();
- if(str!=0xff)
- {
- if((k==0)&&(j==0))
- LCD_Clear();
- LCD_Write_Char(0+k,0+j,str);
- key=15;
- }
-
-
- }
- void main()
- {
- LCD_Init(); //LCD1602初始化
- while(1)
- {
- ScanKeyboard(); //键盘扫描
- xianshi(); //显示所按下字母以及光标的移动
- }
- }
复制代码
所有资料51hei提供下载:
矩阵键盘模拟手机键盘.rar
(1.73 KB, 下载次数: 29)
|