1.實驗要求:
設計一個單片機監控的電話撥號鍵盤,將電話鍵盤中撥出的某一電話號碼,顯示在LCD顯示屏上。電話鍵盤共有12個鍵,除了“0”~ “9”10個數字鍵外,還有“*”鍵用于實現退格功能,即清除輸入的號碼;“#”鍵用于清除顯示屏上所有的數字顯示。還要求每按下一個鍵要發出聲響,以表示按下該鍵。
2.仿真實現說明:
本實驗在Proteus下按設計要求用P1口擴展了12個鍵盤,其中每個鍵盤所代表的含義已在Proteus下用文本注出。在LCD顯示中,第一行為設計者名,第二行開始顯示所撥的電話號碼,最多為16位(因為LCD第二行功能顯示16個字符)。
1.png (40.1 KB)
下載附件
2021-6-16 11:31 上傳
單片機源部分程序如下:完整仿真文件和c語言代碼請下載本文尾部的附件
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar keycode,DDram_value=0xc0;
- sbit rs=P2^0;
- sbit rw=P2^1;
- sbit e =P2^2;
- sbit speaker=P2^3;
- uchar code table[]={0x30,0x31,0x32,0x33,0x34,
- 0x35,0x36,0x37,0x38,0x39,0x20};
- uchar code table_designer[]=" HIT ZYG Design";
- void lcd_delay();
- void delay(uint n);
- void lcd_init(void);
- void lcd_busy(void);
- void lcd_wr_con(uchar c);
- void lcd_wr_data(uchar d);
- uchar checkkey(void);
- uchar keyscan(void);
- void main()
- {
- uchar num;
- lcd_init();
- lcd_wr_con(0x80);
- for(num=0;num<=14;num++)
- {
- lcd_wr_data(table_designer[num]);
- }
- while(1)
- {
- keycode=keyscan();
- if((keycode>=0)&&(keycode<=9))
- {
- lcd_wr_con(0x06);
- lcd_wr_con(DDram_value);
- lcd_wr_data(table[keycode]);
- DDram_value++;
- }
- else if(keycode==0x0a)
- {
- lcd_wr_con(0x04);
- DDram_value--;
- if(DDram_value<=0xc0)
- {
- DDram_value=0xc0;
- }
- else if(DDram_value>=0xcf)
- {
- DDram_value=0xcf;
- }
- lcd_wr_con(DDram_value);
- lcd_wr_data(table[10]);
- }
- else if(keycode==0x0b)
- {
- uchar i,j;
- j=0xc0;
- for(i=0;i<=15;i++)
- {
- lcd_wr_con(j);
- lcd_wr_data(table[10]);
- j++;
- }
- DDram_value=0xc0;
- }
- }
- }
- //液晶工作時的延時函數
- void lcd_delay()
- {
- uchar y;
- for(y=0;y<0xff;y++)
- {
- ;
- }
- }
- //液晶初始化
- void lcd_init(void)
- {
- lcd_wr_con(0x01);
- lcd_wr_con(0x38);
- lcd_wr_con(0x0c);
- lcd_wr_con(0x06);
- }
- // 判斷液晶忙或閑的程序
- void lcd_busy(void)
- {
- P0=0xff;
- rs=0;
- rw=1;
- e=1;
- e=0;
- while(P0&0x80)
- {
- e=0;
- e=1;
- }
- lcd_delay();
- }
- //向液晶控制口輸入命令的調用函數
- void lcd_wr_con(uchar c)
- {
- lcd_busy();
- e=0;
- rs=0;
- rw=0;
- e=1;
- P0=c;
- e=0;
- lcd_delay();
- }
- //向液晶寫數據的調用函數
- void lcd_wr_data(uchar d)
- {
- lcd_busy();
- e=0;
- rs=1;
- rw=0;
- e=1;
- P0=d;
- e=0;
- lcd_delay();
- }
- void delay(uint n)
- {
- uchar i;
- uint j;
- for(i=50;i>0;i--)
- for(j=n;j>0;j--);
- }
- //檢測鍵有無按下函數
- uchar checkkey(void)
- {
- uchar temp;
- P1=0xf0;
- temp=P1;
- temp=temp&0xf0;
- if(temp==0xf0)
- {
- return(0);
- }
- else
- {
- return(1);
- }
- }
- //鍵盤掃描函數,返回所按下的鍵盤號
- uchar keyscan(void)
- {
- uchar hanghao,liehao,keyvalue,buff;
- if(checkkey()==0)
- {
- return(0xff);//無鍵按下,返回0xff
- }
- else
- {
- uchar sound;
- for(sound=50;sound>0;sound--)
- {
- speaker=0;
- delay(1);
- speaker=1;
- delay(1);
- }
- P1=0x0f;
- buff=P1;
- if(buff==0x0e)
- {
- hanghao=0;
- }
- else if(buff==0x0d)
- {
- hanghao=3;
- }
- else if(buff==0x0b)
- {
- hanghao=6;
- }
- else if(buff==0x07)
- {
- hanghao=9;
- }
- P1=0xf0;
- buff=P1;
- if(buff==0xe0)
- {
- liehao=2;
- }
- else if(buff==0xd0)
- {
- liehao=1;
- }
- else if(buff==0xb0)
- {
- liehao=0;
- }
- keyvalue=hanghao+liehao;
- while(P1!=0xf0);
- return(keyvalue);
- }
- }
復制代碼 完整單片機代碼和proteus仿真文件
電話撥盤模擬c語言程序 仿真文件.zip
(58.61 KB, 售價: 3 E幣)
2020-2-1 15:56 上傳
點擊文件名下載附件
售價: 3 E幣 [記錄]
[ 購買]
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|