|
之前自己練習1602液晶顯示的成果,1602的驅動編寫和調用里面解釋很詳細了
結合我的解釋,仔細看我編程的結構和思路
慢慢的你會對1602的使用有所了解
自己專研下肯定會讓你收益頗豐,
發出來也是對自己學習的鼓勵吧!加油各位!
P]_0}3E~@7`O]3V`A@6DKWX.png (19.11 KB, 下載次數: 79)
下載附件
2018-6-27 23:13 上傳
TIM截圖20180627230656.png (32.35 KB, 下載次數: 77)
下載附件
2018-6-28 00:30 上傳
- /**************************************************/
- /*
- 1602 模擬顯示車輛速度、溫度、油量
- 1.歡迎語句 Welcome GXUST 第二行car system
- 2. place select 1 2 3 功能選項
- 3.輪流顯示1.speed
- 2.temperatuer
- 3.oil mass
-
- 我一直認為單片機是開放的,可以思考的,我做的這份
- 是個引子,讀者看懂了自然可以快速自己加入自己想顯示的字符。
- ***************************************************/
- #include<reg52.h>
- #include<stdio.h>
- #include<intrins.h>
- #define Data P0//數據端口
- #define GPIO_KEY P1 //鍵盤口
- sbit RS = P2^0; //Pin4
- sbit RW = P2^1; //Pin5
- sbit E = P2^2; //Pin6
- unsigned char KeyValue;
- unsigned char kk=0;
- char TimeNum[16]="Welcome GXUSt";
- char Test1[16]="car systen";
- char Test2[16]="place select 123";
- char speed[16]=" 1.speed";
- char temperatuer[16]=" 2.temperatuer";
- char oil[16]=" 3.oil mass"; /*這些是定義字符串,方便顯示調用*/
- void DelayUs(unsigned char us)//微秒級延時函數
- {
- unsigned char uscnt;
- uscnt=us>>1;
- while(--uscnt);
- }
- void DelayMs(unsigned int ms) //毫秒級延時函數
- {
- while(--ms)
- {
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- }
- }
- void WriteCommand(unsigned char c)//寫命令函數
- {
- DelayMs(5);//操作前短暫延時,保證信號穩定
- E=0; //使能清零
- RS=0; //選擇寫命令
- RW=0; //選擇寫入
- // _nop_(); //延時一會
- // E=1;
- Data=c; //送數
- DelayMs(1);
- E=1;
- DelayMs(5);//等待寫入完成
- E=0;
- }
- void WriteData(unsigned char c) //寫數據函數
- {
- DelayMs(5);//操作前短暫延時,保證信號穩定
- E=0;
- RS=1;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- RS=0;
- }
- void ShowChar(unsigned char pos,unsigned char c)//寫字符函數 哪個位置寫
- {
- unsigned char p;
- if (pos>=0x10)
- p=pos+0xb0; //是第二行則命令代碼高4位為0xc 從第二行開始寫
- else
- p=pos+0x80; //是第二行則命令代碼高4位為0x8 從第一行的POS開始寫
- WriteCommand (p);//寫命令
- WriteData (c);//寫數據
- }
- void lcd_sfm(unsigned char add,unsigned char date)//顯示位置和數據 在哪里add顯示 顯示數據date
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- WriteCommand(0x80+0x40+add);
- WriteData(0x30+shi);
- WriteData(0x30+ge);
- }
- void ShowString (unsigned char line,char *ptr)//寫字符串函數 line:行
- {
- unsigned char l,i;
- l=line<<4;//若line=0,則地址的高四位為0;若line=1.則地址的高四位為1 寫哪一行
- for (i=0;i<16;i++)
- ShowChar (l++,*(ptr+i));//循環顯示16個字符
- }
- void InitLcd()//初始化函數
- {
- DelayMs(15);
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x06); //顯示光標移動位置
- WriteCommand(0x0c); //顯示開及光標設置 不顯示光標
- WriteCommand(0x01); //顯示清屏
- // WriteCommand(0x80+0x10); //設定數據指針起始點
- }
- unsigned char keyscan() //鍵盤掃描函數
- {
- char a=0;
- GPIO_KEY=0x0f; //P1口值準備
- if(GPIO_KEY!=0x0f)
- {
- DelayMs(10); //延時消抖
- if(GPIO_KEY!=0x0f)//再次判斷
- {
- GPIO_KEY=0x0f; //再次裝值準備
- switch(GPIO_KEY) //測試行
- {
- case(0x07):KeyValue=0;break; //第一行
- case(0x0b):KeyValue=1;break; //第二行
- case(0x0d):KeyValue=2;break; //第三行
- case(0x0e):KeyValue=3;break; //第四行
- }
- GPIO_KEY=0xf0; //高四位賦1,判斷準備
- switch(GPIO_KEY) //測試行
- {
- case(0x70):KeyValue=KeyValue;break; //0-3
- case(0xb0):KeyValue=KeyValue+4;break; //4-7
- case(0xd0):KeyValue=KeyValue+8;break; //8-11
- case(0xe0):KeyValue=KeyValue+12;break; //12-15
- }
- while((GPIO_KEY!=0x0f)&&(a<20)) //判斷是否松手,假若沒有松手,一段延時后依舊判斷松手完成
- {
- DelayMs(5);
- a++;
- }
- a=0;
- }
- }
- return KeyValue;
- }
- void cjm() //初始界面
- {
- ShowString(1,Test2); //顯示plaace
- DelayMs(1000);
- WriteCommand(0x01); //顯示清屏
-
- ShowString(0,speed); //顯示speed
- DelayMs(1000);
- WriteCommand(0x01); //顯示清屏
-
- ShowString(0,temperatuer);//顯示temperatuer
- DelayMs(1000);
- WriteCommand(0x01); //顯示清屏
- ShowString(0,oil); //顯示oil
- DelayMs(1000);
- WriteCommand(0x01); //顯示清屏
- }
- void jin()//進入界面
- {
- DelayMs(15);//延時保證信號穩定
- ShowString(0,TimeNum); //寫字符串
- DelayMs(15);
- ShowString(1,Test1);//寫字符串
- DelayMs(2000);
- WriteCommand(0x01); //顯示清屏
- }
- void Intput0() //外部中斷
- {
- IT0=1; //跳變沿觸發
- EX0=1; //開外部中斷允許
- EA=1; //開總中斷
- }
- void main(void)//主函數
- {
-
- InitLcd(); //初始化
- jin(); //進入界面
- while(1)
- {
- kk=keyscan();
- cjm();
- }
- }
- void exit0() interrupt 0//中斷處理
- {
- if(kk==1)
- {
- kk=0;
- WriteCommand(0x01); //顯示清屏
- ShowString(0, "the speed is:");
- ShowString(1, " 0.return");
- DelayMs(2000);
- WriteCommand(0x01); //顯示清屏
- }
- if(kk==2)
- {
- kk=0;
- WriteCommand(0x01); //顯示清屏
- ShowString(0, "temperatuer is:");
- ShowString(1, " 0.return");
- DelayMs(2000);
- WriteCommand(0x01); //顯示清屏
- }
- if(kk==3)
- {
- kk=0;
- WriteCommand(0x01); //顯示清屏
- ShowString(0,"the oil is: ");
- ShowString(1, " 0.return");
- DelayMs(2000);
- WriteCommand(0x01); //顯示清屏
- }
- if(kk==0) //返回界面
- {
- WriteCommand(0x01); //顯示清屏
- cjm();
- jin();
- }
- kk=0;
- }
復制代碼
|
評分
-
查看全部評分
|