|
大三的時(shí)候做的單片機(jī)課程設(shè)計(jì)源代碼
STC89C52單片機(jī),用的LCD1602液晶顯示屏和4*4的矩陣鍵盤
功能大致就是選定9個(gè)按鍵進(jìn)行a~z 0~9的輸入,并能通過兩個(gè)按鍵移動光標(biāo)選擇輸入的位置。
本貼分享的是源代碼
單片機(jī)源程序如下:
- #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) //光標(biāo)位置
- {
- 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); //顯示光標(biāo)以及光標(biāo)閃爍
- }
-
- void ScanKeyboard() //鍵盤掃描程序
- {
- unsigned char scan1,scan2,keyboard;
- unsigned char i;
- P2 = 0xf0; //4條行線輸出低電平,4條列線作為輸出
- scan1 = P2; //讀取列線狀態(tài)
- if((scan1&0xf0)!=0xf0) //判斷是否有鍵按下
- {
- delayms(10); //延時(shí)去抖
- scan1 = P2; //再次讀取列線狀態(tài)
- if((scan1&0xf0)!=0xf0) //再次判斷是否有鍵按下
- {
- P2 = 0x0f; //4條列線輸出低電平,4條行線作為輸出
- scan2 = P2; //讀取行線狀態(tài)
- keyboard = scan1 | scan2; //組合鍵值
- while((P2&0x0f)!=0x0f); //等待按鍵釋放
- for(i=0;i<=15;i++) //根據(jù)按鍵編碼得出按鍵編號
- {
- if(keyboard == KeyCode[i])//判斷對應(yīng)的鍵值 以及按下次數(shù)
- {
- 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() //按下次數(shù)所顯示的字母
- {
-
- 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(); //顯示所按下字母以及光標(biāo)的移動
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
矩陣鍵盤模擬手機(jī)鍵盤.rar
(1.73 KB, 下載次數(shù): 29)
2018-4-20 17:30 上傳
點(diǎn)擊文件名下載附件
C 文件 源代碼
|
評分
-
查看全部評分
|